From: Bob Pearson <rpearsonhpe@gmail.com>
To: jgg@nvidia.com, zyjzyj2000@gmail.com, leonro@nvidia.com,
yangx.jy@fujitsu.com, lizhijian@fujitsu.com,
linux-rdma@vger.kernel.org
Cc: Bob Pearson <rpearsonhpe@gmail.com>
Subject: [PATCH for-next v7 5/6] RDMA/rxe: Cleanup page variables in rxe_mr.c
Date: Thu, 19 Jan 2023 17:59:36 -0600 [thread overview]
Message-ID: <20230119235936.19728-6-rpearsonhpe@gmail.com> (raw)
In-Reply-To: <20230119235936.19728-1-rpearsonhpe@gmail.com>
Cleanup usage of mr->page_shift and mr->page_mask and introduce
an extractor for mr->ibmr.page_size. Normal usage in the kernel
has page_mask masking out offset in page rather than masking out
the page number. The rxe driver had reversed that which was confusing.
Implicitly there can be a per mr page_size which was not uniformly
supported.
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
---
drivers/infiniband/sw/rxe/rxe_mr.c | 31 ++++++++++++---------------
drivers/infiniband/sw/rxe/rxe_verbs.h | 11 +++++++---
2 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
index 5c4ce43914fa..2181165ea40d 100644
--- a/drivers/infiniband/sw/rxe/rxe_mr.c
+++ b/drivers/infiniband/sw/rxe/rxe_mr.c
@@ -62,6 +62,9 @@ static void rxe_mr_init(int access, struct rxe_mr *mr)
mr->lkey = mr->ibmr.lkey = lkey;
mr->rkey = mr->ibmr.rkey = rkey;
+ mr->ibmr.page_size = PAGE_SIZE;
+ mr->page_mask = PAGE_MASK;
+ mr->page_shift = PAGE_SHIFT;
mr->state = RXE_MR_STATE_INVALID;
}
@@ -151,9 +154,6 @@ int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova,
goto err_release_umem;
}
- mr->page_shift = PAGE_SHIFT;
- mr->page_mask = PAGE_SIZE - 1;
-
num_buf = 0;
map = mr->map;
if (length > 0) {
@@ -182,7 +182,7 @@ int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova,
goto err_release_umem;
}
buf->addr = (uintptr_t)vaddr;
- buf->size = PAGE_SIZE;
+ buf->size = mr_page_size(mr);
num_buf++;
buf++;
@@ -191,10 +191,9 @@ int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length, u64 iova,
mr->umem = umem;
mr->access = access;
- mr->offset = ib_umem_offset(umem);
+ mr->page_offset = ib_umem_offset(umem);
mr->state = RXE_MR_STATE_VALID;
mr->ibmr.type = IB_MR_TYPE_USER;
- mr->ibmr.page_size = PAGE_SIZE;
return 0;
@@ -248,29 +247,27 @@ int rxe_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
int sg_nents, unsigned int *sg_offset)
{
struct rxe_mr *mr = to_rmr(ibmr);
- int n;
-
- mr->nbuf = 0;
+ unsigned int page_size = mr_page_size(mr);
- n = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, rxe_set_page);
+ mr->page_shift = ilog2(page_size);
+ mr->page_mask = ~((u64)page_size - 1);
+ mr->page_offset = ibmr->iova & (page_size - 1);
- mr->page_shift = ilog2(ibmr->page_size);
- mr->page_mask = ibmr->page_size - 1;
- mr->offset = ibmr->iova & mr->page_mask;
+ mr->nbuf = 0;
- return n;
+ return ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, rxe_set_page);
}
static void lookup_iova(struct rxe_mr *mr, u64 iova, int *m_out, int *n_out,
size_t *offset_out)
{
- size_t offset = iova - mr->ibmr.iova + mr->offset;
+ size_t offset = iova - mr->ibmr.iova + mr->page_offset;
int map_index;
int buf_index;
u64 length;
if (likely(mr->page_shift)) {
- *offset_out = offset & mr->page_mask;
+ *offset_out = offset & (mr_page_size(mr) - 1);
offset >>= mr->page_shift;
*n_out = offset & mr->map_mask;
*m_out = offset >> mr->map_shift;
@@ -329,7 +326,7 @@ int rxe_flush_pmem_iova(struct rxe_mr *mr, u64 iova, int length)
if (mr->ibmr.type == IB_MR_TYPE_DMA)
return -EFAULT;
- offset = (iova - mr->ibmr.iova + mr->offset) & mr->page_mask;
+ offset = (iova - mr->ibmr.iova + mr->page_offset) & mr->page_mask;
while (length > 0) {
u8 *va;
int bytes;
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
index 19ddfa890480..bfc94caaeec5 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
@@ -310,11 +310,11 @@ struct rxe_mr {
u32 lkey;
u32 rkey;
enum rxe_mr_state state;
- u32 offset;
int access;
- int page_shift;
- int page_mask;
+ unsigned int page_offset;
+ unsigned int page_shift;
+ u64 page_mask;
int map_shift;
int map_mask;
@@ -329,6 +329,11 @@ struct rxe_mr {
struct rxe_map **map;
};
+static inline unsigned int mr_page_size(struct rxe_mr *mr)
+{
+ return mr ? mr->ibmr.page_size : PAGE_SIZE;
+}
+
enum rxe_mw_state {
RXE_MW_STATE_INVALID = RXE_MR_STATE_INVALID,
RXE_MW_STATE_FREE = RXE_MR_STATE_FREE,
--
2.37.2
next prev parent reply other threads:[~2023-01-20 0:03 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-19 23:59 [PATCH for-next v7 0/6] RDMA/rxe: Replace mr page map with an xarray Bob Pearson
2023-01-19 23:59 ` [PATCH for-next v7 1/6] RDMA/rxe: Cleanup mr_check_range Bob Pearson
2023-01-19 23:59 ` [PATCH for-next v7 2/6] RDMA/rxe: Move rxe_map_mr_sg to rxe_mr.c Bob Pearson
2023-01-19 23:59 ` [PATCH for-next v7 3/6] RDMA-rxe: Isolate mr code from atomic_reply() Bob Pearson
2023-01-19 23:59 ` [PATCH for-next v7 4/6] RDMA-rxe: Isolate mr code from atomic_write_reply() Bob Pearson
2023-01-19 23:59 ` Bob Pearson [this message]
2023-01-19 23:59 ` [PATCH for-next v7 6/6] RDMA/rxe: Replace rxe_map and rxe_phys_buf by xarray Bob Pearson
2023-01-27 16:23 ` [PATCH for-next v7 0/6] RDMA/rxe: Replace mr page map with an xarray Jason Gunthorpe
2023-01-27 17:05 ` Bob Pearson
2023-01-27 19:26 ` Bob Pearson
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=20230119235936.19728-6-rpearsonhpe@gmail.com \
--to=rpearsonhpe@gmail.com \
--cc=jgg@nvidia.com \
--cc=leonro@nvidia.com \
--cc=linux-rdma@vger.kernel.org \
--cc=lizhijian@fujitsu.com \
--cc=yangx.jy@fujitsu.com \
--cc=zyjzyj2000@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox