QP allocation changes
Subsystems (15)
cover QP allocation changes
From: Leon Romanovsky <[email protected]>
Hi,
This series convert IB/core to use core allocation scheme for the QP objects.
@Dennis, rdmavt is slightly changed from the previous variant and preserves the node-aware allocation now.
@hns, please double check the changes in your driver, the mlx4 driver clearly showed me that XRC flow needs serious rethinking.
Thanks
Leon Romanovsky (9):
RDMA/hns: Don't skip IB creation flow for regular RC QP RDMA/hns: Don't overwrite supplied QP attributes RDMA/efa: Remove double QP type assignment
RDMA/mlx5: Cancel pkey work before destroying device resources RDMA/mlx5: Delete device resource mutex that didn't protect anything RDMA/mlx5: Rework custom driver QP type creation RDMA/rdmavt: Decouple QP and SGE lists allocations
RDMA: Globally allocate and release QP memory
RDMA/mlx5: Drop in-driver verbs object creations
drivers/infiniband/core/core_priv.h | 27 +++- drivers/infiniband/core/device.c | 2 + drivers/infiniband/core/restrack.c | 2 +- drivers/infiniband/core/verbs.c | 47 +++--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 26 ++-- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 7 +- drivers/infiniband/hw/bnxt_re/main.c | 1 + drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 5 +- drivers/infiniband/hw/cxgb4/provider.c | 1 + drivers/infiniband/hw/cxgb4/qp.c | 37 ++--- drivers/infiniband/hw/efa/efa.h | 5 +- drivers/infiniband/hw/efa/efa_main.c | 1 + drivers/infiniband/hw/efa/efa_verbs.c | 29 ++-- drivers/infiniband/hw/hns/hns_roce_device.h | 5 +- drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 6 +- drivers/infiniband/hw/hns/hns_roce_main.c | 1 + drivers/infiniband/hw/hns/hns_roce_qp.c | 34 ++--- drivers/infiniband/hw/irdma/utils.c | 3 - drivers/infiniband/hw/irdma/verbs.c | 31 ++-- drivers/infiniband/hw/mlx4/main.c | 1 + drivers/infiniband/hw/mlx4/mlx4_ib.h | 5 +- drivers/infiniband/hw/mlx4/qp.c | 25 ++-- drivers/infiniband/hw/mlx5/gsi.c | 51 ++----- drivers/infiniband/hw/mlx5/main.c | 135 ++++++------------ drivers/infiniband/hw/mlx5/mlx5_ib.h | 7 +- drivers/infiniband/hw/mlx5/qp.c | 62 +++----- drivers/infiniband/hw/mthca/mthca_provider.c | 77 ++++------ drivers/infiniband/hw/ocrdma/ocrdma_main.c | 1 + drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 25 ++-- drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 5 +- drivers/infiniband/hw/qedr/main.c | 1 + drivers/infiniband/hw/qedr/qedr_roce_cm.c | 13 +- drivers/infiniband/hw/qedr/qedr_roce_cm.h | 5 +- drivers/infiniband/hw/qedr/verbs.c | 49 ++----- drivers/infiniband/hw/qedr/verbs.h | 4 +- drivers/infiniband/hw/usnic/usnic_ib_main.c | 1 + drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c | 34 ++--- drivers/infiniband/hw/usnic/usnic_ib_qp_grp.h | 10 +- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 69 +++++---- drivers/infiniband/hw/usnic/usnic_ib_verbs.h | 5 +- .../infiniband/hw/vmw_pvrdma/pvrdma_main.c | 1 + drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c | 53 +++---- .../infiniband/hw/vmw_pvrdma/pvrdma_verbs.h | 5 +- drivers/infiniband/sw/rdmavt/qp.c | 102 ++++++------- drivers/infiniband/sw/rdmavt/qp.h | 5 +- drivers/infiniband/sw/rdmavt/vt.c | 9 ++ drivers/infiniband/sw/rxe/rxe_pool.c | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 48 +++---- drivers/infiniband/sw/rxe/rxe_verbs.h | 2 +- drivers/infiniband/sw/siw/siw_main.c | 1 + drivers/infiniband/sw/siw/siw_qp.c | 2 - drivers/infiniband/sw/siw/siw_verbs.c | 54 +++---- drivers/infiniband/sw/siw/siw_verbs.h | 5 +- include/rdma/ib_verbs.h | 30 +++- include/rdma/rdmavt_qp.h | 2 +- 55 files changed, 480 insertions(+), 696 deletions(-)
Signature · 1 line
2.31.1
PATCH 1/9 RDMA/hns: Don't skip IB creation flow for regular RC QP
From: Leon Romanovsky <[email protected]>
The call to internal QP creation function skips QP creation checks and misses the addition of such device QPs to the restrack DB.
As a preparation to general allocation scheme, convert hns to use proper API.
--- drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v1.c +3 -3
@@ -758,7 +758,7 @@ static struct hns_roce_qp *hns_roce_v1_create_lp_qp(struct hns_roce_dev *hr_dev, init_attr.cap.max_recv_wr =HNS_ROCE_MIN_WQE_NUM ; init_attr.cap.max_send_wr =HNS_ROCE_MIN_WQE_NUM ; - qp =hns_roce_create_qp (pd, &init_attr,NULL ); + qp =ib_create_qp (pd, &init_attr);if (IS_ERR (qp)) {dev_err (dev,"Create loop qp for mr free failed!" );return NULL ;
@@ -923,7 +923,7 @@ static int hns_roce_v1_rsv_lp_qp(struct hns_roce_dev *hr_dev) create_lp_qp_failed:for (i -=1 ; i >=0 ; i--) { hr_qp = free_mr->mr_free_qp[i]; -if (hns_roce_v1_destroy_qp (&hr_qp->ibqp,NULL )) +if (ib_destroy_qp (&hr_qp->ibqp))dev_err (dev,"Destroy qp %d for mr free failed!\n" , i); }
@@ -953,7 +953,7 @@ static void hns_roce_v1_release_lp_qp(struct hns_roce_dev *hr_dev)if (!hr_qp)continue ; - ret =hns_roce_v1_destroy_qp (&hr_qp->ibqp,NULL ); + ret =ib_destroy_qp (&hr_qp->ibqp);if (ret)dev_err (dev,"Destroy qp %d for mr free failed(%d)!\n" , i, ret);
Signature · 1 line
2.31.1
PATCH 2/9 RDMA/hns: Don't overwrite supplied QP attributes
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
QP attributes that were supplied by IB/core already have all parameters set when they are passed to the driver. The drivers are not supposed to change anything in struct ib_qp_init_attr.
--- drivers/infiniband/hw/hns/hns_roce_qp.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/infiniband/hw/hns/hns_roce_qp.c +1 -7
@@ -1171,14 +1171,8 @@ struct ib_qp *hns_roce_create_qp(struct ib_pd *pd,if (!hr_qp)return ERR_PTR (-ENOMEM ); -if (init_attr->qp_type ==IB_QPT_XRC_INI ) - init_attr->recv_cq =NULL ; - -if (init_attr->qp_type ==IB_QPT_XRC_TGT ) { +if (init_attr->qp_type ==IB_QPT_XRC_TGT ) hr_qp->xrcdn =to_hr_xrcd (init_attr->xrcd)->xrcdn; - init_attr->recv_cq =NULL ; - init_attr->send_cq =NULL ; - }if (init_attr->qp_type ==IB_QPT_GSI ) { hr_qp->port = init_attr->port_num -1 ;
Signature · 1 line
2.31.1
PATCH 3/9 RDMA/efa: Remove double QP type assignment
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The QP type is set by the IB/core and shouldn't be set in the driver.
--- drivers/infiniband/hw/efa/efa_verbs.c | 1 - 1 file changed, 1 deletion(-)
drivers/infiniband/hw/efa/efa_verbs.c +0 -1
@@ -727,7 +727,6 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd, qp->qp_handle = create_qp_resp.qp_handle; qp->ibqp.qp_num = create_qp_resp.qp_num; - qp->ibqp.qp_type = init_attr->qp_type; qp->max_send_wr = init_attr->cap.max_send_wr; qp->max_recv_wr = init_attr->cap.max_recv_wr; qp->max_send_sge = init_attr->cap.max_send_sge;
Signature · 1 line
2.31.1
Re: [PATCH rdma-next 3/9] RDMA/efa: Remove double QP type assignment
Quoted 6 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
The QP type is set by the IB/core and shouldn't be set in the driver.
Fixes 40909f664d27 ("RDMA/efa: Add EFA verbs implementation")Signed-off-by Leon Romanovsky <[email protected]>
Thanks,
PATCH 4/9 RDMA/mlx5: Cancel pkey work before destroying device resources
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
In the driver release flow, we are ensuring that notifier is disabled and no new works can be added to pkey_change_handler. It means that we can cancel that handler before destroying resources to make sure that our unwind routine is symmetrical to the allocation one.
--- drivers/infiniband/hw/mlx5/main.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/infiniband/hw/mlx5/main.c +9 -4
@@ -2908,6 +2908,15 @@ static void mlx5_ib_dev_res_cleanup(struct mlx5_ib_dev *dev)struct mlx5_ib_resources *devr = &dev->devr;int port; +/* +* Make sure no change P_Key work items are still executing. +* +* At this stage, the mlx5_ib_event should be unregistered +* and it ensures that no new works are added. +*/ +for (port =0 ; port <ARRAY_SIZE (devr->ports); ++port) +cancel_work_sync (&devr->ports[port].pkey_change_work); +mlx5_ib_destroy_srq (devr->s1,NULL );kfree (devr->s1);mlx5_ib_destroy_srq (devr->s0,NULL );
@@ -2918,10 +2927,6 @@ static void mlx5_ib_dev_res_cleanup(struct mlx5_ib_dev *dev)kfree (devr->c0);mlx5_ib_dealloc_pd (devr->p0,NULL );kfree (devr->p0); - -/* Make sure no change P_Key work items are still executing */ -for (port =0 ; port <ARRAY_SIZE (devr->ports); ++port) -cancel_work_sync (&devr->ports[port].pkey_change_work); } static u32 get_core_cap_flags(struct ib_device *ibdev,
Signature · 1 line
2.31.1
PATCH 5/9 RDMA/mlx5: Delete device resource mutex that didn't protect anything
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The dev->devr.mutex was intended to protect GSI QP pointer change in the struct mlx5_ib_port_resources when it is accessed from the pkey_change_work. However that pointer isn't changed during the runtime and once IB/core adds MAD, it stays stable.
--- drivers/infiniband/hw/mlx5/gsi.c | 34 ++++++++-------------------- drivers/infiniband/hw/mlx5/main.c | 9 ++++++-- drivers/infiniband/hw/mlx5/mlx5_ib.h | 2 -- 3 files changed, 16 insertions(+), 29 deletions(-)
drivers/infiniband/hw/mlx5/gsi.c +9 -25
@@ -116,8 +116,6 @@ int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp, goto err_free_tx; } -mutex_lock (&dev->devr.mutex); -if (dev->devr.ports[port_num -1 ].gsi) {mlx5_ib_warn (dev,"GSI QP already exists on port %d\n" , port_num);
@@ -167,15 +165,11 @@ int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp,INIT_LIST_HEAD (&gsi->rx_qp->sig_mrs); dev->devr.ports[attr->port_num -1 ].gsi = gsi; - -mutex_unlock (&dev->devr.mutex); -return 0 ; err_destroy_cq:ib_free_cq (gsi->cq); err_free_wrs: -mutex_unlock (&dev->devr.mutex);kfree (gsi->outstanding_wrs); err_free_tx:kfree (gsi->tx_qps);
@@ -190,16 +184,13 @@ int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)int qp_index;int ret; -mutex_lock (&dev->devr.mutex); ret =mlx5_ib_destroy_qp (gsi->rx_qp,NULL );if (ret) {mlx5_ib_warn (dev,"unable to destroy hardware GSI QP. error %d\n" , ret); -mutex_unlock (&dev->devr.mutex);return ret; } dev->devr.ports[port_num -1 ].gsi =NULL ; -mutex_unlock (&dev->devr.mutex); gsi->rx_qp =NULL ;for (qp_index =0 ; qp_index < gsi->num_qps; ++qp_index) {
@@ -339,23 +330,13 @@ static void setup_qp(struct mlx5_ib_gsi_qp *gsi, u16 qp_index)WARN_ON_ONCE (qp); } -static void setup_qps (struct mlx5_ib_gsi_qp *gsi) -{ -struct mlx5_ib_dev *dev =to_mdev (gsi->rx_qp->device); -u16 qp_index; - -mutex_lock (&dev->devr.mutex); -for (qp_index =0 ; qp_index < gsi->num_qps; ++qp_index) -setup_qp (gsi, qp_index); -mutex_unlock (&dev->devr.mutex); -} -int mlx5_ib_gsi_modify_qp (struct ib_qp *qp,struct ib_qp_attr *attr,int attr_mask) {struct mlx5_ib_dev *dev =to_mdev (qp->device);struct mlx5_ib_qp *mqp =to_mqp (qp);struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; +u16 qp_index;int ret;mlx5_ib_dbg (dev,"modifying GSI QP to state %d\n" , attr->qp_state);
@@ -366,8 +347,11 @@ int mlx5_ib_gsi_modify_qp(struct ib_qp *qp, struct ib_qp_attr *attr,return ret; } -if (to_mqp (gsi->rx_qp)->state ==IB_QPS_RTS ) -setup_qps (gsi); +if (to_mqp (gsi->rx_qp)->state !=IB_QPS_RTS ) +return 0 ; + +for (qp_index =0 ; qp_index < gsi->num_qps; ++qp_index) +setup_qp (gsi, qp_index);return 0 ; }
@@ -511,8 +495,8 @@ int mlx5_ib_gsi_post_recv(struct ib_qp *qp, const struct ib_recv_wr *wr,void mlx5_ib_gsi_pkey_change (struct mlx5_ib_gsi_qp *gsi) { -if (!gsi) -return ; +u16 qp_index; -setup_qps (gsi); +for (qp_index =0 ; qp_index < gsi->num_qps; ++qp_index) +setup_qp (gsi, qp_index); }
drivers/infiniband/hw/mlx5/main.c +7 -2
@@ -2501,6 +2501,13 @@ static void pkey_change_handler(struct work_struct *work) container_of(work, struct mlx5_ib_port_resources, pkey_change_work); +if (!ports->gsi) +/* +* We got this event before device was fully configured +* and MAD registration code wasn't called/finished yet. +*/ +return ; +mlx5_ib_gsi_pkey_change (ports->gsi); }
@@ -2795,8 +2802,6 @@ static int mlx5_ib_dev_res_init(struct mlx5_ib_dev *dev)if (!MLX5_CAP_GEN (dev->mdev, xrc))return -EOPNOTSUPP ; -mutex_init (&devr->mutex); - devr->p0 =rdma_zalloc_drv_obj (ibdev, ib_pd);if (!devr->p0)return -ENOMEM ;
drivers/infiniband/hw/mlx5/mlx5_ib.h +0 -2
@@ -813,8 +813,6 @@ struct mlx5_ib_resources {struct ib_srq *s0;struct ib_srq *s1;struct mlx5_ib_port_resources ports[2 ]; -/* Protects changes to the port resources */ -struct mutex mutex; };struct mlx5_ib_counters {
Signature · 1 line
2.31.1
PATCH 6/9 RDMA/mlx5: Rework custom driver QP type creation
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Starting from commit 2b1f747071c5 ("RDMA/core: Allow drivers to disable restrack DB") the restrack is able to handle non-standard QP types either.
That change allows us to rewrite custom QP calls to their IB/core counterparts, so we will use general QP creation flow even for the driver QP types.
--- drivers/infiniband/hw/mlx5/gsi.c | 15 ++------------- drivers/infiniband/hw/mlx5/main.c | 20 +++++++------------- drivers/infiniband/hw/mlx5/qp.c | 6 +++++- 3 files changed, 14 insertions(+), 27 deletions(-)
drivers/infiniband/hw/mlx5/gsi.c +2 -13
@@ -145,24 +145,13 @@ int mlx5_ib_create_gsi(struct ib_pd *pd, struct mlx5_ib_qp *mqp, hw_init_attr.cap.max_inline_data =0 ; } - gsi->rx_qp =mlx5_ib_create_qp (pd, &hw_init_attr,NULL ); + gsi->rx_qp =ib_create_qp (pd, &hw_init_attr);if (IS_ERR (gsi->rx_qp)) {mlx5_ib_warn (dev,"unable to create hardware GSI QP. error %ld\n" ,PTR_ERR (gsi->rx_qp)); ret =PTR_ERR (gsi->rx_qp); goto err_destroy_cq; } - gsi->rx_qp->device = pd->device; - gsi->rx_qp->pd = pd; - gsi->rx_qp->real_qp = gsi->rx_qp; - - gsi->rx_qp->qp_type = hw_init_attr.qp_type; - gsi->rx_qp->send_cq = hw_init_attr.send_cq; - gsi->rx_qp->recv_cq = hw_init_attr.recv_cq; - gsi->rx_qp->event_handler = hw_init_attr.event_handler; -spin_lock_init (&gsi->rx_qp->mr_lock); -INIT_LIST_HEAD (&gsi->rx_qp->rdma_mrs); -INIT_LIST_HEAD (&gsi->rx_qp->sig_mrs); dev->devr.ports[attr->port_num -1 ].gsi = gsi;return 0 ;
@@ -184,7 +173,7 @@ int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)int qp_index;int ret; - ret =mlx5_ib_destroy_qp (gsi->rx_qp,NULL ); + ret =ib_destroy_qp (gsi->rx_qp);if (ret) {mlx5_ib_warn (dev,"unable to destroy hardware GSI QP. error %d\n" , ret);
drivers/infiniband/hw/mlx5/main.c +7 -13
@@ -4073,7 +4073,7 @@ static void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev)mlx5_ib_warn (dev,"mr cache cleanup failed\n" );if (dev->umrc.qp) -mlx5_ib_destroy_qp (dev->umrc.qp,NULL ); +ib_destroy_qp (dev->umrc.qp);if (dev->umrc.cq)ib_free_cq (dev->umrc.cq);if (dev->umrc.pd)
@@ -4126,23 +4126,17 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev) init_attr->cap.max_send_sge =1 ; init_attr->qp_type =MLX5_IB_QPT_REG_UMR ; init_attr->port_num =1 ; - qp =mlx5_ib_create_qp (pd, init_attr,NULL ); + qp =ib_create_qp (pd, init_attr);if (IS_ERR (qp)) {mlx5_ib_dbg (dev,"Couldn't create sync UMR QP\n" ); ret =PTR_ERR (qp); goto error_3; } - qp->device = &dev->ib_dev; - qp->real_qp = qp; - qp->uobject =NULL ; - qp->qp_type =MLX5_IB_QPT_REG_UMR ; - qp->send_cq = init_attr->send_cq; - qp->recv_cq = init_attr->recv_cq; attr->qp_state =IB_QPS_INIT ; attr->port_num =1 ; - ret =mlx5_ib_modify_qp (qp, attr,IB_QP_STATE |IB_QP_PKEY_INDEX | -IB_QP_PORT ,NULL ); + ret =ib_modify_qp (qp, attr, +IB_QP_STATE |IB_QP_PKEY_INDEX |IB_QP_PORT );if (ret) {mlx5_ib_dbg (dev,"Couldn't modify UMR QP\n" ); goto error_4;
@@ -4152,7 +4146,7 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev) attr->qp_state =IB_QPS_RTR ; attr->path_mtu =IB_MTU_256 ; - ret =mlx5_ib_modify_qp (qp, attr,IB_QP_STATE ,NULL ); + ret =ib_modify_qp (qp, attr,IB_QP_STATE );if (ret) {mlx5_ib_dbg (dev,"Couldn't modify umr QP to rtr\n" ); goto error_4;
@@ -4160,7 +4154,7 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)memset (attr,0 ,sizeof (*attr)); attr->qp_state =IB_QPS_RTS ; - ret =mlx5_ib_modify_qp (qp, attr,IB_QP_STATE ,NULL ); + ret =ib_modify_qp (qp, attr,IB_QP_STATE );if (ret) {mlx5_ib_dbg (dev,"Couldn't modify umr QP to rts\n" ); goto error_4;
@@ -4183,7 +4177,7 @@ static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)return 0 ; error_4: -mlx5_ib_destroy_qp (qp,NULL ); +ib_destroy_qp (qp); dev->umrc.qp =NULL ; error_3:
drivers/infiniband/hw/mlx5/qp.c +5 -1
@@ -2675,7 +2675,6 @@ static int create_dct(struct mlx5_ib_dev *dev, struct ib_pd *pd, } qp->state =IB_QPS_RESET ; -rdma_restrack_no_track (&qp->ibqp.res);return 0 ; }
@@ -3014,6 +3013,7 @@ static int create_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,switch (qp->type) {case MLX5_IB_QPT_DCT : err =create_dct (dev, pd, qp, params); +rdma_restrack_no_track (&qp->ibqp.res);break ;case MLX5_IB_QPT_DCI : err =create_dci (dev, pd, qp, params);
@@ -3024,6 +3024,10 @@ static int create_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,case IB_QPT_GSI : err =mlx5_ib_create_gsi (pd, qp, params->attr);break ; +case MLX5_IB_QPT_HW_GSI : +case MLX5_IB_QPT_REG_UMR : +rdma_restrack_no_track (&qp->ibqp.res); + fallthrough;default :if (params->udata) err =create_user_qp (dev, pd, qp, params);
Signature · 1 line
2.31.1
PATCH 7/9 RDMA/rdmavt: Decouple QP and SGE lists allocations
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
The rdmavt QP has fields that are both needed for the control and data path. Such mixed declaration caused to the very specific allocation flow with kzalloc_node and SGE list embedded into the struct rvt_qp.
This patch separates QP creation to two: regular memory allocation for the control path and specific code for the SGE list, while the access to the later is performed through derefenced pointer.
Such pointer and its context are expected to be in the cache, so performance difference is expected to be negligible, if any exists.
--- drivers/infiniband/sw/rdmavt/qp.c | 13 ++++++++----- include/rdma/rdmavt_qp.h | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-)
drivers/infiniband/sw/rdmavt/qp.c +8 -5
@@ -1078,7 +1078,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,int err;struct rvt_swqe *swq =NULL ;size_t sz; -size_t sg_list_sz; +size_t sg_list_sz =0 ;struct ib_qp *ret =ERR_PTR (-ENOMEM );struct rvt_dev_info *rdi =ib_to_rvt (ibpd->device);void *priv =NULL ;
@@ -1126,8 +1126,6 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,if (!swq)return ERR_PTR (-ENOMEM ); - sz =sizeof (*qp); - sg_list_sz =0 ;if (init_attr->srq) {struct rvt_srq *srq =ibsrq_to_rvtsrq (init_attr->srq);
@@ -1137,10 +1135,13 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, }else if (init_attr->cap.max_recv_sge >1 ) sg_list_sz =sizeof (*qp->r_sg_list) * (init_attr->cap.max_recv_sge -1 ); - qp =kzalloc_node (sz + sg_list_sz,GFP_KERNEL , - rdi->dparms.node); + qp =kzalloc_node (sizeof (*qp),GFP_KERNEL , rdi->dparms.node);if (!qp) goto bail_swq; + qp->r_sg_list = +kzalloc_node (sg_list_sz,GFP_KERNEL , rdi->dparms.node); +if (!qp->r_sg_list) + goto bail_qp; qp->allowed_ops =get_allowed_ops (init_attr->qp_type);RCU_INIT_POINTER (qp->next,NULL );
@@ -1328,6 +1329,7 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd, bail_qp:kfree (qp->s_ack_queue); +kfree (qp->r_sg_list);kfree (qp); bail_swq:
@@ -1762,6 +1764,7 @@ int rvt_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)kvfree (qp->r_rq.kwq); rdi->driver_f.qp_priv_free (rdi, qp);kfree (qp->s_ack_queue); +kfree (qp->r_sg_list);rdma_destroy_ah_attr (&qp->remote_ah_attr);rdma_destroy_ah_attr (&qp->alt_ah_attr);free_ud_wq_attr (qp);
include/rdma/rdmavt_qp.h +1 -1
@@ -444,7 +444,7 @@ struct rvt_qp {/* * This sge list MUST be last. Do not add anything below here. */ -struct rvt_sge r_sg_list[]/* verified SGEs */ +struct rvt_sge *r_sg_list/* verified SGEs */ ____cacheline_aligned_in_smp ; };
Signature · 1 line
2.31.1
PATCH 8/9 RDMA: Globally allocate and release QP memory
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
--- drivers/infiniband/core/core_priv.h | 27 ++++-- drivers/infiniband/core/device.c | 2 + drivers/infiniband/core/restrack.c | 2 +- drivers/infiniband/core/verbs.c | 40 ++++---- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 26 ++---- drivers/infiniband/hw/bnxt_re/ib_verbs.h | 7 +- drivers/infiniband/hw/bnxt_re/main.c | 1 + drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 5 +- drivers/infiniband/hw/cxgb4/provider.c | 1 + drivers/infiniband/hw/cxgb4/qp.c | 37 +++----- drivers/infiniband/hw/efa/efa.h | 5 +- drivers/infiniband/hw/efa/efa_main.c | 1 + drivers/infiniband/hw/efa/efa_verbs.c | 28 ++---- drivers/infiniband/hw/hns/hns_roce_device.h | 5 +- drivers/infiniband/hw/hns/hns_roce_main.c | 1 + drivers/infiniband/hw/hns/hns_roce_qp.c | 26 ++---- drivers/infiniband/hw/irdma/utils.c | 3 - drivers/infiniband/hw/irdma/verbs.c | 31 +++---- drivers/infiniband/hw/mlx4/main.c | 1 + drivers/infiniband/hw/mlx4/mlx4_ib.h | 5 +- drivers/infiniband/hw/mlx4/qp.c | 25 ++--- drivers/infiniband/hw/mlx5/gsi.c | 2 - drivers/infiniband/hw/mlx5/main.c | 1 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 5 +- drivers/infiniband/hw/mlx5/qp.c | 56 ++++-------- drivers/infiniband/hw/mthca/mthca_provider.c | 77 ++++++---------- drivers/infiniband/hw/ocrdma/ocrdma_main.c | 1 + drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 25 ++--- drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 5 +- drivers/infiniband/hw/qedr/main.c | 1 + drivers/infiniband/hw/qedr/qedr_roce_cm.c | 13 ++- drivers/infiniband/hw/qedr/qedr_roce_cm.h | 5 +- drivers/infiniband/hw/qedr/verbs.c | 49 +++------- drivers/infiniband/hw/qedr/verbs.h | 4 +- drivers/infiniband/hw/usnic/usnic_ib_main.c | 1 + drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c | 34 +++---- drivers/infiniband/hw/usnic/usnic_ib_qp_grp.h | 10 +- drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 69 +++++++------- drivers/infiniband/hw/usnic/usnic_ib_verbs.h | 5 +- .../infiniband/hw/vmw_pvrdma/pvrdma_main.c | 1 + drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c | 53 +++++------ .../infiniband/hw/vmw_pvrdma/pvrdma_verbs.h | 5 +- drivers/infiniband/sw/rdmavt/qp.c | 91 +++++++------------ drivers/infiniband/sw/rdmavt/qp.h | 5 +- drivers/infiniband/sw/rdmavt/vt.c | 9 ++ drivers/infiniband/sw/rxe/rxe_pool.c | 2 +- drivers/infiniband/sw/rxe/rxe_verbs.c | 48 +++++----- drivers/infiniband/sw/rxe/rxe_verbs.h | 2 +- drivers/infiniband/sw/siw/siw_main.c | 1 + drivers/infiniband/sw/siw/siw_qp.c | 2 - drivers/infiniband/sw/siw/siw_verbs.c | 54 +++++------ drivers/infiniband/sw/siw/siw_verbs.h | 5 +- include/rdma/ib_verbs.h | 30 +++++- 53 files changed, 404 insertions(+), 546 deletions(-)
drivers/infiniband/core/core_priv.h +21 -6
@@ -322,13 +322,14 @@ _ib_create_qp(struct ib_device *dev, struct ib_pd *pd, struct ib_uqp_object *uobj, const char *caller) { struct ib_qp *qp; +int ret;if (!dev->ops.create_qp)return ERR_PTR (-EOPNOTSUPP ); - qp = dev->ops.create_qp (pd, attr, udata); -if (IS_ERR (qp)) -return qp; + qp =rdma_zalloc_drv_obj_numa (dev, ib_qp); +if (!qp) +return ERR_PTR (-ENOMEM ); qp->device = dev; qp->pd = pd;
@@ -337,14 +338,11 @@ _ib_create_qp(struct ib_device *dev, struct ib_pd *pd, qp->qp_type = attr->qp_type; qp->rwq_ind_tbl = attr->rwq_ind_tbl; - qp->send_cq = attr->send_cq; - qp->recv_cq = attr->recv_cq; qp->srq = attr->srq; qp->rwq_ind_tbl = attr->rwq_ind_tbl; qp->event_handler = attr->event_handler; qp->port = attr->port_num; -atomic_set (&qp->usecnt,0 );spin_lock_init (&qp->mr_lock);INIT_LIST_HEAD (&qp->rdma_mrs);INIT_LIST_HEAD (&qp->sig_mrs);
@@ -352,8 +350,25 @@ _ib_create_qp(struct ib_device *dev, struct ib_pd *pd,rdma_restrack_new (&qp->res,RDMA_RESTRACK_QP );WARN_ONCE (!udata && !caller,"Missing kernel QP owner" );rdma_restrack_set_name (&qp->res, udata ?NULL : caller); + ret = dev->ops.create_qp (qp, attr, udata); +if (ret) + goto err_create; + +/* +* TODO: The mlx4 internally overwrites send_cq and recv_cq. +* Unfortunately, it is not an easy task to fix that driver. +*/ + qp->send_cq = attr->send_cq; + qp->recv_cq = attr->recv_cq; +rdma_restrack_add (&qp->res);return qp; + +err_create: +rdma_restrack_put (&qp->res); +kfree (qp); +return ERR_PTR (ret); + }struct rdma_dev_addr ;
drivers/infiniband/core/device.c +2 -0
@@ -2654,6 +2654,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)SET_DEVICE_OP (dev_ops, get_hw_stats);SET_DEVICE_OP (dev_ops, get_link_layer);SET_DEVICE_OP (dev_ops, get_netdev); +SET_DEVICE_OP (dev_ops, get_numa_node);SET_DEVICE_OP (dev_ops, get_port_immutable);SET_DEVICE_OP (dev_ops, get_vector_affinity);SET_DEVICE_OP (dev_ops, get_vf_config);
@@ -2710,6 +2711,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)SET_OBJ_SIZE (dev_ops, ib_cq);SET_OBJ_SIZE (dev_ops, ib_mw);SET_OBJ_SIZE (dev_ops, ib_pd); +SET_OBJ_SIZE (dev_ops, ib_qp);SET_OBJ_SIZE (dev_ops, ib_rwq_ind_table);SET_OBJ_SIZE (dev_ops, ib_srq);SET_OBJ_SIZE (dev_ops, ib_ucontext);
drivers/infiniband/core/restrack.c +1 -1
@@ -343,7 +343,7 @@ void rdma_restrack_del(struct rdma_restrack_entry *res) rt = &dev->res[res->type]; old =xa_erase (&rt->xa, res->id); -if (res->type ==RDMA_RESTRACK_MR || res->type ==RDMA_RESTRACK_QP ) +if (res->type ==RDMA_RESTRACK_MR )return ;WARN_ON (old != res);
drivers/infiniband/core/verbs.c +21 -19
@@ -1963,30 +1963,32 @@ int ib_destroy_qp_user(struct ib_qp *qp, struct ib_udata *udata)rdma_rw_cleanup_mrs (qp);rdma_counter_unbind_qp (qp, true); -rdma_restrack_del (&qp->res); ret = qp->device->ops.destroy_qp (qp, udata); -if (!ret) { -if (alt_path_sgid_attr) -rdma_put_gid_attr (alt_path_sgid_attr); -if (av_sgid_attr) -rdma_put_gid_attr (av_sgid_attr); -if (pd) -atomic_dec (&pd->usecnt); -if (scq) -atomic_dec (&scq->usecnt); -if (rcq) -atomic_dec (&rcq->usecnt); -if (srq) -atomic_dec (&srq->usecnt); -if (ind_tbl) -atomic_dec (&ind_tbl->usecnt); -if (sec) -ib_destroy_qp_security_end (sec); - }else { +if (ret) {if (sec)ib_destroy_qp_security_abort (sec); +return ret; } +if (alt_path_sgid_attr) +rdma_put_gid_attr (alt_path_sgid_attr); +if (av_sgid_attr) +rdma_put_gid_attr (av_sgid_attr); +if (pd) +atomic_dec (&pd->usecnt); +if (scq) +atomic_dec (&scq->usecnt); +if (rcq) +atomic_dec (&rcq->usecnt); +if (srq) +atomic_dec (&srq->usecnt); +if (ind_tbl) +atomic_dec (&ind_tbl->usecnt); +if (sec) +ib_destroy_qp_security_end (sec); + +rdma_restrack_del (&qp->res); +kfree (qp);return ret; }EXPORT_SYMBOL (ib_destroy_qp_user);
drivers/infiniband/hw/bnxt_re/ib_verbs.c +8 -18
@@ -815,7 +815,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)if (ib_qp->qp_type ==IB_QPT_GSI && rdev->gsi_ctx.gsi_sqp) { rc =bnxt_re_destroy_gsi_sqp (qp);if (rc) - goto sh_fail; +return rc; }mutex_lock (&rdev->qp_lock);
@@ -826,10 +826,7 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)ib_umem_release (qp->rumem);ib_umem_release (qp->sumem); -kfree (qp);return 0 ; -sh_fail: -return rc; }static u8 __from_ib_qp_type (enum ib_qp_type type)
@@ -1402,27 +1399,22 @@ static bool bnxt_re_test_qp_limits(struct bnxt_re_dev *rdev,return rc; } -struct ib_qp *bnxt_re_create_qp (struct ib_pd *ib_pd, -struct ib_qp_init_attr *qp_init_attr, -struct ib_udata *udata) +int bnxt_re_create_qp (struct ib_qp *ib_qp,struct ib_qp_init_attr *qp_init_attr, +struct ib_udata *udata) { +struct ib_pd *ib_pd = ib_qp->pd; struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);struct bnxt_re_dev *rdev = pd->rdev;struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr; -struct bnxt_re_qp *qp; + struct bnxt_re_qp *qp = container_of(ib_qp, struct bnxt_re_qp, ib_qp);int rc; rc =bnxt_re_test_qp_limits (rdev, qp_init_attr, dev_attr);if (!rc) { rc = -EINVAL ; - goto exit; + goto fail; } - qp =kzalloc (sizeof (*qp),GFP_KERNEL ); -if (!qp) { - rc = -ENOMEM ; - goto exit; - } qp->rdev = rdev; rc =bnxt_re_init_qp_attr (qp, pd, qp_init_attr, udata);if (rc)
@@ -1465,16 +1457,14 @@ struct ib_qp *bnxt_re_create_qp(struct ib_pd *ib_pd,mutex_unlock (&rdev->qp_lock);atomic_inc (&rdev->qp_count); -return &qp->ib_qp; +return 0 ; qp_destroy:bnxt_qplib_destroy_qp (&rdev->qplib_res, &qp->qplib_qp); free_umem:ib_umem_release (qp->rumem);ib_umem_release (qp->sumem); fail: -kfree (qp); -exit: -return ERR_PTR (rc); +return rc; }static u8 __from_ib_qp_state (enum ib_qp_state state)
drivers/infiniband/hw/bnxt_re/ib_verbs.h +3 -4
@@ -78,9 +78,9 @@ struct bnxt_re_srq { };struct bnxt_re_qp { +struct ib_qp ib_qp;struct list_head list;struct bnxt_re_dev *rdev; -struct ib_qp ib_qp;spinlock_t sq_lock;/* protect sq */ spinlock_t rq_lock;/* protect rq */ struct bnxt_qplib_qp qplib_qp;
@@ -179,9 +179,8 @@ int bnxt_re_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);int bnxt_re_destroy_srq (struct ib_srq *srq,struct ib_udata *udata);int bnxt_re_post_srq_recv (struct ib_srq *srq,const struct ib_recv_wr *recv_wr,const struct ib_recv_wr **bad_recv_wr); -struct ib_qp *bnxt_re_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *qp_init_attr, -struct ib_udata *udata); +int bnxt_re_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *qp_init_attr, +struct ib_udata *udata);int bnxt_re_modify_qp (struct ib_qp *qp,struct ib_qp_attr *qp_attr,int qp_attr_mask,struct ib_udata *udata); int bnxt_re_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
drivers/infiniband/hw/bnxt_re/main.c +1 -0
@@ -673,6 +673,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, bnxt_re_ah, ib_ah),INIT_RDMA_OBJ_SIZE (ib_cq, bnxt_re_cq, ib_cq),INIT_RDMA_OBJ_SIZE (ib_pd, bnxt_re_pd, ib_pd), +INIT_RDMA_OBJ_SIZE (ib_qp, bnxt_re_qp, ib_qp),INIT_RDMA_OBJ_SIZE (ib_srq, bnxt_re_srq, ib_srq), INIT_RDMA_OBJ_SIZE(ib_ucontext, bnxt_re_ucontext, ib_uctx), };
drivers/infiniband/hw/cxgb4/iw_cxgb4.h +2 -3
@@ -989,9 +989,8 @@ int c4iw_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata);int c4iw_create_srq (struct ib_srq *srq,struct ib_srq_init_attr *attrs,struct ib_udata *udata);int c4iw_destroy_qp (struct ib_qp *ib_qp,struct ib_udata *udata); -struct ib_qp *c4iw_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *attrs, -struct ib_udata *udata); +int c4iw_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *attrs, +struct ib_udata *udata);int c4iw_ib_modify_qp (struct ib_qp *ibqp,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata); int c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
drivers/infiniband/hw/cxgb4/provider.c +1 -0
@@ -499,6 +499,7 @@ static const struct ib_device_ops c4iw_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_cq, c4iw_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_mw, c4iw_mw, ibmw),INIT_RDMA_OBJ_SIZE (ib_pd, c4iw_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, c4iw_qp, ibqp),INIT_RDMA_OBJ_SIZE (ib_srq, c4iw_srq, ibsrq), INIT_RDMA_OBJ_SIZE(ib_ucontext, c4iw_ucontext, ibucontext), };
drivers/infiniband/hw/cxgb4/qp.c +13 -24
@@ -2103,16 +2103,15 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata) ucontext ? &ucontext->uctx : &rhp->rdev.uctx, !qhp->srq);c4iw_put_wr_wait (qhp->wr_waitp); - -kfree (qhp);return 0 ; } -struct ib_qp *c4iw_create_qp (struct ib_pd *pd,struct ib_qp_init_attr *attrs, -struct ib_udata *udata) +int c4iw_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *attrs, +struct ib_udata *udata) { +struct ib_pd *pd = qp->pd;struct c4iw_dev *rhp; -struct c4iw_qp *qhp; +struct c4iw_qp *qhp =to_c4iw_qp (qp);struct c4iw_pd *php;struct c4iw_cq *schp;struct c4iw_cq *rchp;
@@ -2124,44 +2123,36 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,struct c4iw_mm_entry *sq_key_mm, *rq_key_mm =NULL , *sq_db_key_mm;struct c4iw_mm_entry *rq_db_key_mm =NULL , *ma_sync_key_mm =NULL ; -pr_debug ("ib_pd %p\n" , pd); -if (attrs->qp_type !=IB_QPT_RC || attrs->create_flags) -return ERR_PTR (-EOPNOTSUPP ); +return -EOPNOTSUPP ; php =to_c4iw_pd (pd); rhp = php->rhp; schp =get_chp (rhp, ((struct c4iw_cq *)attrs->send_cq)->cq.cqid); rchp =get_chp (rhp, ((struct c4iw_cq *)attrs->recv_cq)->cq.cqid);if (!schp || !rchp) -return ERR_PTR (-EINVAL ); +return -EINVAL ;if (attrs->cap.max_inline_data >T4_MAX_SEND_INLINE ) -return ERR_PTR (-EINVAL ); +return -EINVAL ;if (!attrs->srq) {if (attrs->cap.max_recv_wr > rhp->rdev.hw_queue.t4_max_rq_size) -return ERR_PTR (-E2BIG ); +return -E2BIG ; rqsize = attrs->cap.max_recv_wr +1 ;if (rqsize <8 ) rqsize =8 ; }if (attrs->cap.max_send_wr > rhp->rdev.hw_queue.t4_max_sq_size) -return ERR_PTR (-E2BIG ); +return -E2BIG ; sqsize = attrs->cap.max_send_wr +1 ;if (sqsize <8 ) sqsize =8 ; - qhp =kzalloc (sizeof (*qhp),GFP_KERNEL ); -if (!qhp) -return ERR_PTR (-ENOMEM ); - qhp->wr_waitp =c4iw_alloc_wr_wait (GFP_KERNEL ); -if (!qhp->wr_waitp) { - ret = -ENOMEM ; - goto err_free_qhp; - } +if (!qhp->wr_waitp) +return -ENOMEM ; qhp->wq.sq.size = sqsize; qhp->wq.sq.memsize =
@@ -2339,7 +2330,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, qhp->wq.sq.qid, qhp->wq.sq.size, qhp->wq.sq.memsize, attrs->cap.max_send_wr, qhp->wq.rq.qid, qhp->wq.rq.size, qhp->wq.rq.memsize, attrs->cap.max_recv_wr); -return &qhp->ibqp; +return 0 ; err_free_ma_sync_key:kfree (ma_sync_key_mm); err_free_rq_db_key:
@@ -2359,9 +2350,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, ucontext ? &ucontext->uctx : &rhp->rdev.uctx, !attrs->srq); err_free_wr_wait:c4iw_put_wr_wait (qhp->wr_waitp); -err_free_qhp: -kfree (qhp); -return ERR_PTR (ret); +return ret; } int c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
drivers/infiniband/hw/efa/efa.h +2 -3
@@ -132,9 +132,8 @@ int efa_query_pkey(struct ib_device *ibdev, u32 port, u16 index,int efa_alloc_pd (struct ib_pd *ibpd,struct ib_udata *udata);int efa_dealloc_pd (struct ib_pd *ibpd,struct ib_udata *udata);int efa_destroy_qp (struct ib_qp *ibqp,struct ib_udata *udata); -struct ib_qp *efa_create_qp (struct ib_pd *ibpd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int efa_create_qp (struct ib_qp *ibqp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int efa_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata);int efa_create_cq (struct ib_cq *ibcq,const struct ib_cq_init_attr *attr,struct ib_udata *udata);
drivers/infiniband/hw/efa/efa_main.c +1 -0
@@ -271,6 +271,7 @@ static const struct ib_device_ops efa_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, efa_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, efa_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, efa_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, efa_qp, ibqp), INIT_RDMA_OBJ_SIZE(ib_ucontext, efa_ucontext, ibucontext), };
drivers/infiniband/hw/efa/efa_verbs.c +9 -19
@@ -450,7 +450,6 @@ int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) qp->rq_size, DMA_TO_DEVICE); } -kfree (qp);return 0 ; }
@@ -609,17 +608,16 @@ static int efa_qp_validate_attr(struct efa_dev *dev,return 0 ; } -struct ib_qp *efa_create_qp (struct ib_pd *ibpd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata) +int efa_create_qp (struct ib_qp *ibqp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata) {struct efa_com_create_qp_params create_qp_params = {};struct efa_com_create_qp_result create_qp_resp; -struct efa_dev *dev =to_edev (ibpd->device); +struct efa_dev *dev =to_edev (ibqp->device);struct efa_ibv_create_qp_resp resp = {};struct efa_ibv_create_qp cmd = {}; +struct efa_qp *qp =to_eqp (ibqp);struct efa_ucontext *ucontext; -struct efa_qp *qp;int err; ucontext = rdma_udata_to_drv_context(udata, struct efa_ucontext,
@@ -664,14 +662,8 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd, goto err_out; } - qp =kzalloc (sizeof (*qp),GFP_KERNEL ); -if (!qp) { - err = -ENOMEM ; - goto err_out; - } - create_qp_params.uarn = ucontext->uarn; - create_qp_params.pd =to_epd (ibpd)->pdn; + create_qp_params.pd =to_epd (ibqp->pd)->pdn;if (init_attr->qp_type ==IB_QPT_UD ) { create_qp_params.qp_type =EFA_ADMIN_QP_TYPE_UD ;
@@ -682,7 +674,7 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd,"Unsupported qp type %d driver qp type %d\n" , init_attr->qp_type, cmd.driver_qp_type); err = -EOPNOTSUPP ; - goto err_free_qp; + goto err_out; } ibdev_dbg(&dev->ibdev, "Create QP: qp type %d driver qp type %#x\n",
@@ -700,7 +692,7 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd, qp->rq_size, DMA_TO_DEVICE);if (!qp->rq_cpu_addr) { err = -ENOMEM ; - goto err_free_qp; + goto err_out; } ibdev_dbg(&dev->ibdev,
@@ -746,7 +738,7 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd,ibdev_dbg (&dev->ibdev,"Created qp[%d]\n" , qp->ibqp.qp_num); -return &qp->ibqp; +return 0 ; err_remove_mmap_entries:efa_qp_user_mmap_entries_remove (qp);
@@ -756,11 +748,9 @@ struct ib_qp *efa_create_qp(struct ib_pd *ibpd,if (qp->rq_size)efa_free_mapped (dev, qp->rq_cpu_addr, qp->rq_dma_addr, qp->rq_size,DMA_TO_DEVICE ); -err_free_qp: -kfree (qp); err_out:atomic64_inc (&dev->stats.create_qp_err); -return ERR_PTR (err); +return err; } static const struct {
drivers/infiniband/hw/hns/hns_roce_device.h +2 -3
@@ -1216,9 +1216,8 @@ int hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata);int hns_roce_alloc_xrcd (struct ib_xrcd *ib_xrcd,struct ib_udata *udata);int hns_roce_dealloc_xrcd (struct ib_xrcd *ib_xrcd,struct ib_udata *udata); -struct ib_qp *hns_roce_create_qp (struct ib_pd *ib_pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int hns_roce_create_qp (struct ib_qp *ib_qp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int hns_roce_modify_qp (struct ib_qp *ibqp,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata);void init_flush_work (struct hns_roce_dev *hr_dev,struct hns_roce_qp *hr_qp);
drivers/infiniband/hw/hns/hns_roce_main.c +1 -0
@@ -454,6 +454,7 @@ static const struct ib_device_ops hns_roce_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, hns_roce_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, hns_roce_cq, ib_cq),INIT_RDMA_OBJ_SIZE (ib_pd, hns_roce_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, hns_roce_qp, ibqp), INIT_RDMA_OBJ_SIZE(ib_ucontext, hns_roce_ucontext, ibucontext), };
drivers/infiniband/hw/hns/hns_roce_qp.c +8 -18
@@ -1121,8 +1121,6 @@ void hns_roce_qp_destroy(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,free_qp_buf (hr_dev, hr_qp);free_kernel_wrid (hr_qp);free_qp_db (hr_dev, hr_qp, udata); - -kfree (hr_qp); } static int check_qp_type(struct hns_roce_dev *hr_dev, enum ib_qp_type type,
@@ -1154,22 +1152,18 @@ static int check_qp_type(struct hns_roce_dev *hr_dev, enum ib_qp_type type,return -EOPNOTSUPP ; } -struct ib_qp *hns_roce_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata) +int hns_roce_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata) { -struct ib_device *ibdev = pd ? pd->device : init_attr->xrcd->device; +struct ib_device *ibdev = qp->device;struct hns_roce_dev *hr_dev =to_hr_dev (ibdev); -struct hns_roce_qp *hr_qp; +struct hns_roce_qp *hr_qp =to_hr_qp (qp); +struct ib_pd *pd = qp->pd;int ret; ret =check_qp_type (hr_dev, init_attr->qp_type, !!udata);if (ret) -return ERR_PTR (ret); - - hr_qp =kzalloc (sizeof (*hr_qp),GFP_KERNEL ); -if (!hr_qp) -return ERR_PTR (-ENOMEM ); +return ret;if (init_attr->qp_type ==IB_QPT_XRC_TGT ) hr_qp->xrcdn =to_hr_xrcd (init_attr->xrcd)->xrcdn;
@@ -1180,15 +1174,11 @@ struct ib_qp *hns_roce_create_qp(struct ib_pd *pd, } ret =hns_roce_create_qp_common (hr_dev, pd, init_attr, udata, hr_qp); -if (ret) { +if (ret)ibdev_err (ibdev,"Create QP type 0x%x failed(%d)\n" , init_attr->qp_type, ret); -kfree (hr_qp); -return ERR_PTR (ret); - } - -return &hr_qp->ibqp; +return ret; }int to_hr_qp_type (int qp_type)
drivers/infiniband/hw/irdma/utils.c +0 -3
@@ -1141,10 +1141,7 @@ void irdma_free_qp_rsrc(struct irdma_qp *iwqp) iwqp->kqp.dma_mem.va, iwqp->kqp.dma_mem.pa); iwqp->kqp.dma_mem.va =NULL ;kfree (iwqp->kqp.sq_wrid_mem); - iwqp->kqp.sq_wrid_mem =NULL ;kfree (iwqp->kqp.rq_wrid_mem); - iwqp->kqp.rq_wrid_mem =NULL ; -kfree (iwqp); }/**
drivers/infiniband/hw/irdma/verbs.c +13 -18
@@ -792,18 +792,19 @@ static int irdma_validate_qp_attrs(struct ib_qp_init_attr *init_attr,/** * irdma_create_qp - create qp -* @ibpd: ptr of pd +* @ibqp: ptr of qp * @init_attr: attributes for qp * @udata: user data for create qp */ -static struct ib_qp *irdma_create_qp (struct ib_pd *ibpd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata) +static int irdma_create_qp (struct ib_qp *ibqp, +struct ib_qp_init_attr *init_attr, +struct ib_udata *udata) { +struct ib_pd *ibpd = ibqp->pd;struct irdma_pd *iwpd =to_iwpd (ibpd);struct irdma_device *iwdev =to_iwdev (ibpd->device);struct irdma_pci_f *rf = iwdev->rf; -struct irdma_qp *iwqp; +struct irdma_qp *iwqp =to_iwqp (ibqp);struct irdma_create_qp_req req;struct irdma_create_qp_resp uresp = {};u32 qp_num =0 ;
@@ -820,7 +821,7 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd, err_code =irdma_validate_qp_attrs (init_attr, iwdev);if (err_code) -return ERR_PTR (err_code); +return err_code; sq_size = init_attr->cap.max_send_wr; rq_size = init_attr->cap.max_recv_wr;
@@ -833,10 +834,6 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd, init_info.qp_uk_init_info.max_rq_frag_cnt = init_attr->cap.max_recv_sge; init_info.qp_uk_init_info.max_inline_data = init_attr->cap.max_inline_data; - iwqp =kzalloc (sizeof (*iwqp),GFP_KERNEL ); -if (!iwqp) -return ERR_PTR (-ENOMEM ); - qp = &iwqp->sc_qp; qp->qp_uk.back_qp = iwqp; qp->qp_uk.lock = &iwqp->lock;
@@ -849,10 +846,8 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd, iwqp->q2_ctx_mem.size, &iwqp->q2_ctx_mem.pa, GFP_KERNEL); -if (!iwqp->q2_ctx_mem.va) { - err_code = -ENOMEM ; - goto error; - } +if (!iwqp->q2_ctx_mem.va) +return -ENOMEM ; init_info.q2 = iwqp->q2_ctx_mem.va; init_info.q2_pa = iwqp->q2_ctx_mem.pa;
@@ -1001,17 +996,16 @@ static struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,if (err_code) {ibdev_dbg (&iwdev->ibdev,"VERBS: copy_to_udata failed\n" );irdma_destroy_qp (&iwqp->ibqp, udata); -return ERR_PTR (err_code); +return err_code; } }init_completion (&iwqp->free_qp); -return &iwqp->ibqp; +return 0 ; error:irdma_free_qp_rsrc (iwqp); - -return ERR_PTR (err_code); +return err_code; }static int irdma_get_ib_acc_flags (struct irdma_qp *iwqp)
@@ -4406,6 +4400,7 @@ static const struct ib_device_ops irdma_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, irdma_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, irdma_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_mw, irdma_mr, ibmw), + INIT_RDMA_OBJ_SIZE(ib_qp, irdma_qp, ibqp), };/**
drivers/infiniband/hw/mlx4/main.c +1 -0
@@ -2577,6 +2577,7 @@ static const struct ib_device_ops mlx4_ib_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, mlx4_ib_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, mlx4_ib_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, mlx4_ib_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, mlx4_ib_qp, ibqp),INIT_RDMA_OBJ_SIZE (ib_srq, mlx4_ib_srq, ibsrq), INIT_RDMA_OBJ_SIZE(ib_ucontext, mlx4_ib_ucontext, ibucontext), };
drivers/infiniband/hw/mlx4/mlx4_ib.h +2 -3
@@ -792,9 +792,8 @@ void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index);int mlx4_ib_post_srq_recv (struct ib_srq *ibsrq,const struct ib_recv_wr *wr,const struct ib_recv_wr **bad_wr); -struct ib_qp *mlx4_ib_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int mlx4_ib_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int mlx4_ib_destroy_qp (struct ib_qp *qp,struct ib_udata *udata);void mlx4_ib_drain_sq (struct ib_qp *qp);void mlx4_ib_drain_rq (struct ib_qp *qp);
drivers/infiniband/hw/mlx4/qp.c +9 -16
@@ -1578,24 +1578,19 @@ static int _mlx4_ib_create_qp(struct ib_pd *pd, struct mlx4_ib_qp *qp,return 0 ; } -struct ib_qp *mlx4_ib_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata) { -struct ib_device *device = pd ? pd->device : init_attr->xrcd->device; +int mlx4_ib_create_qp (struct ib_qp *ibqp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata) +{ +struct ib_device *device = ibqp->device;struct mlx4_ib_dev *dev =to_mdev (device); -struct mlx4_ib_qp *qp; +struct mlx4_ib_qp *qp =to_mqp (ibqp); +struct ib_pd *pd = ibqp->pd;int ret; - qp =kzalloc (sizeof (*qp),GFP_KERNEL ); -if (!qp) -return ERR_PTR (-ENOMEM ); -mutex_init (&qp->mutex); ret =_mlx4_ib_create_qp (pd, qp, init_attr, udata); -if (ret) { -kfree (qp); -return ERR_PTR (ret); - } +if (ret) +return ret;if (init_attr->qp_type ==IB_QPT_GSI && !(init_attr->create_flags &MLX4_IB_QP_CREATE_ROCE_V2_GSI )) {
@@ -1618,7 +1613,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, init_attr->create_flags &= ~MLX4_IB_QP_CREATE_ROCE_V2_GSI ; } } -return &qp->ibqp; +return 0 ; }static int _mlx4_ib_destroy_qp (struct ib_qp *qp,struct ib_udata *udata)
@@ -1646,8 +1641,6 @@ static int _mlx4_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata) }kfree (mqp->sqp); -kfree (mqp); -return 0 ; }
drivers/infiniband/hw/mlx5/gsi.c +0 -2
@@ -193,8 +193,6 @@ int mlx5_ib_destroy_gsi(struct mlx5_ib_qp *mqp)kfree (gsi->outstanding_wrs);kfree (gsi->tx_qps); -kfree (mqp); -return 0 ; }
drivers/infiniband/hw/mlx5/main.c +1 -0
@@ -3805,6 +3805,7 @@ static const struct ib_device_ops mlx5_ib_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_counters, mlx5_ib_mcounters, ibcntrs),INIT_RDMA_OBJ_SIZE (ib_cq, mlx5_ib_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, mlx5_ib_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, mlx5_ib_qp, ibqp),INIT_RDMA_OBJ_SIZE (ib_srq, mlx5_ib_srq, ibsrq), INIT_RDMA_OBJ_SIZE(ib_ucontext, mlx5_ib_ucontext, ibucontext), };
drivers/infiniband/hw/mlx5/mlx5_ib.h +2 -3
@@ -1237,9 +1237,8 @@ int mlx5_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr, const struct ib_recv_wr **bad_wr);int mlx5_ib_enable_lb (struct mlx5_ib_dev *dev,bool td,bool qp);void mlx5_ib_disable_lb (struct mlx5_ib_dev *dev,bool td,bool qp); -struct ib_qp *mlx5_ib_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int mlx5_ib_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int mlx5_ib_modify_qp (struct ib_qp *ibqp,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata); int mlx5_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_mask,
drivers/infiniband/hw/mlx5/qp.c +17 -39
136 lines not on this page · raw message
drivers/infiniband/hw/mthca/mthca_provider.c +30 -47
156 lines not on this page · raw message
drivers/infiniband/hw/ocrdma/ocrdma_main.c +1 -0
@@ -185,6 +185,7 @@ static const struct ib_device_ops ocrdma_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, ocrdma_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, ocrdma_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, ocrdma_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, ocrdma_qp, ibqp), INIT_RDMA_OBJ_SIZE(ib_ucontext, ocrdma_ucontext, ibucontext), };
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +9 -16
@@ -1288,19 +1288,19 @@ static void ocrdma_store_gsi_qp_cq(struct ocrdma_dev *dev, } } -struct ib_qp *ocrdma_create_qp (struct ib_pd *ibpd, -struct ib_qp_init_attr *attrs, -struct ib_udata *udata) +int ocrdma_create_qp (struct ib_qp *ibqp,struct ib_qp_init_attr *attrs, +struct ib_udata *udata) {int status; +struct ib_pd *ibpd = ibqp->pd;struct ocrdma_pd *pd =get_ocrdma_pd (ibpd); -struct ocrdma_qp *qp; -struct ocrdma_dev *dev =get_ocrdma_dev (ibpd->device); +struct ocrdma_qp *qp =get_ocrdma_qp (ibqp); +struct ocrdma_dev *dev =get_ocrdma_dev (ibqp->device);struct ocrdma_create_qp_ureq ureq;u16 dpp_credit_lmt, dpp_offset;if (attrs->create_flags) -return ERR_PTR (-EOPNOTSUPP ); +return -EOPNOTSUPP ; status =ocrdma_check_qp_params (ibpd, dev, attrs, udata);if (status)
@@ -1309,12 +1309,7 @@ struct ib_qp *ocrdma_create_qp(struct ib_pd *ibpd,memset (&ureq,0 ,sizeof (ureq));if (udata) {if (ib_copy_from_udata (&ureq, udata,sizeof (ureq))) -return ERR_PTR (-EFAULT ); - } - qp =kzalloc (sizeof (*qp),GFP_KERNEL ); -if (!qp) { - status = -ENOMEM ; - goto gen_err; +return -EFAULT ; }ocrdma_set_qp_init_params (qp, pd, attrs);if (udata ==NULL )
@@ -1349,7 +1344,7 @@ struct ib_qp *ocrdma_create_qp(struct ib_pd *ibpd,ocrdma_store_gsi_qp_cq (dev, attrs); qp->ibqp.qp_num = qp->id;mutex_unlock (&dev->dev_lock); -return &qp->ibqp; +return 0 ; cpy_err:ocrdma_del_qpn_map (dev, qp);
@@ -1359,10 +1354,9 @@ struct ib_qp *ocrdma_create_qp(struct ib_pd *ibpd,mutex_unlock (&dev->dev_lock);kfree (qp->wqe_wr_id_tbl);kfree (qp->rqe_wr_id_tbl); -kfree (qp);pr_err ("%s(%d) error=%d\n" , __func__, dev->id, status); gen_err: -return ERR_PTR (status); +return status; } int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
@@ -1731,7 +1725,6 @@ int ocrdma_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)kfree (qp->wqe_wr_id_tbl);kfree (qp->rqe_wr_id_tbl); -kfree (qp);return 0 ; }
drivers/infiniband/hw/ocrdma/ocrdma_verbs.h +2 -3
@@ -75,9 +75,8 @@ int ocrdma_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,int ocrdma_resize_cq (struct ib_cq *,int cqe,struct ib_udata *);int ocrdma_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata); -struct ib_qp *ocrdma_create_qp (struct ib_pd *, -struct ib_qp_init_attr *attrs, -struct ib_udata *); +int ocrdma_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *attrs, +struct ib_udata *udata);int _ocrdma_modify_qp (struct ib_qp *,struct ib_qp_attr *attr,int attr_mask); int ocrdma_modify_qp(struct ib_qp *, struct ib_qp_attr *attr,
drivers/infiniband/hw/qedr/main.c +1 -0
@@ -233,6 +233,7 @@ static const struct ib_device_ops qedr_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, qedr_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, qedr_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, qedr_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, qedr_qp, ibqp),INIT_RDMA_OBJ_SIZE (ib_srq, qedr_srq, ibsrq),INIT_RDMA_OBJ_SIZE (ib_xrcd, qedr_xrcd, ibxrcd), INIT_RDMA_OBJ_SIZE(ib_ucontext, qedr_ucontext, ibucontext),
drivers/infiniband/hw/qedr/qedr_roce_cm.c +6 -7
@@ -319,20 +319,19 @@ static int qedr_ll2_start(struct qedr_dev *dev,return rc; } -struct ib_qp *qedr_create_gsi_qp (struct qedr_dev *dev, -struct ib_qp_init_attr *attrs, -struct qedr_qp *qp) +int qedr_create_gsi_qp (struct qedr_dev *dev,struct ib_qp_init_attr *attrs, +struct qedr_qp *qp) {int rc; rc =qedr_check_gsi_qp_attrs (dev, attrs);if (rc) -return ERR_PTR (rc); +return rc; rc =qedr_ll2_start (dev, attrs, qp);if (rc) {DP_ERR (dev,"create gsi qp: failed on ll2 start. rc=%d\n" , rc); -return ERR_PTR (rc); +return rc; }/* create QP */
@@ -359,7 +358,7 @@ struct ib_qp *qedr_create_gsi_qp(struct qedr_dev *dev,DP_DEBUG (dev,QEDR_MSG_GSI ,"created GSI QP %p\n" , qp); -return &qp->ibqp; +return 0 ; err:kfree (qp->rqe_wr_id);
@@ -368,7 +367,7 @@ struct ib_qp *qedr_create_gsi_qp(struct qedr_dev *dev,if (rc)DP_ERR (dev,"create gsi qp: failed destroy on create\n" ); -return ERR_PTR (-ENOMEM ); +return -ENOMEM ; }int qedr_destroy_gsi_qp (struct qedr_dev *dev)
drivers/infiniband/hw/qedr/qedr_roce_cm.h +2 -3
@@ -50,9 +50,8 @@ int qedr_gsi_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr, const struct ib_recv_wr **bad_wr);int qedr_gsi_post_send (struct ib_qp *ibqp,const struct ib_send_wr *wr,const struct ib_send_wr **bad_wr); -struct ib_qp *qedr_create_gsi_qp (struct qedr_dev *dev, -struct ib_qp_init_attr *attrs, -struct qedr_qp *qp); +int qedr_create_gsi_qp (struct qedr_dev *dev,struct ib_qp_init_attr *attrs, +struct qedr_qp *qp);void qedr_store_gsi_qp_cq (struct qedr_dev *dev,struct qedr_qp *qp,struct ib_qp_init_attr *attrs);int qedr_destroy_gsi_qp (struct qedr_dev *dev);
drivers/infiniband/hw/qedr/verbs.c +15 -34
98 lines not on this page · raw message
drivers/infiniband/hw/qedr/verbs.h +2 -2
@@ -56,8 +56,8 @@ int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,int qedr_resize_cq (struct ib_cq *,int cqe,struct ib_udata *);int qedr_destroy_cq (struct ib_cq *ibcq,struct ib_udata *udata);int qedr_arm_cq (struct ib_cq *ibcq,enum ib_cq_notify_flags flags); -struct ib_qp *qedr_create_qp (struct ib_pd *,struct ib_qp_init_attr *attrs, -struct ib_udata *); +int qedr_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *attrs, +struct ib_udata *udata);int qedr_modify_qp (struct ib_qp *,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata); int qedr_query_qp(struct ib_qp *, struct ib_qp_attr *qp_attr,
drivers/infiniband/hw/usnic/usnic_ib_main.c +1 -0
@@ -360,6 +360,7 @@ static const struct ib_device_ops usnic_dev_ops = { .reg_user_mr = usnic_ib_reg_mr,INIT_RDMA_OBJ_SIZE (ib_pd, usnic_ib_pd, ibpd),INIT_RDMA_OBJ_SIZE (ib_cq, usnic_ib_cq, ibcq), +INIT_RDMA_OBJ_SIZE (ib_qp, usnic_ib_qp_grp, ibqp), INIT_RDMA_OBJ_SIZE(ib_ucontext, usnic_ib_ucontext, ibucontext), };
drivers/infiniband/hw/usnic/usnic_ib_qp_grp.c +12 -22
@@ -665,13 +665,12 @@ static int qp_grp_id_from_flow(struct usnic_ib_qp_grp_flow *qp_flow,return 0 ; } -struct usnic_ib_qp_grp * -usnic_ib_qp_grp_create (struct usnic_fwd_dev *ufdev,struct usnic_ib_vf *vf, -struct usnic_ib_pd *pd, -struct usnic_vnic_res_spec *res_spec, -struct usnic_transport_spec *transport_spec) +int usnic_ib_qp_grp_create (struct usnic_ib_qp_grp *qp_grp, +struct usnic_fwd_dev *ufdev,struct usnic_ib_vf *vf, +struct usnic_ib_pd *pd, +struct usnic_vnic_res_spec *res_spec, +struct usnic_transport_spec *transport_spec) { -struct usnic_ib_qp_grp *qp_grp;int err;enum usnic_transport_type transport = transport_spec->trans_type;struct usnic_ib_qp_grp_flow *qp_flow;
@@ -684,20 +683,15 @@ usnic_ib_qp_grp_create(struct usnic_fwd_dev *ufdev, struct usnic_ib_vf *vf,usnic_err ("Spec does not meet minimum req for transport %d\n" , transport);log_spec (res_spec); -return ERR_PTR (err); +return err; } - qp_grp =kzalloc (sizeof (*qp_grp),GFP_ATOMIC ); -if (!qp_grp) -return NULL ; - qp_grp->res_chunk_list =alloc_res_chunk_list (vf->vnic, res_spec, qp_grp); -if (IS_ERR_OR_NULL (qp_grp->res_chunk_list)) { - err = qp_grp->res_chunk_list ? -PTR_ERR (qp_grp->res_chunk_list) : -ENOMEM ; - goto out_free_qp_grp; - } +if (IS_ERR_OR_NULL (qp_grp->res_chunk_list)) +return qp_grp->res_chunk_list ? +PTR_ERR (qp_grp->res_chunk_list) : + -ENOMEM ; err =qp_grp_and_vf_bind (vf, pd, qp_grp);if (err)
@@ -724,7 +718,7 @@ usnic_ib_qp_grp_create(struct usnic_fwd_dev *ufdev, struct usnic_ib_vf *vf,usnic_ib_sysfs_qpn_add (qp_grp); -return qp_grp; +return 0 ; out_release_flow:release_and_remove_flow (qp_flow);
@@ -732,10 +726,7 @@ usnic_ib_qp_grp_create(struct usnic_fwd_dev *ufdev, struct usnic_ib_vf *vf,qp_grp_and_vf_unbind (qp_grp); out_free_res:free_qp_grp_res (qp_grp->res_chunk_list); -out_free_qp_grp: -kfree (qp_grp); - -return ERR_PTR (err); +return err; }void usnic_ib_qp_grp_destroy (struct usnic_ib_qp_grp *qp_grp)
@@ -748,7 +739,6 @@ void usnic_ib_qp_grp_destroy(struct usnic_ib_qp_grp *qp_grp)usnic_ib_sysfs_qpn_remove (qp_grp);qp_grp_and_vf_unbind (qp_grp);free_qp_grp_res (qp_grp->res_chunk_list); -kfree (qp_grp); } struct usnic_vnic_res_chunk*
drivers/infiniband/hw/usnic/usnic_ib_qp_grp.h +5 -5
@@ -89,11 +89,11 @@ extern const struct usnic_vnic_res_spec min_transport_spec[USNIC_TRANSPORT_MAX];const char *usnic_ib_qp_grp_state_to_string (enum ib_qp_state state);int usnic_ib_qp_grp_dump_hdr (char *buf,int buf_sz);int usnic_ib_qp_grp_dump_rows (void *obj,char *buf,int buf_sz); -struct usnic_ib_qp_grp * -usnic_ib_qp_grp_create (struct usnic_fwd_dev *ufdev,struct usnic_ib_vf *vf, -struct usnic_ib_pd *pd, -struct usnic_vnic_res_spec *res_spec, -struct usnic_transport_spec *trans_spec); +int usnic_ib_qp_grp_create (struct usnic_ib_qp_grp *qp, +struct usnic_fwd_dev *ufdev,struct usnic_ib_vf *vf, +struct usnic_ib_pd *pd, +struct usnic_vnic_res_spec *res_spec, +struct usnic_transport_spec *trans_spec);void usnic_ib_qp_grp_destroy (struct usnic_ib_qp_grp *qp_grp); int usnic_ib_qp_grp_modify(struct usnic_ib_qp_grp *qp_grp, enum ib_qp_state new_state,
drivers/infiniband/hw/usnic/usnic_ib_verbs.c +32 -37
165 lines not on this page · raw message
drivers/infiniband/hw/usnic/usnic_ib_verbs.h +2 -3
@@ -50,9 +50,8 @@ int usnic_ib_query_gid(struct ib_device *ibdev, u32 port, int index, union ib_gid *gid);int usnic_ib_alloc_pd (struct ib_pd *ibpd,struct ib_udata *udata);int usnic_ib_dealloc_pd (struct ib_pd *pd,struct ib_udata *udata); -struct ib_qp *usnic_ib_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int usnic_ib_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int usnic_ib_destroy_qp (struct ib_qp *qp,struct ib_udata *udata);int usnic_ib_modify_qp (struct ib_qp *ibqp,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata);
drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c +1 -0
@@ -185,6 +185,7 @@ static const struct ib_device_ops pvrdma_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, pvrdma_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, pvrdma_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, pvrdma_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, pvrdma_qp, ibqp), INIT_RDMA_OBJ_SIZE(ib_ucontext, pvrdma_ucontext, ibucontext), };
drivers/infiniband/hw/vmw_pvrdma/pvrdma_qp.c +21 -32
144 lines not on this page · raw message
drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h +2 -3
@@ -390,9 +390,8 @@ int pvrdma_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,int pvrdma_query_srq (struct ib_srq *srq,struct ib_srq_attr *srq_attr);int pvrdma_destroy_srq (struct ib_srq *srq,struct ib_udata *udata); -struct ib_qp *pvrdma_create_qp (struct ib_pd *pd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int pvrdma_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int pvrdma_modify_qp (struct ib_qp *ibqp,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata); int pvrdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
drivers/infiniband/sw/rdmavt/qp.c +34 -57
233 lines not on this page · raw message
drivers/infiniband/sw/rdmavt/qp.h +2 -3
@@ -52,9 +52,8 @@int rvt_driver_qp_init (struct rvt_dev_info *rdi);void rvt_qp_exit (struct rvt_dev_info *rdi); -struct ib_qp *rvt_create_qp (struct ib_pd *ibpd, -struct ib_qp_init_attr *init_attr, -struct ib_udata *udata); +int rvt_create_qp (struct ib_qp *ibqp,struct ib_qp_init_attr *init_attr, +struct ib_udata *udata);int rvt_modify_qp (struct ib_qp *ibqp,struct ib_qp_attr *attr,int attr_mask,struct ib_udata *udata);int rvt_destroy_qp (struct ib_qp *ibqp,struct ib_udata *udata);
drivers/infiniband/sw/rdmavt/vt.c +9 -0
@@ -131,6 +131,13 @@ static int rvt_query_device(struct ib_device *ibdev,return 0 ; } +static int rvt_get_numa_node (struct ib_device *ibdev) +{ +struct rvt_dev_info *rdi =ib_to_rvt (ibdev); + +return rdi->dparms.node; +} +static int rvt_modify_device (struct ib_device *device,int device_modify_mask,struct ib_device_modify *device_modify)
@@ -380,6 +387,7 @@ static const struct ib_device_ops rvt_dev_ops = { .destroy_srq = rvt_destroy_srq, .detach_mcast = rvt_detach_mcast, .get_dma_mr = rvt_get_dma_mr, + .get_numa_node = rvt_get_numa_node, .get_port_immutable = rvt_get_port_immutable, .map_mr_sg = rvt_map_mr_sg, .mmap = rvt_mmap,
@@ -406,6 +414,7 @@ static const struct ib_device_ops rvt_dev_ops = {INIT_RDMA_OBJ_SIZE (ib_ah, rvt_ah, ibah),INIT_RDMA_OBJ_SIZE (ib_cq, rvt_cq, ibcq),INIT_RDMA_OBJ_SIZE (ib_pd, rvt_pd, ibpd), +INIT_RDMA_OBJ_SIZE (ib_qp, rvt_qp, ibqp),INIT_RDMA_OBJ_SIZE (ib_srq, rvt_srq, ibsrq), INIT_RDMA_OBJ_SIZE(ib_ucontext, rvt_ucontext, ibucontext), };
drivers/infiniband/sw/rxe/rxe_pool.c +1 -1
@@ -41,7 +41,7 @@ struct rxe_type_info rxe_type_info[RXE_NUM_TYPES] = { .size = sizeof(struct rxe_qp), .elem_offset = offsetof(struct rxe_qp, pelem), .cleanup = rxe_qp_cleanup, - .flags = RXE_POOL_INDEX, + .flags = RXE_POOL_INDEX | RXE_POOL_NO_ALLOC, .min_index = RXE_MIN_QP_INDEX, .max_index = RXE_MAX_QP_INDEX, },
drivers/infiniband/sw/rxe/rxe_verbs.c +21 -27
86 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_verbs.h +1 -1
@@ -210,8 +210,8 @@ struct rxe_resp_info { };struct rxe_qp { -struct rxe_pool_entry pelem;struct ib_qp ibqp; +struct rxe_pool_entry pelem;struct ib_qp_attr attr;unsigned int valid;unsigned int mtu;
drivers/infiniband/sw/siw/siw_main.c +1 -0
@@ -297,6 +297,7 @@ static const struct ib_device_ops siw_device_ops = {INIT_RDMA_OBJ_SIZE (ib_cq, siw_cq, base_cq),INIT_RDMA_OBJ_SIZE (ib_pd, siw_pd, base_pd), +INIT_RDMA_OBJ_SIZE (ib_qp, siw_qp, base_qp),INIT_RDMA_OBJ_SIZE (ib_srq, siw_srq, base_srq), INIT_RDMA_OBJ_SIZE(ib_ucontext, siw_ucontext, base_ucontext), };
drivers/infiniband/sw/siw/siw_qp.c +0 -2
@@ -1344,6 +1344,4 @@ void siw_free_qp(struct kref *ref)siw_put_tx_cpu (qp->tx_cpu);atomic_dec (&sdev->num_qp); -siw_dbg_qp (qp,"free QP\n" ); -kfree_rcu (qp, rcu); }
drivers/infiniband/sw/siw/siw_verbs.c +23 -31
118 lines not on this page · raw message
drivers/infiniband/sw/siw/siw_verbs.h +2 -3
@@ -50,9 +50,8 @@ int siw_query_gid(struct ib_device *base_dev, u32 port, int idx, union ib_gid *gid);int siw_alloc_pd (struct ib_pd *base_pd,struct ib_udata *udata);int siw_dealloc_pd (struct ib_pd *base_pd,struct ib_udata *udata); -struct ib_qp *siw_create_qp (struct ib_pd *base_pd, -struct ib_qp_init_attr *attr, -struct ib_udata *udata); +int siw_create_qp (struct ib_qp *qp,struct ib_qp_init_attr *attr, +struct ib_udata *udata);int siw_query_qp (struct ib_qp *base_qp,struct ib_qp_attr *qp_attr,int qp_attr_mask,struct ib_qp_init_attr *qp_init_attr); int siw_verbs_modify_qp(struct ib_qp *base_qp, struct ib_qp_attr *attr,
include/rdma/ib_verbs.h +25 -5
@@ -2268,8 +2268,13 @@ struct iw_cm_conn_param; !__same_type(((struct drv_struct *)NULL)->member, \ struct ib_struct))) -#define rdma_zalloc_drv_obj_gfp (ib_dev, ib_type, gfp) \ - ((struct ib_type *)kzalloc(ib_dev->ops.size_##ib_type, gfp)) +#define rdma_zalloc_drv_obj_gfp (ib_dev, ib_type, gfp) \ + ((struct ib_type *)rdma_zalloc_obj(ib_dev, ib_dev->ops.size_##ib_type, \ + gfp, false)) + +#define rdma_zalloc_drv_obj_numa (ib_dev, ib_type) \ + ((struct ib_type *)rdma_zalloc_obj(ib_dev, ib_dev->ops.size_##ib_type, \ + GFP_KERNEL, true))#define rdma_zalloc_drv_obj (ib_dev, ib_type) \ rdma_zalloc_drv_obj_gfp(ib_dev, ib_type, GFP_KERNEL)
@@ -2435,9 +2440,8 @@ struct ib_device_ops { struct ib_udata *udata);int (*query_srq)(struct ib_srq *srq,struct ib_srq_attr *srq_attr);int (*destroy_srq)(struct ib_srq *srq,struct ib_udata *udata); -struct ib_qp *(*create_qp)(struct ib_pd *pd, -struct ib_qp_init_attr *qp_init_attr, -struct ib_udata *udata); +int (*create_qp)(struct ib_qp *qp,struct ib_qp_init_attr *qp_init_attr, +struct ib_udata *udata);int (*modify_qp)(struct ib_qp *qp,struct ib_qp_attr *qp_attr,int qp_attr_mask,struct ib_udata *udata); int (*query_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
@@ -2635,11 +2639,18 @@ struct ib_device_ops {int (*query_ucontext)(struct ib_ucontext *context,struct uverbs_attr_bundle *attrs); +/* +* Provide NUMA node. This API exists for rdmavt/hfi1 only. +* Everyone else relies on Linux memory management model. +*/ +int (*get_numa_node)(struct ib_device *dev); +DECLARE_RDMA_OBJ_SIZE (ib_ah);DECLARE_RDMA_OBJ_SIZE (ib_counters);DECLARE_RDMA_OBJ_SIZE (ib_cq);DECLARE_RDMA_OBJ_SIZE (ib_mw);DECLARE_RDMA_OBJ_SIZE (ib_pd); +DECLARE_RDMA_OBJ_SIZE (ib_qp);DECLARE_RDMA_OBJ_SIZE (ib_rwq_ind_table);DECLARE_RDMA_OBJ_SIZE (ib_srq);DECLARE_RDMA_OBJ_SIZE (ib_ucontext);
@@ -2746,6 +2757,15 @@ struct ib_device {u32 lag_flags; }; +static inline void *rdma_zalloc_obj (struct ib_device *dev,size_t size, +gfp_t gfp,bool is_numa_aware) +{ +if (is_numa_aware && dev->ops.get_numa_node) +return kzalloc_node (size, gfp, dev->ops.get_numa_node (dev)); + +return kzalloc (size, gfp); +} +struct ib_client_nl_info ;struct ib_client {const char *name;
Signature · 1 line
2.31.1
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
Quoted 7 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
Signed-off-by Leon Romanovsky <[email protected]>
EFA and core parts look good to me.
include/rdma/ib_verbs.h struct ib_device { · line 2763
Quoted 4 lines
include/rdma/ib_verbs.h +4
-0+static inline void *rdma_zalloc_obj (struct ib_device *dev,size_t size, +gfp_t gfp,bool is_numa_aware) +{ +if (is_numa_aware && dev->ops.get_numa_node)
Honestly I think it's better to return an error if a numa aware allocation is requested and get_numa_node is not provided.
Quoted 4 lines
include/rdma/ib_verbs.h +4
-0+return kzalloc_node (size, gfp, dev->ops.get_numa_node (dev)); + +return kzalloc (size, gfp); +}
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
Quoted 7 lines · Gal Pressman
Quoted 6 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
Quoted 5 lines
Quoted 1 line
Signed-off-by Leon Romanovsky <[email protected]>EFA and core parts look good to me.
Reviewed-by Gal Pressman <[email protected]>Tested-by Gal Pressman <[email protected]>
Thanks a lot.
Quoted 8 lines
include/rdma/ib_verbs.h struct ib_device { · line 2763
Quoted 5 lines
include/rdma/ib_verbs.h +4
-0+static inline void *rdma_zalloc_obj (struct ib_device *dev,size_t size, +gfp_t gfp,bool is_numa_aware) +{ +if (is_numa_aware && dev->ops.get_numa_node)Honestly I think it's better to return an error if a numa aware allocation is requested and
get_numa_nodeis not provided.
We don't want any driver to use and implement ".get_numa_node()" callback.
Initially, I thought about adding WARN_ON(driver_id != HFI && .get_numa_node) to the device.c, but decided to stay with comment in ib_verbs.h only.
Quoted 5 lines
Quoted 5 lines
include/rdma/ib_verbs.h +4
-0+return kzalloc_node (size, gfp, dev->ops.get_numa_node (dev)); + +return kzalloc (size, gfp); +}
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
Quoted 8 lines · Leon Romanovsky
Quoted 7 lines · Gal Pressman
Quoted 6 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
Quoted 5 lines
Quoted 5 lines
Quoted 1 line
Signed-off-by Leon Romanovsky <[email protected]>EFA and core parts look good to me.
Reviewed-by Gal Pressman <[email protected]>Tested-by Gal Pressman <[email protected]>
Leon, I pulled your tree and tested, things look good so far.
For rdmavt and core:
Quoted 11 lines
Thanks a lot.
Quoted 8 lines
include/rdma/ib_verbs.h struct ib_device { · line 2763
Quoted 5 lines
include/rdma/ib_verbs.h +4
-0+static inline void *rdma_zalloc_obj (struct ib_device *dev,size_t size, +gfp_t gfp,bool is_numa_aware) +{ +if (is_numa_aware && dev->ops.get_numa_node)Honestly I think it's better to return an error if a numa aware allocation is requested and
get_numa_nodeis not provided.
Quoted 4 lines
We don't want any driver to use and implement ".get_numa_node()" callback.
Initially, I thought about adding
WARN_ON(driver_id != HFI && .get_numa_node)to thedevice.c, but decided to stay with comment inib_verbs.honly.
Maybe you could update that comment and add that it's for performance? This way its clear we are different for a reason. I'd be fine adding a WARN_ON_ONCE like you mention here. I don't think we need to fail the call but drawing attention to it would not necessarily be a bad thing. Either way, RB/TB for me stands.
-Denny
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
Quoted 15 lines · Dennis Dalessandro
Quoted 8 lines · Leon Romanovsky
Quoted 7 lines · Gal Pressman
Quoted 6 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
Quoted 5 lines
Quoted 5 lines
Quoted 1 line
Signed-off-by Leon Romanovsky <[email protected]>EFA and core parts look good to me.
Reviewed-by Gal Pressman <[email protected]>Tested-by Gal Pressman <[email protected]>
Quoted 5 lines
Leon, I pulled your tree and tested, things look good so far.
For rdmavt and core:
Reviewed-by Dennis Dalessandro <[email protected]>Tested-by Dennis Dalessandro <[email protected]>
Thanks
Quoted 15 lines
Quoted 15 lines
Thanks a lot.
Quoted 8 lines
include/rdma/ib_verbs.h struct ib_device { · line 2763
Quoted 5 lines
include/rdma/ib_verbs.h +4
-0+static inline void *rdma_zalloc_obj (struct ib_device *dev,size_t size, +gfp_t gfp,bool is_numa_aware) +{ +if (is_numa_aware && dev->ops.get_numa_node)Honestly I think it's better to return an error if a numa aware allocation is requested and
get_numa_nodeis not provided.We don't want any driver to use and implement ".get_numa_node()" callback.
Quoted 7 lines
Quoted 2 lines
Initially, I thought about adding
WARN_ON(driver_id != HFI && .get_numa_node)to thedevice.c, but decided to stay with comment inib_verbs.honly.Maybe you could update that comment and add that it's for performance? This way its clear we are different for a reason. I'd be fine adding a
WARN_ON_ONCElike you mention here. I don't think we need to fail the call but drawing attention to it would not necessarily be a bad thing. Either way, RB/TB for me stands.
The thing is that performance gain is achieved in very specific artificial use case, while we can think about other scenario where such allocation will give different results.
For the performance test, Mike forced to have QP and device to be in different NUMA nodes, while in reality such situation is possible only if memory on the local node is depleted and it is better to have working system instead of current situation where node request will fail.
I don't want to give wrong impression that numa node allocations are better for performance.
Thanks
Quoted 4 lines
-Denny
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
In reply to Leon RomanovskyQuoted 7 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
Signed-off-by Leon Romanovsky <[email protected]>
Hi, Leon, I tested your patchset, it looks good to hns. But there is a redundant assignment in hns. This is the patch.
drivers/infiniband/hw/hns/hns_roce_qp.c +0 -2
@@ -959,8 +959,6 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,struct ib_device *ibdev = &hr_dev->ib_dev;int ret; - hr_qp->ibqp.qp_type = init_attr->qp_type; -if (init_attr->cap.max_inline_data > hr_dev->caps.max_sq_inline) init_attr->cap.max_inline_data = hr_dev->caps.max_sq_inline;
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
Quoted 9 lines · Wenpeng Liang
Quoted 6 lines · Leon Romanovsky
From: Leon Romanovsky <[email protected]>
Convert QP object to follow IB/core general allocation scheme. That change allows us to make sure that restrack properly kref the memory.
Quoted 5 lines
Quoted 1 line
Signed-off-by Leon Romanovsky <[email protected]>Hi, Leon, I tested your patchset, it looks good to hns. But there is a redundant assignment in hns. This is the patch.
Thanks a lot.
Quoted 13 lines
drivers/infiniband/hw/hns/hns_roce_qp.c +0
-2@@ -959,8 +959,6 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,struct ib_device *ibdev = &hr_dev->ib_dev;int ret; - hr_qp->ibqp.qp_type = init_attr->qp_type; -if (init_attr->cap.max_inline_data > hr_dev->caps.max_sq_inline) init_attr->cap.max_inline_data = hr_dev->caps.max_sq_inline;
Re: [PATCH rdma-next 8/9] RDMA: Globally allocate and release QP memory
In reply to Leon RomanovskyQuoted 7 lines · Leon Romanovsky
drivers/infiniband/core/core_priv.h +3
-0+ qp =rdma_zalloc_drv_obj_numa (dev, ib_qp); +if (!qp) +return ERR_PTR (-ENOMEM ); qp->device = dev; qp->pd = pd;
drivers/infiniband/core/core_priv.h _ib_create_qp(struct ib_device *dev, struct ib_pd *pd, · line 342
Quoted 7 lines
drivers/infiniband/core/core_priv.h +0
-2@@ -337,14 +338,11 @@ _ib_create_qp(struct ib_device *dev, struct ib_pd *pd, qp->qp_type = attr->qp_type; qp->rwq_ind_tbl = attr->rwq_ind_tbl; - qp->send_cq = attr->send_cq; - qp->recv_cq = attr->recv_cq; qp->srq = attr->srq; qp->rwq_ind_tbl = attr->rwq_ind_tbl;
Hi, Leon, "qp->rwq_ind_tbl = attr->rwq_ind_tbl;" seems to be duplicate, would you consider deleting one of them in this patchset?
PATCH 9/9 RDMA/mlx5: Drop in-driver verbs object creations
In reply to Leon RomanovskyFrom: Leon Romanovsky <[email protected]>
There is no real value in bypassing IB/core APIs for creating standard objects with standard types. The open-coded variant didn't have any restrack task management calls and caused to such objects to be not present when running rdmatoool.
--- drivers/infiniband/core/verbs.c | 7 ++- drivers/infiniband/hw/mlx5/main.c | 92 +++++++------------------------ 2 files changed, 25 insertions(+), 74 deletions(-)
drivers/infiniband/core/verbs.c +4 -3
@@ -1035,7 +1035,8 @@ struct ib_srq *ib_create_srq_user(struct ib_pd *pd, }if (srq->srq_type ==IB_SRQT_XRC ) { srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd; -atomic_inc (&srq->ext.xrc.xrcd->usecnt); +if (srq->ext.xrc.xrcd) +atomic_inc (&srq->ext.xrc.xrcd->usecnt); }atomic_inc (&pd->usecnt);
@@ -1046,7 +1047,7 @@ struct ib_srq *ib_create_srq_user(struct ib_pd *pd,if (ret) {rdma_restrack_put (&srq->res);atomic_dec (&srq->pd->usecnt); -if (srq->srq_type ==IB_SRQT_XRC ) +if (srq->srq_type ==IB_SRQT_XRC && srq->ext.xrc.xrcd)atomic_dec (&srq->ext.xrc.xrcd->usecnt);if (ib_srq_has_cq (srq->srq_type))atomic_dec (&srq->ext.cq->usecnt);
@@ -1090,7 +1091,7 @@ int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)return ret;atomic_dec (&srq->pd->usecnt); -if (srq->srq_type ==IB_SRQT_XRC ) +if (srq->srq_type ==IB_SRQT_XRC && srq->ext.xrc.xrcd)atomic_dec (&srq->ext.xrc.xrcd->usecnt);if (ib_srq_has_cq (srq->srq_type))atomic_dec (&srq->ext.cq->usecnt);
drivers/infiniband/hw/mlx5/main.c +21 -71
136 lines not on this page · raw message
Signature · 1 line
2.31.1