[dpdk-stable] [PATCH 18.11 10/19] net/bnxt: fix flow flush handling
Somnath Kotur
somnath.kotur at broadcom.com
Wed Dec 18 07:24:02 CET 2019
From: Ajit Khaparde <ajit.khaparde at broadcom.com>
We are not freeing all the flows when a flow_flush is called.
Iterate through all the flows belonging to all the VNICs in use and
free the filters.
Fixes: 4ace85a7da25 ("net/bnxt: allocate rings and groups")
Cc: stable at dpdk.org
Signed-off-by: Ajit Khaparde <ajit.khaparde at broadcom.com>
Reviewed-by: Rahul Gupta <rahul.gupta at broadcom.com>
Reviewed-by: Venkat Duvvuru <venkatkumar.duvvuru at broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil at broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur at broadcom.com>
---
drivers/net/bnxt/bnxt_flow.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c
index 1df1890..aca5f38 100644
--- a/drivers/net/bnxt/bnxt_flow.c
+++ b/drivers/net/bnxt/bnxt_flow.c
@@ -1133,6 +1133,7 @@ static int
bnxt_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
{
struct bnxt *bp = dev->data->dev_private;
+ struct bnxt_filter_info *filter = NULL;
struct bnxt_vnic_info *vnic;
struct rte_flow *flow;
unsigned int i;
@@ -1140,14 +1141,20 @@ bnxt_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
for (i = 0; i < bp->nr_vnics; i++) {
vnic = &bp->vnic_info[i];
- STAILQ_FOREACH(flow, &vnic->flow_list, next) {
- struct bnxt_filter_info *filter = flow->filter;
+ if (vnic && vnic->fw_vnic_id == (uint16_t)-1)
+ continue;
+
+ while (!STAILQ_EMPTY(&vnic->flow_list)) {
+ flow = STAILQ_FIRST(&vnic->flow_list);
+ filter = flow->filter;
if (filter->filter_type == HWRM_CFA_EM_FILTER)
ret = bnxt_hwrm_clear_em_filter(bp, filter);
if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER)
ret = bnxt_hwrm_clear_ntuple_filter(bp, filter);
+ ret = bnxt_hwrm_clear_l2_filter(bp, filter);
+
if (ret) {
rte_flow_error_set
(error,
@@ -1158,9 +1165,13 @@ bnxt_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
return -rte_errno;
}
+ bnxt_free_filter(bp, filter);
+
STAILQ_REMOVE(&vnic->flow_list, flow,
rte_flow, next);
+
rte_free(flow);
+
}
}
--
2.10.1
More information about the stable
mailing list