|
@@ -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;
|