RDMA: Use proper driver data response structs instead of open coding

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 <jgg@nvidia.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Jason Gunthorpe 2026-05-11 21:09:37 -03:00 committed by Leon Romanovsky
parent 0d10dd1388
commit 89a4974009
5 changed files with 48 additions and 24 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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_wrid;
}
}
init_attr->attr.max_wr = srq->msrq.max - 1;

View File

@ -950,6 +950,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);
@ -1016,10 +1017,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;

View File

@ -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;