]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
IB/iser: Remove code duplication for a single DMA entry
authorSagi Grimberg <sagig@mellanox.com>
Tue, 14 Apr 2015 15:08:26 +0000 (18:08 +0300)
committerDoug Ledford <dledford@redhat.com>
Wed, 15 Apr 2015 20:07:13 +0000 (16:07 -0400)
In singleton scatterlists, DMA memory registration code
is taken both for Fastreg and FMR code paths. Move it to
a function.

This patch does not change any functionality.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Adir Lev <adirl@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/iser/iser_memory.c

index 0575052d9f8fffcae4b1c6249a719f3ed0415058..abc979e62ae1e5b846c54a2ad9c6965faed5c5e1 100644 (file)
@@ -334,6 +334,24 @@ void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
        ib_dma_unmap_sg(dev, data->sg, data->size, dir);
 }
 
+static int
+iser_reg_dma(struct iser_device *device, struct iser_data_buf *mem,
+            struct iser_mem_reg *reg)
+{
+       struct scatterlist *sg = mem->sg;
+
+       reg->sge.lkey = device->mr->lkey;
+       reg->rkey = device->mr->rkey;
+       reg->sge.addr = ib_sg_dma_address(device->ib_device, &sg[0]);
+       reg->sge.length = ib_sg_dma_len(device->ib_device, &sg[0]);
+
+       iser_dbg("Single DMA entry: lkey=0x%x, rkey=0x%x, addr=0x%llx,"
+                " length=0x%x\n", reg->sge.lkey, reg->rkey,
+                reg->sge.addr, reg->sge.length);
+
+       return 0;
+}
+
 static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,
                              struct iser_data_buf *mem,
                              enum iser_data_dir cmd_dir,
@@ -461,7 +479,6 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
        int aligned_len;
        int err;
        int i;
-       struct scatterlist *sg;
 
        mem_reg = &iser_task->rdma_reg[cmd_dir];
 
@@ -477,19 +494,7 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
 
        /* if there a single dma entry, FMR is not needed */
        if (mem->dma_nents == 1) {
-               sg = mem->sg;
-
-               mem_reg->sge.lkey = device->mr->lkey;
-               mem_reg->rkey = device->mr->rkey;
-               mem_reg->sge.length = ib_sg_dma_len(ibdev, &sg[0]);
-               mem_reg->sge.addr = ib_sg_dma_address(ibdev, &sg[0]);
-
-               iser_dbg("PHYSICAL Mem.register: lkey: 0x%08X rkey: 0x%08X  "
-                        "va: 0x%08lX sz: %ld]\n",
-                        (unsigned int)mem_reg->sge.lkey,
-                        (unsigned int)mem_reg->rkey,
-                        (unsigned long)mem_reg->sge.addr,
-                        (unsigned long)mem_reg->sge.length);
+               return iser_reg_dma(device, mem, mem_reg);
        } else { /* use FMR for multiple dma entries */
                err = iser_reg_page_vec(iser_task, mem, ib_conn->fmr.page_vec,
                                        mem_reg);
@@ -659,7 +664,6 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
 {
        struct ib_conn *ib_conn = &iser_task->iser_conn->ib_conn;
        struct iser_device *device = ib_conn->device;
-       struct ib_device *ibdev = device->ib_device;
        struct ib_mr *mr;
        struct ib_fast_reg_page_list *frpl;
        struct ib_send_wr fastreg_wr, inv_wr;
@@ -667,18 +671,8 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
        int ret, offset, size, plen;
 
        /* if there a single dma entry, dma mr suffices */
-       if (mem->dma_nents == 1) {
-               struct scatterlist *sg = mem->sg;
-
-               reg->sge.lkey = device->mr->lkey;
-               reg->rkey = device->mr->rkey;
-               reg->sge.addr = ib_sg_dma_address(ibdev, &sg[0]);
-               reg->sge.length = ib_sg_dma_len(ibdev, &sg[0]);
-
-               iser_dbg("Single DMA entry: lkey=0x%x, addr=0x%llx, length=0x%x\n",
-                        reg->sge.lkey, reg->sge.addr, reg->sge.length);
-               return 0;
-       }
+       if (mem->dma_nents == 1)
+               return iser_reg_dma(device, mem, reg);
 
        if (ind == ISER_DATA_KEY_VALID) {
                mr = desc->data_mr;