Skip to content

Commit 79fbd3e

Browse files
maorgottliebjgunthorpe
authored andcommitted
RDMA: Use the sg_table directly and remove the opencoded version from umem
This allows using the normal sg_table APIs and makes all the code cleaner. Remove sgt, nents and nmapd from ib_umem. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Maor Gottlieb <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 3e302db commit 79fbd3e

File tree

13 files changed

+60
-42
lines changed

13 files changed

+60
-42
lines changed

drivers/infiniband/core/umem.c

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d
5151
struct scatterlist *sg;
5252
unsigned int i;
5353

54-
if (umem->nmap > 0)
55-
ib_dma_unmap_sg(dev, umem->sg_head.sgl, umem->sg_nents,
56-
DMA_BIDIRECTIONAL);
54+
if (dirty)
55+
ib_dma_unmap_sgtable_attrs(dev, &umem->sgt_append.sgt,
56+
DMA_BIDIRECTIONAL, 0);
5757

58-
for_each_sg(umem->sg_head.sgl, sg, umem->sg_nents, i)
58+
for_each_sgtable_sg(&umem->sgt_append.sgt, sg, i)
5959
unpin_user_page_range_dirty_lock(sg_page(sg),
6060
DIV_ROUND_UP(sg->length, PAGE_SIZE), make_dirty);
6161

@@ -111,7 +111,7 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
111111
/* offset into first SGL */
112112
pgoff = umem->address & ~PAGE_MASK;
113113

114-
for_each_sg(umem->sg_head.sgl, sg, umem->nmap, i) {
114+
for_each_sgtable_dma_sg(&umem->sgt_append.sgt, sg, i) {
115115
/* Walk SGL and reduce max page size if VA/PA bits differ
116116
* for any address.
117117
*/
@@ -121,7 +121,7 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
121121
* the maximum possible page size as the low bits of the iova
122122
* must be zero when starting the next chunk.
123123
*/
124-
if (i != (umem->nmap - 1))
124+
if (i != (umem->sgt_append.sgt.nents - 1))
125125
mask |= va;
126126
pgoff = 0;
127127
}
@@ -231,30 +231,19 @@ struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr,
231231
&umem->sgt_append, page_list, pinned, 0,
232232
pinned << PAGE_SHIFT, ib_dma_max_seg_size(device),
233233
npages, GFP_KERNEL);
234-
umem->sg_nents = umem->sgt_append.sgt.nents;
235234
if (ret) {
236-
memcpy(&umem->sg_head.sgl, &umem->sgt_append.sgt,
237-
sizeof(umem->sgt_append.sgt));
238235
unpin_user_pages_dirty_lock(page_list, pinned, 0);
239236
goto umem_release;
240237
}
241238
}
242239

243-
memcpy(&umem->sg_head.sgl, &umem->sgt_append.sgt,
244-
sizeof(umem->sgt_append.sgt));
245240
if (access & IB_ACCESS_RELAXED_ORDERING)
246241
dma_attr |= DMA_ATTR_WEAK_ORDERING;
247242

248-
umem->nmap =
249-
ib_dma_map_sg_attrs(device, umem->sg_head.sgl, umem->sg_nents,
250-
DMA_BIDIRECTIONAL, dma_attr);
251-
252-
if (!umem->nmap) {
253-
ret = -ENOMEM;
243+
ret = ib_dma_map_sgtable_attrs(device, &umem->sgt_append.sgt,
244+
DMA_BIDIRECTIONAL, dma_attr);
245+
if (ret)
254246
goto umem_release;
255-
}
256-
257-
ret = 0;
258247
goto out;
259248

260249
umem_release:
@@ -314,7 +303,8 @@ int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offset,
314303
return -EINVAL;
315304
}
316305

317-
ret = sg_pcopy_to_buffer(umem->sg_head.sgl, umem->sg_nents, dst, length,
306+
ret = sg_pcopy_to_buffer(umem->sgt_append.sgt.sgl,
307+
umem->sgt_append.sgt.orig_nents, dst, length,
318308
offset + ib_umem_offset(umem));
319309

320310
if (ret < 0)

drivers/infiniband/core/umem_dmabuf.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,8 @@ int ib_umem_dmabuf_map_pages(struct ib_umem_dmabuf *umem_dmabuf)
5555
cur += sg_dma_len(sg);
5656
}
5757

58-
umem_dmabuf->umem.sg_head.sgl = umem_dmabuf->first_sg;
59-
umem_dmabuf->umem.sg_head.nents = nmap;
60-
umem_dmabuf->umem.nmap = nmap;
58+
umem_dmabuf->umem.sgt_append.sgt.sgl = umem_dmabuf->first_sg;
59+
umem_dmabuf->umem.sgt_append.sgt.nents = nmap;
6160
umem_dmabuf->sgt = sgt;
6261

6362
wait_fence:

drivers/infiniband/hw/hns/hns_roce_db.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt,
4242

4343
found:
4444
offset = virt - page_addr;
45-
db->dma = sg_dma_address(page->umem->sg_head.sgl) + offset;
46-
db->virt_addr = sg_virt(page->umem->sg_head.sgl) + offset;
45+
db->dma = sg_dma_address(page->umem->sgt_append.sgt.sgl) + offset;
46+
db->virt_addr = sg_virt(page->umem->sgt_append.sgt.sgl) + offset;
4747
db->u.user_page = page;
4848
refcount_inc(&page->refcount);
4949

drivers/infiniband/hw/irdma/verbs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2235,7 +2235,7 @@ static void irdma_copy_user_pgaddrs(struct irdma_mr *iwmr, u64 *pbl,
22352235
pinfo = (level == PBLE_LEVEL_1) ? NULL : palloc->level2.leaf;
22362236

22372237
if (iwmr->type == IRDMA_MEMREG_TYPE_QP)
2238-
iwpbl->qp_mr.sq_page = sg_page(region->sg_head.sgl);
2238+
iwpbl->qp_mr.sq_page = sg_page(region->sgt_append.sgt.sgl);
22392239

22402240
rdma_umem_for_each_dma_block(region, &biter, iwmr->page_size) {
22412241
*pbl = rdma_block_iter_dma_address(&biter);

drivers/infiniband/hw/mlx4/doorbell.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ int mlx4_ib_db_map_user(struct ib_udata *udata, unsigned long virt,
7575
list_add(&page->list, &context->db_page_list);
7676

7777
found:
78-
db->dma = sg_dma_address(page->umem->sg_head.sgl) + (virt & ~PAGE_MASK);
78+
db->dma = sg_dma_address(page->umem->sgt_append.sgt.sgl) +
79+
(virt & ~PAGE_MASK);
7980
db->u.user_page = page;
8081
++page->refcnt;
8182

drivers/infiniband/hw/mlx4/mr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ int mlx4_ib_umem_write_mtt(struct mlx4_ib_dev *dev, struct mlx4_mtt *mtt,
200200
mtt_shift = mtt->page_shift;
201201
mtt_size = 1ULL << mtt_shift;
202202

203-
for_each_sg(umem->sg_head.sgl, sg, umem->nmap, i) {
203+
for_each_sgtable_dma_sg(&umem->sgt_append.sgt, sg, i) {
204204
if (cur_start_addr + len == sg_dma_address(sg)) {
205205
/* still the same block */
206206
len += sg_dma_len(sg);
@@ -273,7 +273,7 @@ int mlx4_ib_umem_calc_optimal_mtt_size(struct ib_umem *umem, u64 start_va,
273273

274274
*num_of_mtts = ib_umem_num_dma_blocks(umem, PAGE_SIZE);
275275

276-
for_each_sg(umem->sg_head.sgl, sg, umem->nmap, i) {
276+
for_each_sgtable_dma_sg(&umem->sgt_append.sgt, sg, i) {
277277
/*
278278
* Initialization - save the first chunk start as the
279279
* current_block_start - block means contiguous pages.

drivers/infiniband/hw/mlx5/doorbell.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context, unsigned long virt,
7878
list_add(&page->list, &context->db_page_list);
7979

8080
found:
81-
db->dma = sg_dma_address(page->umem->sg_head.sgl) + (virt & ~PAGE_MASK);
81+
db->dma = sg_dma_address(page->umem->sgt_append.sgt.sgl) +
82+
(virt & ~PAGE_MASK);
8283
db->u.user_page = page;
8384
++page->refcnt;
8485

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1226,7 +1226,8 @@ int mlx5_ib_update_mr_pas(struct mlx5_ib_mr *mr, unsigned int flags)
12261226
orig_sg_length = sg.length;
12271227

12281228
cur_mtt = mtt;
1229-
rdma_for_each_block (mr->umem->sg_head.sgl, &biter, mr->umem->nmap,
1229+
rdma_for_each_block (mr->umem->sgt_append.sgt.sgl, &biter,
1230+
mr->umem->sgt_append.sgt.nents,
12301231
BIT(mr->page_shift)) {
12311232
if (cur_mtt == (void *)mtt + sg.length) {
12321233
dma_sync_single_for_device(ddev, sg.addr, sg.length,

drivers/infiniband/hw/qedr/verbs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1481,7 +1481,7 @@ static int qedr_init_srq_user_params(struct ib_udata *udata,
14811481
return PTR_ERR(srq->prod_umem);
14821482
}
14831483

1484-
sg = srq->prod_umem->sg_head.sgl;
1484+
sg = srq->prod_umem->sgt_append.sgt.sgl;
14851485
srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
14861486

14871487
return 0;

drivers/infiniband/sw/rdmavt/mr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ struct ib_mr *rvt_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
410410
mr->mr.page_shift = PAGE_SHIFT;
411411
m = 0;
412412
n = 0;
413-
for_each_sg_page (umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
413+
for_each_sgtable_page (&umem->sgt_append.sgt, &sg_iter, 0) {
414414
void *vaddr;
415415

416416
vaddr = page_address(sg_page_iter_page(&sg_iter));

0 commit comments

Comments
 (0)