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


Reply via email to