From: Boshi Yu <boshiyu@linux.alibaba.com>
To: jgg@ziepe.ca, leon@kernel.org
Cc: linux-rdma@vger.kernel.org, chengyou@linux.alibaba.com,
kaishen@linux.alibaba.com
Subject: [PATCH for-next 3/3] RDMA/erdma: Implement erdma_reg_user_mr_dmabuf
Date: Thu, 7 May 2026 13:34:21 +0800 [thread overview]
Message-ID: <20260507053437.46211-4-boshiyu@linux.alibaba.com> (raw)
In-Reply-To: <20260507053437.46211-1-boshiyu@linux.alibaba.com>
Support DMA-BUF based user memory registration by adding the
erdma_reg_user_mr_dmabuf() callback. We refactor the existing
erdma_reg_user_mr() into a common _erdma_reg_user_mr() function
that handles both regular and DMA-BUF memory registration.
Reviewed-by: Cheng Xu <chengyou@linux.alibaba.com>
Signed-off-by: Boshi Yu <boshiyu@linux.alibaba.com>
---
drivers/infiniband/hw/erdma/erdma_main.c | 1 +
drivers/infiniband/hw/erdma/erdma_verbs.c | 55 ++++++++++++++++++-----
drivers/infiniband/hw/erdma/erdma_verbs.h | 6 +++
3 files changed, 51 insertions(+), 11 deletions(-)
diff --git a/drivers/infiniband/hw/erdma/erdma_main.c b/drivers/infiniband/hw/erdma/erdma_main.c
index 7e87a815e853..6e4860428e5b 100644
--- a/drivers/infiniband/hw/erdma/erdma_main.c
+++ b/drivers/infiniband/hw/erdma/erdma_main.c
@@ -526,6 +526,7 @@ static const struct ib_device_ops erdma_device_ops = {
.query_qp = erdma_query_qp,
.req_notify_cq = erdma_req_notify_cq,
.reg_user_mr = erdma_reg_user_mr,
+ .reg_user_mr_dmabuf = erdma_reg_user_mr_dmabuf,
.modify_qp = erdma_modify_qp,
INIT_RDMA_OBJ_SIZE(ib_cq, erdma_cq, ibcq),
diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.c b/drivers/infiniband/hw/erdma/erdma_verbs.c
index 59a2b8464a6f..d75ce1e4a3ab 100644
--- a/drivers/infiniband/hw/erdma/erdma_verbs.c
+++ b/drivers/infiniband/hw/erdma/erdma_verbs.c
@@ -826,14 +826,27 @@ static void erdma_destroy_mtt(struct erdma_dev *dev, struct erdma_mtt *mtt)
static int erdma_mem_init(struct erdma_dev *dev, struct erdma_mem *mem,
struct erdma_mem_init_attr *attr)
{
+ struct ib_umem_dmabuf *umem_dmabuf;
int ret = 0;
- mem->umem =
- ib_umem_get(&dev->ibdev, attr->start, attr->len, attr->access);
- if (IS_ERR(mem->umem)) {
- ret = PTR_ERR(mem->umem);
- mem->umem = NULL;
- return ret;
+ if (attr->flags & ERDMA_MEM_FLAG_DMABUF) {
+ umem_dmabuf = ib_umem_dmabuf_get_pinned(&dev->ibdev,
+ attr->start, attr->len,
+ attr->fd, attr->access);
+ if (IS_ERR(umem_dmabuf)) {
+ ret = PTR_ERR(umem_dmabuf);
+ mem->umem = NULL;
+ return ret;
+ }
+ mem->umem = &umem_dmabuf->umem;
+ } else {
+ mem->umem = ib_umem_get(&dev->ibdev, attr->start, attr->len,
+ attr->access);
+ if (IS_ERR(mem->umem)) {
+ ret = PTR_ERR(mem->umem);
+ mem->umem = NULL;
+ return ret;
+ }
}
mem->va = attr->virt;
@@ -1235,9 +1248,10 @@ int erdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
return num;
}
-struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
- u64 virt, int access, struct ib_dmah *dmah,
- struct ib_udata *udata)
+static struct ib_mr *
+_erdma_reg_user_mr(struct ib_pd *ibpd, struct ib_udata *udata,
+ struct ib_dmah *dmah, u64 start, u64 len, u64 virt,
+ int access, int fd, bool dmabuf)
{
struct erdma_dev *dev = to_edev(ibpd->device);
struct erdma_mem_init_attr attr = {};
@@ -1255,6 +1269,10 @@ struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
if (!mr)
return ERR_PTR(-ENOMEM);
+ if (dmabuf)
+ attr.flags |= ERDMA_MEM_FLAG_DMABUF;
+
+ attr.fd = fd;
attr.len = len;
attr.virt = virt;
attr.start = start;
@@ -1270,8 +1288,6 @@ struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
mr->ibmr.lkey = mr->ibmr.rkey = stag;
mr->ibmr.pd = ibpd;
- mr->mem.va = virt;
- mr->mem.len = len;
mr->access = ERDMA_MR_ACC_LR | to_erdma_access_flags(access);
mr->valid = 1;
mr->type = ERDMA_MR_TYPE_NORMAL;
@@ -1295,6 +1311,23 @@ struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
return ERR_PTR(ret);
}
+struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
+ u64 virt, int access, struct ib_dmah *dmah,
+ struct ib_udata *udata)
+{
+ return _erdma_reg_user_mr(ibpd, udata, dmah, start, len, virt, access,
+ 0, false);
+}
+
+struct ib_mr *erdma_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start, u64 len,
+ u64 virt, int fd, int access,
+ struct ib_dmah *dmah,
+ struct uverbs_attr_bundle *attrs)
+{
+ return _erdma_reg_user_mr(ibpd, &attrs->driver_udata, dmah, start, len,
+ virt, access, fd, true);
+}
+
int erdma_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
{
struct erdma_mr *mr;
diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.h b/drivers/infiniband/hw/erdma/erdma_verbs.h
index 79b3a90b03e7..15bdad8b14ce 100644
--- a/drivers/infiniband/hw/erdma/erdma_verbs.h
+++ b/drivers/infiniband/hw/erdma/erdma_verbs.h
@@ -110,6 +110,7 @@ struct erdma_mtt {
enum erdma_mem_flags {
ERDMA_MEM_FLAG_MTT_PHYS_CONT = (1 << 0),
+ ERDMA_MEM_FLAG_DMABUF = (1 << 1),
};
struct erdma_mem_init_attr {
@@ -118,6 +119,7 @@ struct erdma_mem_init_attr {
u64 len;
unsigned long req_page_size;
int access;
+ int fd;
u32 flags;
};
@@ -467,6 +469,10 @@ int erdma_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);
struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
u64 virt, int access, struct ib_dmah *dmah,
struct ib_udata *udata);
+struct ib_mr *erdma_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start, u64 len,
+ u64 virt, int fd, int access,
+ struct ib_dmah *dmah,
+ struct uverbs_attr_bundle *attrs);
struct ib_mr *erdma_get_dma_mr(struct ib_pd *ibpd, int rights);
int erdma_dereg_mr(struct ib_mr *ibmr, struct ib_udata *data);
int erdma_mmap(struct ib_ucontext *ctx, struct vm_area_struct *vma);
--
2.46.0
next prev parent reply other threads:[~2026-05-07 5:34 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-07 5:34 [PATCH for-next 0/3] RDMA/erdma: Add DMA-BUF memory registration Boshi Yu
2026-05-07 5:34 ` [PATCH for-next 1/3] RDMA/erdma: Rename get/put_mtt_entries to erdma_mem_init/uninit Boshi Yu
2026-05-07 5:34 ` [PATCH for-next 2/3] RDMA/erdma: Introduce struct erdma_mem_init_attr Boshi Yu
2026-05-07 5:34 ` Boshi Yu [this message]
2026-05-13 14:12 ` [PATCH for-next 3/3] RDMA/erdma: Implement erdma_reg_user_mr_dmabuf Leon Romanovsky
2026-05-18 12:22 ` Boshi Yu
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=20260507053437.46211-4-boshiyu@linux.alibaba.com \
--to=boshiyu@linux.alibaba.com \
--cc=chengyou@linux.alibaba.com \
--cc=jgg@ziepe.ca \
--cc=kaishen@linux.alibaba.com \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
/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.