| From 2b5d451e172b5b3d25678c43997e65f85dc47026 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 21 Nov 2023 22:26:24 +0530 |
| Subject: octeontx2-pf: Fix ntuple rule creation to direct packet to VF with |
| higher Rx queue than its PF |
| |
| From: Suman Ghosh <sumang@marvell.com> |
| |
| [ Upstream commit 4aa1d8f89b10cdc25a231dabf808d8935e0b137a ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../marvell/octeontx2/nic/otx2_flows.c | 20 ++++++++++++++++++- |
| 1 file changed, 19 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c |
| index 934c199667b59..5c4a4d3557702 100644 |
| --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c |
| +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c |
| @@ -1069,6 +1069,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) { |
| @@ -1081,7 +1082,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)) |
| @@ -1163,6 +1178,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; |
| } |
| |
| -- |
| 2.42.0 |
| |