Commit 4aa1d8f8 authored by Suman Ghosh's avatar Suman Ghosh Committed by Paolo Abeni
Browse files

octeontx2-pf: Fix ntuple rule creation to direct packet to VF with higher Rx queue than its PF



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: f0a1913f ("octeontx2-pf: Add support for ethtool ntuple filters")
Signed-off-by: default avatarSuman Ghosh <sumang@marvell.com>
Reviewed-by: default avatarWojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20231121165624.3664182-1-sumang@marvell.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 99360d96
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -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;
}