השג את Outlook עבור Android מאת: Dekel Peled נשלח: יום רביעי, 24 ביולי, 12:05 נושא: [dpdk-dev] [PATCH v3] net/mlx5: fix doorbell release on Rx queuerelease אל: Yongseok Koh, Slava Ovsiienko, Shahaf Shuler עותק: Ori Kam, dev@dpdk.org Function mlx5_rxq_release() calls mlx5_release_dbr() to release the doorbell allocated for this Rx queue. This call is relevant only for Rx queue objects created using DevX API. This patch adds the required check, to call mlx5_release_dbr() only when relevant. It also updates mlx5_release_dbr() to use the input offset correctly. Fixes: 13f4e1b32137 ("net/mlx5: create advanced RxQ using new API") --- v3: Use adequate 'Fixes' reference. --- Signed-off-by: Dekel Peled Acked-by: Viacheslav Ovsiienko Acked-by: Matan Azrad --- drivers/net/mlx5/mlx5.c | 1 + drivers/net/mlx5/mlx5_rxq.c | 6 ++++-- drivers/net/mlx5/mlx5_rxtx.h | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 617f5ee..ad0883d 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1460,6 +1460,7 @@ struct mlx5_dev_spawn_data { rte_free(page); } else { /* Mark in bitmap that this door-bell is not in use. */ + offset /= MLX5_DBR_SIZE; int i = offset / 64; int j = offset % 64; diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index b225055..c9df8b0 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -1242,6 +1242,7 @@ struct mlx5_rxq_obj * goto error; rxq_ctrl->dbr_offset = dbr_offset; rxq_ctrl->dbr_umem_id = dbr_page->umem->umem_id; + rxq_ctrl->dbr_umem_id_valid = 1; rxq_data->rq_db = (uint32_t *)((uintptr_t)dbr_page->dbrs + (uintptr_t)rxq_ctrl->dbr_offset); } @@ -1829,8 +1830,9 @@ struct mlx5_rxq_ctrl * if (rxq_ctrl->obj && !mlx5_rxq_obj_release(rxq_ctrl->obj)) rxq_ctrl->obj = NULL; if (rte_atomic32_dec_and_test(&rxq_ctrl->refcnt)) { - claim_zero(mlx5_release_dbr(dev, rxq_ctrl->dbr_umem_id, - rxq_ctrl->dbr_offset)); + if (rxq_ctrl->dbr_umem_id_valid) + claim_zero(mlx5_release_dbr(dev, rxq_ctrl->dbr_umem_id, + rxq_ctrl->dbr_offset)); mlx5_mr_btree_free(&rxq_ctrl->rxq.mr_ctrl.cache_bh); LIST_REMOVE(rxq_ctrl, next); rte_free(rxq_ctrl); diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h index 928d6c3..60d871c 100644 --- a/drivers/net/mlx5/mlx5_rxtx.h +++ b/drivers/net/mlx5/mlx5_rxtx.h @@ -184,6 +184,7 @@ struct mlx5_rxq_ctrl { struct mlx5_priv *priv; /* Back pointer to private data. */ unsigned int socket; /* CPU socket ID for allocations. */ unsigned int irq:1; /* Whether IRQ is enabled. */ + unsigned int dbr_umem_id_valid:1; /* dbr_umem_id holds a valid value. */ uint32_t flow_mark_n; /* Number of Mark/Flag flows using this Queue. */ uint32_t flow_tunnels_n[MLX5_FLOW_TUNNEL]; /* Tunnels counters. */ uint32_t wqn; /* WQ number. */ -- 1.8.3.1