From: Leon Romanovsky <leon@kernel.org>
To: Konstantin Taranov <kotaranov@linux.microsoft.com>
Cc: kotaranov@microsoft.com, longli@microsoft.com, jgg@ziepe.ca,
linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH rdma-next v3] RDMA/mana_ib: Adopt robust udata
Date: Thu, 16 Jul 2026 11:48:48 +0300 [thread overview]
Message-ID: <20260716084848.GD70906@unreal> (raw)
In-Reply-To: <20260714123113.3792099-1-kotaranov@linux.microsoft.com>
On Tue, Jul 14, 2026 at 05:31:13AM -0700, Konstantin Taranov wrote:
> From: Konstantin Taranov <kotaranov@microsoft.com>
>
> Enable the uverbs robust udata interface in mana_ib by setting
> uverbs_robust_udata and converting the driver to the new udata
> handling model.
Why didn't you set ".uverbs_robust_udata = true" in this patch?
Thanks
>
> Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
> ---
> v3: use ib_no_udata_io
> v2: Removed the udata request for alloc ucontext
> drivers/infiniband/hw/mana/cq.c | 8 +++++-
> drivers/infiniband/hw/mana/device.c | 1 +
> drivers/infiniband/hw/mana/main.c | 29 ++++++++++++++++------
> drivers/infiniband/hw/mana/mr.c | 13 ++++++++++
> drivers/infiniband/hw/mana/qp.c | 38 +++++++++++++++++++++++------
> drivers/infiniband/hw/mana/wq.c | 12 +++++++++
> include/uapi/rdma/mana-abi.h | 2 +-
> 7 files changed, 86 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/infiniband/hw/mana/cq.c b/drivers/infiniband/hw/mana/cq.c
> index f2547989f..d4e5e3f91 100644
> --- a/drivers/infiniband/hw/mana/cq.c
> +++ b/drivers/infiniband/hw/mana/cq.c
> @@ -27,7 +27,8 @@ int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
> is_rnic_cq = mana_ib_is_rnic(mdev);
>
> if (udata) {
> - err = ib_copy_validate_udata_in(udata, ucmd, buf_addr);
> + err = ib_copy_validate_udata_in_cm(udata, ucmd, buf_addr,
> + MANA_IB_CREATE_RNIC_CQ);
> if (err)
> return err;
>
> @@ -105,6 +106,11 @@ int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
> struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);
> struct ib_device *ibdev = ibcq->device;
> struct mana_ib_dev *mdev;
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
>
> diff --git a/drivers/infiniband/hw/mana/device.c b/drivers/infiniband/hw/mana/device.c
> index 9811570ab..a8d19586a 100644
> --- a/drivers/infiniband/hw/mana/device.c
> +++ b/drivers/infiniband/hw/mana/device.c
> @@ -15,6 +15,7 @@ static const struct ib_device_ops mana_ib_dev_ops = {
> .owner = THIS_MODULE,
> .driver_id = RDMA_DRIVER_MANA,
> .uverbs_abi_ver = MANA_IB_UVERBS_ABI_VERSION,
> + .uverbs_robust_udata = true,
>
> .add_gid = mana_ib_gd_add_gid,
> .alloc_mw = mana_ib_alloc_mw,
> diff --git a/drivers/infiniband/hw/mana/main.c b/drivers/infiniband/hw/mana/main.c
> index efe2935bd..e645b7637 100644
> --- a/drivers/infiniband/hw/mana/main.c
> +++ b/drivers/infiniband/hw/mana/main.c
> @@ -101,6 +101,10 @@ int mana_ib_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
> struct gdma_context *gc;
> int err;
>
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
> +
> dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
> gc = mdev_to_gc(dev);
>
> @@ -133,6 +137,11 @@ int mana_ib_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
> struct gdma_destroy_pd_req req = {};
> struct mana_ib_dev *dev;
> struct gdma_context *gc;
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
> gc = mdev_to_gc(dev);
> @@ -142,7 +151,11 @@ int mana_ib_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
>
> req.pd_handle = pd->pd_handle;
>
> - return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
> + err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
> + if (err)
> + return err;
> +
> + return 0;
> }
>
> static int mana_gd_destroy_doorbell_page(struct gdma_context *gc,
> @@ -198,17 +211,17 @@ int mana_ib_alloc_ucontext(struct ib_ucontext *ibcontext,
> int doorbell_page;
> int ret;
>
> + ret = ib_no_udata_io(udata);
> + if (ret)
> + return ret;
> +
> mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
> gc = mdev_to_gc(mdev);
>
> /* Allocate a doorbell page index */
> ret = mana_gd_allocate_doorbell_page(gc, &doorbell_page);
> - if (ret) {
> - ibdev_dbg(ibdev, "Failed to allocate doorbell page %d\n", ret);
> + if (ret)
> return ret;
> - }
> -
> - ibdev_dbg(ibdev, "Doorbell page allocated %d\n", doorbell_page);
>
> ucontext->doorbell = doorbell_page;
>
> @@ -575,7 +588,7 @@ int mana_ib_query_device(struct ib_device *ibdev, struct ib_device_attr *props,
> struct pci_dev *pdev = to_pci_dev(mdev_to_gc(dev)->dev);
> int err;
>
> - err = ib_is_udata_in_empty(uhw);
> + err = ib_no_udata_io(uhw);
> if (err)
> return err;
>
> @@ -605,7 +618,7 @@ int mana_ib_query_device(struct ib_device *ibdev, struct ib_device_attr *props,
> if (!mana_ib_is_rnic(dev))
> props->raw_packet_caps = IB_RAW_PACKET_CAP_IP_CSUM;
>
> - return ib_respond_empty_udata(uhw);
> + return 0;
> }
>
> int mana_ib_query_port(struct ib_device *ibdev, u32 port,
> diff --git a/drivers/infiniband/hw/mana/mr.c b/drivers/infiniband/hw/mana/mr.c
> index 030bfdcff..1233685b4 100644
> --- a/drivers/infiniband/hw/mana/mr.c
> +++ b/drivers/infiniband/hw/mana/mr.c
> @@ -113,6 +113,10 @@ struct ib_mr *mana_ib_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length,
> if (dmah)
> return ERR_PTR(-EOPNOTSUPP);
>
> + err = ib_no_udata_io(udata);
> + if (err)
> + return ERR_PTR(err);
> +
> dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
>
> ibdev_dbg(ibdev,
> @@ -327,6 +331,11 @@ int mana_ib_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata)
> {
> struct mana_ib_dev *mdev = container_of(ibmw->device, struct mana_ib_dev, ib_dev);
> struct mana_ib_pd *pd = container_of(ibmw->pd, struct mana_ib_pd, ibpd);
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> return mana_ib_gd_create_mw(mdev, pd, ibmw);
> }
> @@ -346,6 +355,10 @@ int mana_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
> struct mana_ib_dev *dev;
> int err;
>
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
> +
> dev = container_of(ibdev, struct mana_ib_dev, ib_dev);
>
> err = mana_ib_gd_destroy_mr(dev, mr->mr_handle);
> diff --git a/drivers/infiniband/hw/mana/qp.c b/drivers/infiniband/hw/mana/qp.c
> index 60926f39a..b5ff07e34 100644
> --- a/drivers/infiniband/hw/mana/qp.c
> +++ b/drivers/infiniband/hw/mana/qp.c
> @@ -651,10 +651,8 @@ static int mana_ib_create_ud_qp(struct ib_qp *ibqp, struct ib_pd *ibpd,
> u32 doorbell, queue_size;
> int i, err;
>
> - if (udata) {
> - ibdev_dbg(&mdev->ib_dev, "User-level UD QPs are not supported\n");
> + if (udata)
> return -EOPNOTSUPP;
> - }
>
> for (i = 0; i < MANA_UD_QUEUE_TYPE_MAX; ++i) {
> queue_size = mana_ib_queue_size(attr, i);
> @@ -745,6 +743,11 @@ static int mana_ib_gd_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
> struct gdma_context *gc = mdev_to_gc(mdev);
> struct mana_port_context *mpc;
> struct net_device *ndev;
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> mana_gd_init_req_hdr(&req.hdr, MANA_IB_SET_QP_STATE, sizeof(req), sizeof(resp));
>
> @@ -797,7 +800,11 @@ static int mana_ib_gd_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
> req.ah_attr.flow_label = attr->ah_attr.grh.flow_label;
> }
>
> - return mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
> + err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
> + if (err)
> + return err;
> +
> + return 0;
> }
>
> int mana_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
> @@ -826,7 +833,11 @@ static int mana_ib_destroy_qp_rss(struct mana_ib_qp *qp,
> struct mana_ib_pd *pd;
> struct mana_ib_wq *wq;
> struct ib_wq *ibwq;
> - int i;
> + int i, err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> ndev = mana_ib_get_netdev(qp->ibqp.device, qp->port);
> mpc = netdev_priv(ndev);
> @@ -872,6 +883,11 @@ static int mana_ib_destroy_qp_raw(struct mana_ib_qp *qp, struct ib_udata *udata)
> struct mana_port_context *mpc;
> struct net_device *ndev;
> struct mana_ib_pd *pd;
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> ndev = mana_ib_get_netdev(qp->ibqp.device, qp->port);
> mpc = netdev_priv(ndev);
> @@ -890,7 +906,11 @@ static int mana_ib_destroy_rc_qp(struct mana_ib_qp *qp, struct ib_udata *udata)
> {
> struct mana_ib_dev *mdev =
> container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
> - int i;
> + int i, err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> mana_table_remove_qp(mdev, qp);
>
> @@ -908,7 +928,11 @@ static int mana_ib_destroy_ud_qp(struct mana_ib_qp *qp, struct ib_udata *udata)
> {
> struct mana_ib_dev *mdev =
> container_of(qp->ibqp.device, struct mana_ib_dev, ib_dev);
> - int i;
> + int i, err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> mana_remove_qp_from_cqs(qp);
> mana_table_remove_qp(mdev, qp);
> diff --git a/drivers/infiniband/hw/mana/wq.c b/drivers/infiniband/hw/mana/wq.c
> index 5c2134a0b..6b066d605 100644
> --- a/drivers/infiniband/hw/mana/wq.c
> +++ b/drivers/infiniband/hw/mana/wq.c
> @@ -55,6 +55,11 @@ int mana_ib_destroy_wq(struct ib_wq *ibwq, struct ib_udata *udata)
> struct mana_ib_wq *wq = container_of(ibwq, struct mana_ib_wq, ibwq);
> struct ib_device *ib_dev = ibwq->device;
> struct mana_ib_dev *mdev;
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
>
> mdev = container_of(ib_dev, struct mana_ib_dev, ib_dev);
>
> @@ -69,10 +74,17 @@ int mana_ib_create_rwq_ind_table(struct ib_rwq_ind_table *ib_rwq_ind_table,
> struct ib_rwq_ind_table_init_attr *init_attr,
> struct ib_udata *udata)
> {
> + int err;
> +
> + err = ib_no_udata_io(udata);
> + if (err)
> + return err;
> +
> /*
> * There is no additional data in ind_table to be maintained by this
> * driver, do nothing
> */
> +
> return 0;
> }
>
> diff --git a/include/uapi/rdma/mana-abi.h b/include/uapi/rdma/mana-abi.h
> index a75bf32b8..8336bf51b 100644
> --- a/include/uapi/rdma/mana-abi.h
> +++ b/include/uapi/rdma/mana-abi.h
> @@ -25,7 +25,7 @@ enum mana_ib_create_cq_flags {
>
> struct mana_ib_create_cq {
> __aligned_u64 buf_addr;
> - __u16 flags;
> + __u16 comp_mask;
> __u16 reserved0;
> __u32 reserved1;
> };
> --
> 2.43.0
>
next prev parent reply other threads:[~2026-07-16 8:48 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-14 12:31 [PATCH rdma-next v3] RDMA/mana_ib: Adopt robust udata Konstantin Taranov
2026-07-15 8:07 ` Leon Romanovsky
2026-07-15 8:23 ` Konstantin Taranov
2026-07-16 8:48 ` Leon Romanovsky [this message]
2026-07-16 8:56 ` [EXTERNAL] " Konstantin Taranov
2026-07-16 9:12 ` Leon Romanovsky
2026-07-16 9:16 ` Leon Romanovsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260716084848.GD70906@unreal \
--to=leon@kernel.org \
--cc=jgg@ziepe.ca \
--cc=kotaranov@linux.microsoft.com \
--cc=kotaranov@microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=longli@microsoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.