]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
RDMA/efa: Use rdma block iterator in chunk list creation
authorGal Pressman <galpress@amazon.com>
Tue, 28 May 2019 12:46:17 +0000 (15:46 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 29 May 2019 16:20:48 +0000 (13:20 -0300)
When creating the chunks list the rdma_for_each_block() iterator is used
in order to iterate over the payload in EFA_CHUNK_PAYLOAD_SIZE (device
defined) strides.

Reviewed-by: Firas JahJah <firasj@amazon.com>
Reviewed-by: Yossi Leybovich <sleybo@amazon.com>
Reviewed-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Gal Pressman <galpress@amazon.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/efa/efa_verbs.c

index b791cc90d1063541db68f161a654c35d508c8406..607aff869200442fda1f478eb73e627f0476acbb 100644 (file)
@@ -1085,14 +1085,14 @@ static struct scatterlist *efa_vmalloc_buf_to_sg(u64 *buf, int page_cnt)
  */
 static int pbl_chunk_list_create(struct efa_dev *dev, struct pbl_context *pbl)
 {
-       unsigned int entry, payloads_in_sg, chunk_list_size, chunk_idx, payload_idx;
        struct pbl_chunk_list *chunk_list = &pbl->phys.indirect.chunk_list;
        int page_cnt = pbl->phys.indirect.pbl_buf_size_in_pages;
        struct scatterlist *pages_sgl = pbl->phys.indirect.sgl;
+       unsigned int chunk_list_size, chunk_idx, payload_idx;
        int sg_dma_cnt = pbl->phys.indirect.sg_dma_cnt;
        struct efa_com_ctrl_buff_info *ctrl_buf;
        u64 *cur_chunk_buf, *prev_chunk_buf;
-       struct scatterlist *sg;
+       struct ib_block_iter biter;
        dma_addr_t dma_addr;
        int i;
 
@@ -1126,18 +1126,15 @@ static int pbl_chunk_list_create(struct efa_dev *dev, struct pbl_context *pbl)
        chunk_idx = 0;
        payload_idx = 0;
        cur_chunk_buf = chunk_list->chunks[0].buf;
-       for_each_sg(pages_sgl, sg, sg_dma_cnt, entry) {
-               payloads_in_sg = sg_dma_len(sg) >> EFA_CHUNK_PAYLOAD_SHIFT;
-               for (i = 0; i < payloads_in_sg; i++) {
-                       cur_chunk_buf[payload_idx++] =
-                               (sg_dma_address(sg) & ~(EFA_CHUNK_PAYLOAD_SIZE - 1)) +
-                               (EFA_CHUNK_PAYLOAD_SIZE * i);
-
-                       if (payload_idx == EFA_PTRS_PER_CHUNK) {
-                               chunk_idx++;
-                               cur_chunk_buf = chunk_list->chunks[chunk_idx].buf;
-                               payload_idx = 0;
-                       }
+       rdma_for_each_block(pages_sgl, &biter, sg_dma_cnt,
+                           EFA_CHUNK_PAYLOAD_SIZE) {
+               cur_chunk_buf[payload_idx++] =
+                       rdma_block_iter_dma_address(&biter);
+
+               if (payload_idx == EFA_PTRS_PER_CHUNK) {
+                       chunk_idx++;
+                       cur_chunk_buf = chunk_list->chunks[chunk_idx].buf;
+                       payload_idx = 0;
                }
        }