net/mlx5: fix port stop by verify flows are still present
priv_flow_stop() may be called several times, in such situation flows are already removed from the NIC and thus all associated objects are no present in the flow object (ibv_flow, indirection tables, ....). Fixes: 8086cf08b2f0 ("net/mlx5: handle RSS hash configuration in RSS flow") Cc: stable@dpdk.org Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
This commit is contained in:
parent
ff20ecbf2a
commit
f07f9bcdb4
@ -2173,6 +2173,7 @@ priv_flow_stop(struct priv *priv, struct mlx5_flows *list)
|
||||
|
||||
TAILQ_FOREACH_REVERSE(flow, list, mlx5_flows, next) {
|
||||
unsigned int i;
|
||||
struct mlx5_ind_table_ibv *ind_tbl = NULL;
|
||||
|
||||
if (flow->drop) {
|
||||
if (!flow->frxq[HASH_RXQ_ETH].ibv_flow)
|
||||
@ -2180,17 +2181,26 @@ priv_flow_stop(struct priv *priv, struct mlx5_flows *list)
|
||||
claim_zero(mlx5_glue->destroy_flow
|
||||
(flow->frxq[HASH_RXQ_ETH].ibv_flow));
|
||||
flow->frxq[HASH_RXQ_ETH].ibv_flow = NULL;
|
||||
DEBUG("Flow %p removed", (void *)flow);
|
||||
/* Next flow. */
|
||||
continue;
|
||||
}
|
||||
/* Verify the flow has not already been cleaned. */
|
||||
for (i = 0; i != hash_rxq_init_n; ++i) {
|
||||
if (!flow->frxq[i].ibv_flow)
|
||||
continue;
|
||||
/*
|
||||
* Indirection table may be necessary to remove the
|
||||
* flags in the Rx queues.
|
||||
* This helps to speed-up the process by avoiding
|
||||
* another loop.
|
||||
*/
|
||||
ind_tbl = flow->frxq[i].hrxq->ind_table;
|
||||
break;
|
||||
}
|
||||
if (i == hash_rxq_init_n)
|
||||
return;
|
||||
if (flow->mark) {
|
||||
struct mlx5_ind_table_ibv *ind_tbl = NULL;
|
||||
|
||||
for (i = 0; i != hash_rxq_init_n; ++i) {
|
||||
if (!flow->frxq[i].hrxq)
|
||||
continue;
|
||||
ind_tbl = flow->frxq[i].hrxq->ind_table;
|
||||
}
|
||||
assert(ind_tbl);
|
||||
for (i = 0; i != ind_tbl->queues_n; ++i)
|
||||
(*priv->rxqs)[ind_tbl->queues[i]]->mark = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user