octeontx2-pf: Fix ntuple rule creation to direct packet to VF with higher Rx queue...
authorSuman Ghosh <sumang@marvell.com>
Tue, 21 Nov 2023 16:56:24 +0000 (22:26 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 23 Nov 2023 11:55:32 +0000 (12:55 +0100)
It is possible to add a ntuple rule which would like to direct packet to
a VF whose number of queues are greater/less than its PF's queue numbers.
For example a PF can have 2 Rx queues but a VF created on that PF can have
8 Rx queues. As of today, ntuple rule will reject rule because it is
checking the requested queue number against PF's number of Rx queues.
As a part of this fix if the action of a ntuple rule is to move a packet
to a VF's queue then the check is removed. Also, a debug information is
printed to aware user that it is user's responsibility to cross check if
the requested queue number on that VF is a valid one.

Fixes: f0a1913f8a6f ("octeontx2-pf: Add support for ethtool ntuple filters")
Signed-off-by: Suman Ghosh <sumang@marvell.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20231121165624.3664182-1-sumang@marvell.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c

index 4762dbe..97a71e9 100644 (file)
@@ -1088,6 +1088,7 @@ int otx2_add_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc)
        struct ethhdr *eth_hdr;
        bool new = false;
        int err = 0;
+       u64 vf_num;
        u32 ring;
 
        if (!flow_cfg->max_flows) {
@@ -1100,7 +1101,21 @@ int otx2_add_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc)
        if (!(pfvf->flags & OTX2_FLAG_NTUPLE_SUPPORT))
                return -ENOMEM;
 
-       if (ring >= pfvf->hw.rx_queues && fsp->ring_cookie != RX_CLS_FLOW_DISC)
+       /* Number of queues on a VF can be greater or less than
+        * the PF's queue. Hence no need to check for the
+        * queue count. Hence no need to check queue count if PF
+        * is installing for its VF. Below is the expected vf_num value
+        * based on the ethtool commands.
+        *
+        * e.g.
+        * 1. ethtool -U <netdev> ... action -1  ==> vf_num:255
+        * 2. ethtool -U <netdev> ... action <queue_num>  ==> vf_num:0
+        * 3. ethtool -U <netdev> ... vf <vf_idx> queue <queue_num>  ==>
+        *    vf_num:vf_idx+1
+        */
+       vf_num = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie);
+       if (!is_otx2_vf(pfvf->pcifunc) && !vf_num &&
+           ring >= pfvf->hw.rx_queues && fsp->ring_cookie != RX_CLS_FLOW_DISC)
                return -EINVAL;
 
        if (fsp->location >= otx2_get_maxflows(flow_cfg))
@@ -1182,6 +1197,9 @@ int otx2_add_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc)
                flow_cfg->nr_flows++;
        }
 
+       if (flow->is_vf)
+               netdev_info(pfvf->netdev,
+                           "Make sure that VF's queue number is within its queue limit\n");
        return 0;
 }