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 2/3] RDMA/erdma: Introduce struct erdma_mem_init_attr
Date: Thu, 7 May 2026 13:34:20 +0800 [thread overview]
Message-ID: <20260507053437.46211-3-boshiyu@linux.alibaba.com> (raw)
In-Reply-To: <20260507053437.46211-1-boshiyu@linux.alibaba.com>
Pass struct erdma_mem_init_attr to the erdma_mem_init() interface.
Reviewed-by: Cheng Xu <chengyou@linux.alibaba.com>
Signed-off-by: Boshi Yu <boshiyu@linux.alibaba.com>
---
drivers/infiniband/hw/erdma/erdma_verbs.c | 57 ++++++++++++++---------
drivers/infiniband/hw/erdma/erdma_verbs.h | 13 ++++++
2 files changed, 49 insertions(+), 21 deletions(-)
diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.c b/drivers/infiniband/hw/erdma/erdma_verbs.c
index a418a3c92754..59a2b8464a6f 100644
--- a/drivers/infiniband/hw/erdma/erdma_verbs.c
+++ b/drivers/infiniband/hw/erdma/erdma_verbs.c
@@ -824,26 +824,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,
- u64 start, u64 len, int access, u64 virt,
- unsigned long req_page_size, bool force_continuous)
+ struct erdma_mem_init_attr *attr)
{
int ret = 0;
- mem->umem = ib_umem_get(&dev->ibdev, start, len, access);
+ 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 = virt;
- mem->len = len;
- mem->page_size = ib_umem_find_best_pgsz(mem->umem, req_page_size, virt);
- mem->page_offset = start & (mem->page_size - 1);
+ mem->va = attr->virt;
+ mem->len = attr->len;
+ mem->page_size = ib_umem_find_best_pgsz(mem->umem, attr->req_page_size,
+ attr->virt);
+ mem->page_offset = attr->start & (mem->page_size - 1);
mem->mtt_nents = ib_umem_num_dma_blocks(mem->umem, mem->page_size);
mem->page_cnt = mem->mtt_nents;
mem->mtt = erdma_create_mtt(dev, MTT_SIZE(mem->page_cnt),
- force_continuous);
+ attr->flags & ERDMA_MEM_FLAG_MTT_PHYS_CONT);
if (IS_ERR(mem->mtt)) {
ret = PTR_ERR(mem->mtt);
goto error_ret;
@@ -938,6 +939,7 @@ erdma_unmap_user_dbrecords(struct erdma_ucontext *ctx,
static int init_user_qp(struct erdma_qp *qp, struct erdma_ucontext *uctx,
u64 va, u32 len, u64 dbrec_va)
{
+ struct erdma_mem_init_attr attr = {};
dma_addr_t dbrec_dma;
u32 rq_offset;
int ret;
@@ -946,18 +948,22 @@ static int init_user_qp(struct erdma_qp *qp, struct erdma_ucontext *uctx,
qp->attrs.rq_size * RQE_SIZE))
return -EINVAL;
- ret = erdma_mem_init(qp->dev, &qp->user_qp.sq_mem, va,
- qp->attrs.sq_size << SQEBB_SHIFT, 0, va,
- (SZ_1M - SZ_4K), true);
+ attr.virt = va;
+ attr.start = va;
+ attr.req_page_size = SZ_1M - SZ_4K;
+ attr.len = qp->attrs.sq_size << SQEBB_SHIFT;
+ attr.flags = ERDMA_MEM_FLAG_MTT_PHYS_CONT;
+ ret = erdma_mem_init(qp->dev, &qp->user_qp.sq_mem, &attr);
if (ret)
return ret;
rq_offset = ALIGN(qp->attrs.sq_size << SQEBB_SHIFT, ERDMA_HW_PAGE_SIZE);
qp->user_qp.rq_offset = rq_offset;
- ret = erdma_mem_init(qp->dev, &qp->user_qp.rq_mem, va + rq_offset,
- qp->attrs.rq_size << RQE_SHIFT, 0, va + rq_offset,
- (SZ_1M - SZ_4K), true);
+ attr.virt = va + rq_offset;
+ attr.start = va + rq_offset;
+ attr.len = qp->attrs.rq_size << RQE_SHIFT;
+ ret = erdma_mem_init(qp->dev, &qp->user_qp.rq_mem, &attr);
if (ret)
goto uninit_sq_mem;
@@ -1233,8 +1239,9 @@ 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 erdma_mr *mr = NULL;
struct erdma_dev *dev = to_edev(ibpd->device);
+ struct erdma_mem_init_attr attr = {};
+ struct erdma_mr *mr = NULL;
u32 stag;
int ret;
@@ -1248,8 +1255,12 @@ struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
if (!mr)
return ERR_PTR(-ENOMEM);
- ret = erdma_mem_init(dev, &mr->mem, start, len, access, virt,
- SZ_2G - SZ_4K, false);
+ attr.len = len;
+ attr.virt = virt;
+ attr.start = start;
+ attr.access = access;
+ attr.req_page_size = SZ_2G - SZ_4K;
+ ret = erdma_mem_init(dev, &mr->mem, &attr);
if (ret)
goto err_out_free;
@@ -1904,12 +1915,16 @@ int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
static int erdma_init_user_cq(struct erdma_ucontext *ctx, struct erdma_cq *cq,
struct erdma_ureq_create_cq *ureq)
{
- int ret;
struct erdma_dev *dev = to_edev(cq->ibcq.device);
+ struct erdma_mem_init_attr attr = {};
+ int ret;
- ret = erdma_mem_init(dev, &cq->user_cq.qbuf_mem, ureq->qbuf_va,
- ureq->qbuf_len, 0, ureq->qbuf_va, SZ_64M - SZ_4K,
- true);
+ attr.len = ureq->qbuf_len;
+ attr.virt = ureq->qbuf_va;
+ attr.start = ureq->qbuf_va;
+ attr.req_page_size = SZ_64M - SZ_4K;
+ attr.flags = ERDMA_MEM_FLAG_MTT_PHYS_CONT;
+ ret = erdma_mem_init(dev, &cq->user_cq.qbuf_mem, &attr);
if (ret)
return ret;
diff --git a/drivers/infiniband/hw/erdma/erdma_verbs.h b/drivers/infiniband/hw/erdma/erdma_verbs.h
index 7d8d3fe501d5..79b3a90b03e7 100644
--- a/drivers/infiniband/hw/erdma/erdma_verbs.h
+++ b/drivers/infiniband/hw/erdma/erdma_verbs.h
@@ -108,6 +108,19 @@ struct erdma_mtt {
struct erdma_mtt *low_level;
};
+enum erdma_mem_flags {
+ ERDMA_MEM_FLAG_MTT_PHYS_CONT = (1 << 0),
+};
+
+struct erdma_mem_init_attr {
+ u64 start;
+ u64 virt;
+ u64 len;
+ unsigned long req_page_size;
+ int access;
+ u32 flags;
+};
+
struct erdma_mem {
struct ib_umem *umem;
struct erdma_mtt *mtt;
--
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 ` Boshi Yu [this message]
2026-05-07 5:34 ` [PATCH for-next 3/3] RDMA/erdma: Implement erdma_reg_user_mr_dmabuf Boshi Yu
2026-05-13 14:12 ` 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-3-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.