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: Jenny Derzhavetz <jennyf@mellanox.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
bfe066e256
commit
b5f04b00f7
|
@ -658,7 +658,8 @@ void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *iser_task,
|
|||
enum iser_data_dir cmd_dir);
|
||||
|
||||
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,
|
||||
enum iser_data_dir dir);
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ static int iser_prepare_read_cmd(struct iscsi_task *task)
|
|||
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) {
|
||||
iser_err("Failed to set up Data-IN RDMA\n");
|
||||
return err;
|
||||
|
@ -126,7 +126,8 @@ iser_prepare_write_cmd(struct iscsi_task *task,
|
|||
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) {
|
||||
iser_err("Failed to register write cmd RDMA mem\n");
|
||||
return err;
|
||||
|
|
|
@ -194,7 +194,11 @@ iser_reg_dma(struct iser_device *device, struct iser_data_buf *mem,
|
|||
struct scatterlist *sg = mem->sg;
|
||||
|
||||
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.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,
|
||||
enum iser_data_dir dir)
|
||||
enum iser_data_dir dir,
|
||||
bool all_imm)
|
||||
{
|
||||
struct ib_conn *ib_conn = &task->iser_conn->ib_conn;
|
||||
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;
|
||||
int err;
|
||||
|
||||
use_dma_key = (mem->dma_nents == 1 && !iser_always_reg &&
|
||||
scsi_get_prot_op(task->sc) == SCSI_PROT_NORMAL);
|
||||
use_dma_key = mem->dma_nents == 1 && (all_imm || !iser_always_reg) &&
|
||||
scsi_get_prot_op(task->sc) == SCSI_PROT_NORMAL;
|
||||
|
||||
if (!use_dma_key) {
|
||||
desc = device->reg_ops->reg_desc_get(ib_conn);
|
||||
|
|
Loading…
Reference in a new issue