Skip to content

Commit

Permalink
IB/iser: Remove code duplication for a single DMA entry
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sagi Grimberg authored and Doug Ledford committed Apr 15, 2015
1 parent 6ef8bb8 commit ad1e567
Showing 1 changed file with 21 additions and 27 deletions.
48 changes: 21 additions & 27 deletions drivers/infiniband/ulp/iser/iser_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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];

Expand All @@ -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);
Expand Down Expand Up @@ -659,26 +664,15 @@ 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;
struct ib_send_wr *bad_wr, *wr = NULL;
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;
Expand Down

0 comments on commit ad1e567

Please sign in to comment.