IB/iser: Pass the correct number of entries for dma mapped SGL
authorIsrael Rukshin <israelr@mellanox.com>
Thu, 17 Jan 2019 15:45:45 +0000 (15:45 +0000)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 18 Jan 2019 21:12:24 +0000 (14:12 -0700)
ib_dma_map_sg() augments the SGL into a 'dma mapped SGL'. This process may
change the number of entries and the lengths of each entry.

Code that touches dma_address is iterating over the 'dma mapped SGL' and
must use dma_nents which returned from ib_dma_map_sg().

ib_sg_to_pages() and ib_map_mr_sg() are using dma_address so they must use
dma_nents.

Fixes: 39405885005a ("IB/iser: Port to new fast registration API")
Fixes: bfe066e256d5 ("IB/iser: Reuse ib_sg_to_pages")
Signed-off-by: Israel Rukshin <israelr@mellanox.com>
Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
Acked-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/ulp/iser/iser_memory.c

index e9b7efc302d01f08551ac46b0eb8ceb915c85b43..394d1b9c2ff7d68eb18784b3d059ff3da8f3a89c 100644 (file)
@@ -240,8 +240,8 @@ int iser_fast_reg_fmr(struct iscsi_iser_task *iser_task,
        page_vec->npages = 0;
        page_vec->fake_mr.page_size = SIZE_4K;
        plen = ib_sg_to_pages(&page_vec->fake_mr, mem->sg,
-                             mem->size, NULL, iser_set_page);
-       if (unlikely(plen < mem->size)) {
+                             mem->dma_nents, NULL, iser_set_page);
+       if (unlikely(plen < mem->dma_nents)) {
                iser_err("page vec too short to hold this SG\n");
                iser_data_buf_dump(mem, device->ib_device);
                iser_dump_page_vec(page_vec);
@@ -448,10 +448,10 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
 
        ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey));
 
-       n = ib_map_mr_sg(mr, mem->sg, mem->size, NULL, SIZE_4K);
-       if (unlikely(n != mem->size)) {
+       n = ib_map_mr_sg(mr, mem->sg, mem->dma_nents, NULL, SIZE_4K);
+       if (unlikely(n != mem->dma_nents)) {
                iser_err("failed to map sg (%d/%d)\n",
-                        n, mem->size);
+                        n, mem->dma_nents);
                return n < 0 ? n : -EINVAL;
        }