Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad1e5672 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Doug Ledford
Browse files

IB/iser: Remove code duplication for a single DMA entry



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: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarAdir Lev <adirl@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 6ef8bb83
Loading
Loading
Loading
Loading
+21 −27
Original line number Diff line number Diff line
@@ -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;