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

Commit b5f04b00 authored by Jenny Derzhavetz's avatar Jenny Derzhavetz Committed by Doug Ledford
Browse files

IB/iser: Don't register memory for all immediate data writes



When all the task data is sent as immediate data, we are
allowed to use the local_dma_lkey as it is not sent to
the wire.

Signed-off-by: default avatarJenny Derzhavetz <jennyf@mellanox.com>
Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent bfe066e2
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -658,7 +658,8 @@ void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *iser_task,
				     enum iser_data_dir cmd_dir);
				     enum iser_data_dir cmd_dir);


int iser_reg_rdma_mem(struct iscsi_iser_task *task,
int iser_reg_rdma_mem(struct iscsi_iser_task *task,
		      enum iser_data_dir dir);
		      enum iser_data_dir dir,
		      bool all_imm);
void iser_unreg_rdma_mem(struct iscsi_iser_task *task,
void iser_unreg_rdma_mem(struct iscsi_iser_task *task,
			 enum iser_data_dir dir);
			 enum iser_data_dir dir);


+3 −2
Original line number Original line Diff line number Diff line
@@ -72,7 +72,7 @@ static int iser_prepare_read_cmd(struct iscsi_task *task)
			return err;
			return err;
	}
	}


	err = iser_reg_rdma_mem(iser_task, ISER_DIR_IN);
	err = iser_reg_rdma_mem(iser_task, ISER_DIR_IN, false);
	if (err) {
	if (err) {
		iser_err("Failed to set up Data-IN RDMA\n");
		iser_err("Failed to set up Data-IN RDMA\n");
		return err;
		return err;
@@ -126,7 +126,8 @@ iser_prepare_write_cmd(struct iscsi_task *task,
			return err;
			return err;
	}
	}


	err = iser_reg_rdma_mem(iser_task, ISER_DIR_OUT);
	err = iser_reg_rdma_mem(iser_task, ISER_DIR_OUT,
				buf_out->data_len == imm_sz);
	if (err != 0) {
	if (err != 0) {
		iser_err("Failed to register write cmd RDMA mem\n");
		iser_err("Failed to register write cmd RDMA mem\n");
		return err;
		return err;
+9 −4
Original line number Original line Diff line number Diff line
@@ -194,7 +194,11 @@ iser_reg_dma(struct iser_device *device, struct iser_data_buf *mem,
	struct scatterlist *sg = mem->sg;
	struct scatterlist *sg = mem->sg;


	reg->sge.lkey = device->pd->local_dma_lkey;
	reg->sge.lkey = device->pd->local_dma_lkey;
	reg->rkey = device->mr->rkey;
	/*
	 * FIXME: rework the registration code path to differentiate
	 * rkey/lkey use cases
	 */
	reg->rkey = device->mr ? device->mr->rkey : 0;
	reg->sge.addr = ib_sg_dma_address(device->ib_device, &sg[0]);
	reg->sge.addr = ib_sg_dma_address(device->ib_device, &sg[0]);
	reg->sge.length = ib_sg_dma_len(device->ib_device, &sg[0]);
	reg->sge.length = ib_sg_dma_len(device->ib_device, &sg[0]);


@@ -503,7 +507,8 @@ iser_reg_data_sg(struct iscsi_iser_task *task,
}
}


int iser_reg_rdma_mem(struct iscsi_iser_task *task,
int iser_reg_rdma_mem(struct iscsi_iser_task *task,
		      enum iser_data_dir dir)
		      enum iser_data_dir dir,
		      bool all_imm)
{
{
	struct ib_conn *ib_conn = &task->iser_conn->ib_conn;
	struct ib_conn *ib_conn = &task->iser_conn->ib_conn;
	struct iser_device *device = ib_conn->device;
	struct iser_device *device = ib_conn->device;
@@ -514,8 +519,8 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *task,
	bool use_dma_key;
	bool use_dma_key;
	int err;
	int err;


	use_dma_key = (mem->dma_nents == 1 && !iser_always_reg &&
	use_dma_key = mem->dma_nents == 1 && (all_imm || !iser_always_reg) &&
		       scsi_get_prot_op(task->sc) == SCSI_PROT_NORMAL);
		      scsi_get_prot_op(task->sc) == SCSI_PROT_NORMAL;


	if (!use_dma_key) {
	if (!use_dma_key) {
		desc = device->reg_ops->reg_desc_get(ib_conn);
		desc = device->reg_ops->reg_desc_get(ib_conn);