At some point the response structs were added and rdma-core is using them, but the kernel was not changed to use them as well. Replace the open-coded copy with the right struct and ib_respond_udata().
Signed-off-by: Jason Gunthorpe <[email protected]> --- drivers/infiniband/hw/mlx4/cq.c | 7 ++-- drivers/infiniband/hw/mlx4/main.c | 11 ++++-- drivers/infiniband/hw/mlx4/srq.c | 12 ++++--- drivers/infiniband/hw/mlx5/cq.c | 7 ++-- drivers/infiniband/hw/mthca/mthca_provider.c | 35 ++++++++++++++------ 5 files changed, 48 insertions(+), 24 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 7a6eb602d4a6de..7e4505f6c78b30 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c @@ -142,6 +142,7 @@ int mlx4_ib_create_user_cq(struct ib_cq *ibcq, { struct ib_udata *udata = &attrs->driver_udata; struct ib_device *ibdev = ibcq->device; + struct mlx4_ib_create_cq_resp uresp = {}; int entries = attr->cqe; int vector = attr->comp_vector; struct mlx4_ib_dev *dev = to_mdev(ibdev); @@ -219,10 +220,10 @@ int mlx4_ib_create_user_cq(struct ib_cq *ibcq, cq->mcq.event = mlx4_ib_cq_event; cq->mcq.usage = MLX4_RES_USAGE_USER_VERBS; - if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof(__u32))) { - err = -EFAULT; + uresp.cqn = cq->mcq.cqn; + err = ib_respond_udata(udata, uresp); + if (err) goto err_cq_free; - } return 0; diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 4b187ec9e01738..25f9738bd77223 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -1199,9 +1199,14 @@ static int mlx4_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) if (err) return err; - if (udata && ib_copy_to_udata(udata, &pd->pdn, sizeof(__u32))) { - mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn); - return -EFAULT; + if (udata) { + struct mlx4_ib_alloc_pd_resp uresp = { .pdn = pd->pdn }; + + err = ib_respond_udata(udata, uresp); + if (err) { + mlx4_pd_free(to_mdev(ibdev)->dev, pd->pdn); + return err; + } } return 0; } diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c index 767840736d583b..dd868f9b893d70 100644 --- a/drivers/infiniband/hw/mlx4/srq.c +++ b/drivers/infiniband/hw/mlx4/srq.c @@ -191,11 +191,15 @@ int mlx4_ib_create_srq(struct ib_srq *ib_srq, srq->msrq.event = mlx4_ib_srq_event; srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn; - if (udata) - if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) { - err = -EFAULT; + if (udata) { + struct mlx4_ib_create_srq_resp uresp = { + .srqn = srq->msrq.srqn + }; + + err = ib_respond_udata(udata, uresp); + if (err) goto err_srq; - } + } init_attr->attr.max_wr = srq->msrq.max - 1; diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c index a76b7a36087d98..c548d4dfbbc96a 100644 --- a/drivers/infiniband/hw/mlx5/cq.c +++ b/drivers/infiniband/hw/mlx5/cq.c @@ -949,6 +949,7 @@ int mlx5_ib_create_user_cq(struct ib_cq *ibcq, { struct ib_udata *udata = &attrs->driver_udata; struct ib_device *ibdev = ibcq->device; + struct mlx5_ib_create_cq_resp uresp = {}; int entries = attr->cqe; int vector = attr->comp_vector; struct mlx5_ib_dev *dev = to_mdev(ibdev); @@ -1015,10 +1016,10 @@ int mlx5_ib_create_user_cq(struct ib_cq *ibcq, INIT_LIST_HEAD(&cq->wc_list); - if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof(__u32))) { - err = -EFAULT; + uresp.cqn = cq->mcq.cqn; + err = ib_respond_udata(udata, uresp); + if (err) goto err_cmd; - } kvfree(cqb); return 0; diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index 07c60797c86091..afa97d3801f783 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c @@ -357,9 +357,12 @@ static int mthca_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata) return err; if (udata) { - if (ib_copy_to_udata(udata, &pd->pd_num, sizeof (__u32))) { + struct mthca_alloc_pd_resp uresp = { .pdn = pd->pd_num }; + + err = ib_respond_udata(udata, uresp); + if (err) { mthca_pd_free(to_mdev(ibdev), pd); - return -EFAULT; + return err; } } @@ -428,11 +431,17 @@ static int mthca_create_srq(struct ib_srq *ibsrq, if (err) return err; - if (context && ib_copy_to_udata(udata, &srq->srqn, sizeof(__u32))) { - mthca_free_srq(to_mdev(ibsrq->device), srq); - mthca_unmap_user_db(to_mdev(ibsrq->device), &context->uar, - context->db_tab, ucmd.db_index); - return -EFAULT; + if (context) { + struct mthca_create_srq_resp uresp = { .srqn = srq->srqn }; + + err = ib_respond_udata(udata, uresp); + if (err) { + mthca_free_srq(to_mdev(ibsrq->device), srq); + mthca_unmap_user_db(to_mdev(ibsrq->device), + &context->uar, context->db_tab, + ucmd.db_index); + return err; + } } return 0; @@ -631,10 +640,14 @@ static int mthca_create_cq(struct ib_cq *ibcq, if (err) goto err_unmap_arm; - if (udata && ib_copy_to_udata(udata, &cq->cqn, sizeof(__u32))) { - mthca_free_cq(to_mdev(ibdev), cq); - err = -EFAULT; - goto err_unmap_arm; + if (udata) { + struct mthca_create_cq_resp uresp = { .cqn = cq->cqn }; + + err = ib_respond_udata(udata, uresp); + if (err) { + mthca_free_cq(to_mdev(ibdev), cq); + goto err_unmap_arm; + } } cq->resize_buf = NULL; -- 2.43.0
