Commit 36d57708 authored by Shiraz, Saleem's avatar Shiraz, Saleem Committed by Jason Gunthorpe

RDMA/rdmavt: Adapt to handle non-uniform sizes on umem SGEs

rdmavt expects a uniform size on all umem SGEs which is currently at
PAGE_SIZE.

Adapt to a umem API change which could return non-uniform sized SGEs due
to combining contiguous PAGE_SIZE regions into an SGE. Use
for_each_sg_page variant to unfold the larger SGEs into a list of
PAGE_SIZE elements.

Additionally, purge umem->page_shift usage in the driver as its only
relevant for ODP MRs. Use system page size and shift instead.
Reviewed-by: default avatarMichael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: default avatarShiraz, Saleem <shiraz.saleem@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent e8ac9389
...@@ -381,8 +381,8 @@ struct ib_mr *rvt_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, ...@@ -381,8 +381,8 @@ struct ib_mr *rvt_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
{ {
struct rvt_mr *mr; struct rvt_mr *mr;
struct ib_umem *umem; struct ib_umem *umem;
struct scatterlist *sg; struct sg_page_iter sg_iter;
int n, m, entry; int n, m;
struct ib_mr *ret; struct ib_mr *ret;
if (length == 0) if (length == 0)
...@@ -407,23 +407,21 @@ struct ib_mr *rvt_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, ...@@ -407,23 +407,21 @@ struct ib_mr *rvt_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
mr->mr.access_flags = mr_access_flags; mr->mr.access_flags = mr_access_flags;
mr->umem = umem; mr->umem = umem;
mr->mr.page_shift = umem->page_shift; mr->mr.page_shift = PAGE_SHIFT;
m = 0; m = 0;
n = 0; n = 0;
for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) { for_each_sg_page (umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
void *vaddr; void *vaddr;
vaddr = page_address(sg_page(sg)); vaddr = page_address(sg_page_iter_page(&sg_iter));
if (!vaddr) { if (!vaddr) {
ret = ERR_PTR(-EINVAL); ret = ERR_PTR(-EINVAL);
goto bail_inval; goto bail_inval;
} }
mr->mr.map[m]->segs[n].vaddr = vaddr; mr->mr.map[m]->segs[n].vaddr = vaddr;
mr->mr.map[m]->segs[n].length = BIT(umem->page_shift); mr->mr.map[m]->segs[n].length = PAGE_SIZE;
trace_rvt_mr_user_seg(&mr->mr, m, n, vaddr, trace_rvt_mr_user_seg(&mr->mr, m, n, vaddr, PAGE_SIZE);
BIT(umem->page_shift)); if (++n == RVT_SEGSZ) {
n++;
if (n == RVT_SEGSZ) {
m++; m++;
n = 0; n = 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment