aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.h21
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c44
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c56
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c2
4 files changed, 53 insertions, 70 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index d5e5288fe3dd..8133678b6218 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -261,23 +261,6 @@ struct iser_mem_reg {
261 void *mem_h; 261 void *mem_h;
262}; 262};
263 263
264/**
265 * struct iser_regd_buf - iSER buffer registration desc
266 *
267 * @reg: memory registration info
268 * @virt_addr: virtual address of buffer
269 * @device: reference to iser device
270 * @direction: dma direction (for dma_unmap)
271 * @data_size: data buffer size in bytes
272 */
273struct iser_regd_buf {
274 struct iser_mem_reg reg;
275 void *virt_addr;
276 struct iser_device *device;
277 enum dma_data_direction direction;
278 unsigned int data_size;
279};
280
281enum iser_desc_type { 264enum iser_desc_type {
282 ISCSI_TX_CONTROL , 265 ISCSI_TX_CONTROL ,
283 ISCSI_TX_SCSI_COMMAND, 266 ISCSI_TX_SCSI_COMMAND,
@@ -537,7 +520,7 @@ struct iser_conn {
537 * @sc: link to scsi command 520 * @sc: link to scsi command
538 * @command_sent: indicate if command was sent 521 * @command_sent: indicate if command was sent
539 * @dir: iser data direction 522 * @dir: iser data direction
540 * @rdma_regd: task rdma registration desc 523 * @rdma_reg: task rdma registration desc
541 * @data: iser data buffer desc 524 * @data: iser data buffer desc
542 * @prot: iser protection buffer desc 525 * @prot: iser protection buffer desc
543 */ 526 */
@@ -548,7 +531,7 @@ struct iscsi_iser_task {
548 struct scsi_cmnd *sc; 531 struct scsi_cmnd *sc;
549 int command_sent; 532 int command_sent;
550 int dir[ISER_DIRS_NUM]; 533 int dir[ISER_DIRS_NUM];
551 struct iser_regd_buf rdma_regd[ISER_DIRS_NUM]; 534 struct iser_mem_reg rdma_reg[ISER_DIRS_NUM];
552 struct iser_data_buf data[ISER_DIRS_NUM]; 535 struct iser_data_buf data[ISER_DIRS_NUM];
553 struct iser_data_buf prot[ISER_DIRS_NUM]; 536 struct iser_data_buf prot[ISER_DIRS_NUM];
554}; 537};
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index 0e414dbaa523..420a613fe9f5 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -50,7 +50,7 @@ static int iser_prepare_read_cmd(struct iscsi_task *task)
50{ 50{
51 struct iscsi_iser_task *iser_task = task->dd_data; 51 struct iscsi_iser_task *iser_task = task->dd_data;
52 struct iser_device *device = iser_task->iser_conn->ib_conn.device; 52 struct iser_device *device = iser_task->iser_conn->ib_conn.device;
53 struct iser_regd_buf *regd_buf; 53 struct iser_mem_reg *mem_reg;
54 int err; 54 int err;
55 struct iser_hdr *hdr = &iser_task->desc.iser_header; 55 struct iser_hdr *hdr = &iser_task->desc.iser_header;
56 struct iser_data_buf *buf_in = &iser_task->data[ISER_DIR_IN]; 56 struct iser_data_buf *buf_in = &iser_task->data[ISER_DIR_IN];
@@ -78,15 +78,15 @@ static int iser_prepare_read_cmd(struct iscsi_task *task)
78 iser_err("Failed to set up Data-IN RDMA\n"); 78 iser_err("Failed to set up Data-IN RDMA\n");
79 return err; 79 return err;
80 } 80 }
81 regd_buf = &iser_task->rdma_regd[ISER_DIR_IN]; 81 mem_reg = &iser_task->rdma_reg[ISER_DIR_IN];
82 82
83 hdr->flags |= ISER_RSV; 83 hdr->flags |= ISER_RSV;
84 hdr->read_stag = cpu_to_be32(regd_buf->reg.rkey); 84 hdr->read_stag = cpu_to_be32(mem_reg->rkey);
85 hdr->read_va = cpu_to_be64(regd_buf->reg.va); 85 hdr->read_va = cpu_to_be64(mem_reg->va);
86 86
87 iser_dbg("Cmd itt:%d READ tags RKEY:%#.4X VA:%#llX\n", 87 iser_dbg("Cmd itt:%d READ tags RKEY:%#.4X VA:%#llX\n",
88 task->itt, regd_buf->reg.rkey, 88 task->itt, mem_reg->rkey,
89 (unsigned long long)regd_buf->reg.va); 89 (unsigned long long)mem_reg->va);
90 90
91 return 0; 91 return 0;
92} 92}
@@ -104,7 +104,7 @@ iser_prepare_write_cmd(struct iscsi_task *task,
104{ 104{
105 struct iscsi_iser_task *iser_task = task->dd_data; 105 struct iscsi_iser_task *iser_task = task->dd_data;
106 struct iser_device *device = iser_task->iser_conn->ib_conn.device; 106 struct iser_device *device = iser_task->iser_conn->ib_conn.device;
107 struct iser_regd_buf *regd_buf; 107 struct iser_mem_reg *mem_reg;
108 int err; 108 int err;
109 struct iser_hdr *hdr = &iser_task->desc.iser_header; 109 struct iser_hdr *hdr = &iser_task->desc.iser_header;
110 struct iser_data_buf *buf_out = &iser_task->data[ISER_DIR_OUT]; 110 struct iser_data_buf *buf_out = &iser_task->data[ISER_DIR_OUT];
@@ -134,25 +134,25 @@ iser_prepare_write_cmd(struct iscsi_task *task,
134 return err; 134 return err;
135 } 135 }
136 136
137 regd_buf = &iser_task->rdma_regd[ISER_DIR_OUT]; 137 mem_reg = &iser_task->rdma_reg[ISER_DIR_OUT];
138 138
139 if (unsol_sz < edtl) { 139 if (unsol_sz < edtl) {
140 hdr->flags |= ISER_WSV; 140 hdr->flags |= ISER_WSV;
141 hdr->write_stag = cpu_to_be32(regd_buf->reg.rkey); 141 hdr->write_stag = cpu_to_be32(mem_reg->rkey);
142 hdr->write_va = cpu_to_be64(regd_buf->reg.va + unsol_sz); 142 hdr->write_va = cpu_to_be64(mem_reg->va + unsol_sz);
143 143
144 iser_dbg("Cmd itt:%d, WRITE tags, RKEY:%#.4X " 144 iser_dbg("Cmd itt:%d, WRITE tags, RKEY:%#.4X "
145 "VA:%#llX + unsol:%d\n", 145 "VA:%#llX + unsol:%d\n",
146 task->itt, regd_buf->reg.rkey, 146 task->itt, mem_reg->rkey,
147 (unsigned long long)regd_buf->reg.va, unsol_sz); 147 (unsigned long long)mem_reg->va, unsol_sz);
148 } 148 }
149 149
150 if (imm_sz > 0) { 150 if (imm_sz > 0) {
151 iser_dbg("Cmd itt:%d, WRITE, adding imm.data sz: %d\n", 151 iser_dbg("Cmd itt:%d, WRITE, adding imm.data sz: %d\n",
152 task->itt, imm_sz); 152 task->itt, imm_sz);
153 tx_dsg->addr = regd_buf->reg.va; 153 tx_dsg->addr = mem_reg->va;
154 tx_dsg->length = imm_sz; 154 tx_dsg->length = imm_sz;
155 tx_dsg->lkey = regd_buf->reg.lkey; 155 tx_dsg->lkey = mem_reg->lkey;
156 iser_task->desc.num_sge = 2; 156 iser_task->desc.num_sge = 2;
157 } 157 }
158 158
@@ -450,7 +450,7 @@ int iser_send_data_out(struct iscsi_conn *conn,
450 struct iser_conn *iser_conn = conn->dd_data; 450 struct iser_conn *iser_conn = conn->dd_data;
451 struct iscsi_iser_task *iser_task = task->dd_data; 451 struct iscsi_iser_task *iser_task = task->dd_data;
452 struct iser_tx_desc *tx_desc = NULL; 452 struct iser_tx_desc *tx_desc = NULL;
453 struct iser_regd_buf *regd_buf; 453 struct iser_mem_reg *mem_reg;
454 unsigned long buf_offset; 454 unsigned long buf_offset;
455 unsigned long data_seg_len; 455 unsigned long data_seg_len;
456 uint32_t itt; 456 uint32_t itt;
@@ -477,11 +477,11 @@ int iser_send_data_out(struct iscsi_conn *conn,
477 /* build the tx desc */ 477 /* build the tx desc */
478 iser_initialize_task_headers(task, tx_desc); 478 iser_initialize_task_headers(task, tx_desc);
479 479
480 regd_buf = &iser_task->rdma_regd[ISER_DIR_OUT]; 480 mem_reg = &iser_task->rdma_reg[ISER_DIR_OUT];
481 tx_dsg = &tx_desc->tx_sg[1]; 481 tx_dsg = &tx_desc->tx_sg[1];
482 tx_dsg->addr = regd_buf->reg.va + buf_offset; 482 tx_dsg->addr = mem_reg->va + buf_offset;
483 tx_dsg->length = data_seg_len; 483 tx_dsg->length = data_seg_len;
484 tx_dsg->lkey = regd_buf->reg.lkey; 484 tx_dsg->lkey = mem_reg->lkey;
485 tx_desc->num_sge = 2; 485 tx_desc->num_sge = 2;
486 486
487 if (buf_offset + data_seg_len > iser_task->data[ISER_DIR_OUT].data_len) { 487 if (buf_offset + data_seg_len > iser_task->data[ISER_DIR_OUT].data_len) {
@@ -658,10 +658,10 @@ void iser_task_rdma_init(struct iscsi_iser_task *iser_task)
658 iser_task->prot[ISER_DIR_IN].data_len = 0; 658 iser_task->prot[ISER_DIR_IN].data_len = 0;
659 iser_task->prot[ISER_DIR_OUT].data_len = 0; 659 iser_task->prot[ISER_DIR_OUT].data_len = 0;
660 660
661 memset(&iser_task->rdma_regd[ISER_DIR_IN], 0, 661 memset(&iser_task->rdma_reg[ISER_DIR_IN], 0,
662 sizeof(struct iser_regd_buf)); 662 sizeof(struct iser_mem_reg));
663 memset(&iser_task->rdma_regd[ISER_DIR_OUT], 0, 663 memset(&iser_task->rdma_reg[ISER_DIR_OUT], 0,
664 sizeof(struct iser_regd_buf)); 664 sizeof(struct iser_mem_reg));
665} 665}
666 666
667void iser_task_rdma_finalize(struct iscsi_iser_task *iser_task) 667void iser_task_rdma_finalize(struct iscsi_iser_task *iser_task)
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index cb308650b94a..0b8656fcbc0d 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -414,7 +414,7 @@ int iser_reg_page_vec(struct ib_conn *ib_conn,
414void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task, 414void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
415 enum iser_data_dir cmd_dir) 415 enum iser_data_dir cmd_dir)
416{ 416{
417 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg; 417 struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
418 int ret; 418 int ret;
419 419
420 if (!reg->mem_h) 420 if (!reg->mem_h)
@@ -432,7 +432,7 @@ void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
432void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task, 432void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
433 enum iser_data_dir cmd_dir) 433 enum iser_data_dir cmd_dir)
434{ 434{
435 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg; 435 struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
436 struct iser_conn *iser_conn = iser_task->iser_conn; 436 struct iser_conn *iser_conn = iser_task->iser_conn;
437 struct ib_conn *ib_conn = &iser_conn->ib_conn; 437 struct ib_conn *ib_conn = &iser_conn->ib_conn;
438 struct fast_reg_descriptor *desc = reg->mem_h; 438 struct fast_reg_descriptor *desc = reg->mem_h;
@@ -459,13 +459,13 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
459 struct iser_device *device = ib_conn->device; 459 struct iser_device *device = ib_conn->device;
460 struct ib_device *ibdev = device->ib_device; 460 struct ib_device *ibdev = device->ib_device;
461 struct iser_data_buf *mem = &iser_task->data[cmd_dir]; 461 struct iser_data_buf *mem = &iser_task->data[cmd_dir];
462 struct iser_regd_buf *regd_buf; 462 struct iser_mem_reg *mem_reg;
463 int aligned_len; 463 int aligned_len;
464 int err; 464 int err;
465 int i; 465 int i;
466 struct scatterlist *sg; 466 struct scatterlist *sg;
467 467
468 regd_buf = &iser_task->rdma_regd[cmd_dir]; 468 mem_reg = &iser_task->rdma_reg[cmd_dir];
469 469
470 aligned_len = iser_data_buf_aligned_len(mem, ibdev); 470 aligned_len = iser_data_buf_aligned_len(mem, ibdev);
471 if (aligned_len != mem->dma_nents) { 471 if (aligned_len != mem->dma_nents) {
@@ -481,21 +481,21 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
481 if (mem->dma_nents == 1) { 481 if (mem->dma_nents == 1) {
482 sg = mem->sg; 482 sg = mem->sg;
483 483
484 regd_buf->reg.lkey = device->mr->lkey; 484 mem_reg->lkey = device->mr->lkey;
485 regd_buf->reg.rkey = device->mr->rkey; 485 mem_reg->rkey = device->mr->rkey;
486 regd_buf->reg.len = ib_sg_dma_len(ibdev, &sg[0]); 486 mem_reg->len = ib_sg_dma_len(ibdev, &sg[0]);
487 regd_buf->reg.va = ib_sg_dma_address(ibdev, &sg[0]); 487 mem_reg->va = ib_sg_dma_address(ibdev, &sg[0]);
488 488
489 iser_dbg("PHYSICAL Mem.register: lkey: 0x%08X rkey: 0x%08X " 489 iser_dbg("PHYSICAL Mem.register: lkey: 0x%08X rkey: 0x%08X "
490 "va: 0x%08lX sz: %ld]\n", 490 "va: 0x%08lX sz: %ld]\n",
491 (unsigned int)regd_buf->reg.lkey, 491 (unsigned int)mem_reg->lkey,
492 (unsigned int)regd_buf->reg.rkey, 492 (unsigned int)mem_reg->rkey,
493 (unsigned long)regd_buf->reg.va, 493 (unsigned long)mem_reg->va,
494 (unsigned long)regd_buf->reg.len); 494 (unsigned long)mem_reg->len);
495 } else { /* use FMR for multiple dma entries */ 495 } else { /* use FMR for multiple dma entries */
496 iser_page_vec_build(mem, ib_conn->fmr.page_vec, ibdev); 496 iser_page_vec_build(mem, ib_conn->fmr.page_vec, ibdev);
497 err = iser_reg_page_vec(ib_conn, ib_conn->fmr.page_vec, 497 err = iser_reg_page_vec(ib_conn, ib_conn->fmr.page_vec,
498 &regd_buf->reg); 498 mem_reg);
499 if (err && err != -EAGAIN) { 499 if (err && err != -EAGAIN) {
500 iser_data_buf_dump(mem, ibdev); 500 iser_data_buf_dump(mem, ibdev);
501 iser_err("mem->dma_nents = %d (dlength = 0x%x)\n", 501 iser_err("mem->dma_nents = %d (dlength = 0x%x)\n",
@@ -652,12 +652,12 @@ err:
652} 652}
653 653
654static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task, 654static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
655 struct iser_regd_buf *regd_buf, 655 struct iser_mem_reg *mem_reg,
656 struct iser_data_buf *mem, 656 struct iser_data_buf *mem,
657 enum iser_reg_indicator ind, 657 enum iser_reg_indicator ind,
658 struct ib_sge *sge) 658 struct ib_sge *sge)
659{ 659{
660 struct fast_reg_descriptor *desc = regd_buf->reg.mem_h; 660 struct fast_reg_descriptor *desc = mem_reg->mem_h;
661 struct ib_conn *ib_conn = &iser_task->iser_conn->ib_conn; 661 struct ib_conn *ib_conn = &iser_task->iser_conn->ib_conn;
662 struct iser_device *device = ib_conn->device; 662 struct iser_device *device = ib_conn->device;
663 struct ib_device *ibdev = device->ib_device; 663 struct ib_device *ibdev = device->ib_device;
@@ -746,7 +746,7 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
746 struct iser_device *device = ib_conn->device; 746 struct iser_device *device = ib_conn->device;
747 struct ib_device *ibdev = device->ib_device; 747 struct ib_device *ibdev = device->ib_device;
748 struct iser_data_buf *mem = &iser_task->data[cmd_dir]; 748 struct iser_data_buf *mem = &iser_task->data[cmd_dir];
749 struct iser_regd_buf *regd_buf = &iser_task->rdma_regd[cmd_dir]; 749 struct iser_mem_reg *mem_reg = &iser_task->rdma_reg[cmd_dir];
750 struct fast_reg_descriptor *desc = NULL; 750 struct fast_reg_descriptor *desc = NULL;
751 struct ib_sge data_sge; 751 struct ib_sge data_sge;
752 int err, aligned_len; 752 int err, aligned_len;
@@ -769,10 +769,10 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
769 struct fast_reg_descriptor, list); 769 struct fast_reg_descriptor, list);
770 list_del(&desc->list); 770 list_del(&desc->list);
771 spin_unlock_irqrestore(&ib_conn->lock, flags); 771 spin_unlock_irqrestore(&ib_conn->lock, flags);
772 regd_buf->reg.mem_h = desc; 772 mem_reg->mem_h = desc;
773 } 773 }
774 774
775 err = iser_fast_reg_mr(iser_task, regd_buf, mem, 775 err = iser_fast_reg_mr(iser_task, mem_reg, mem,
776 ISER_DATA_KEY_VALID, &data_sge); 776 ISER_DATA_KEY_VALID, &data_sge);
777 if (err) 777 if (err)
778 goto err_reg; 778 goto err_reg;
@@ -793,7 +793,7 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
793 } 793 }
794 } 794 }
795 795
796 err = iser_fast_reg_mr(iser_task, regd_buf, mem, 796 err = iser_fast_reg_mr(iser_task, mem_reg, mem,
797 ISER_PROT_KEY_VALID, &prot_sge); 797 ISER_PROT_KEY_VALID, &prot_sge);
798 if (err) 798 if (err)
799 goto err_reg; 799 goto err_reg;
@@ -807,19 +807,19 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
807 } 807 }
808 desc->reg_indicators |= ISER_FASTREG_PROTECTED; 808 desc->reg_indicators |= ISER_FASTREG_PROTECTED;
809 809
810 regd_buf->reg.lkey = sig_sge.lkey; 810 mem_reg->lkey = sig_sge.lkey;
811 regd_buf->reg.rkey = desc->pi_ctx->sig_mr->rkey; 811 mem_reg->rkey = desc->pi_ctx->sig_mr->rkey;
812 regd_buf->reg.va = sig_sge.addr; 812 mem_reg->va = sig_sge.addr;
813 regd_buf->reg.len = sig_sge.length; 813 mem_reg->len = sig_sge.length;
814 } else { 814 } else {
815 if (desc) 815 if (desc)
816 regd_buf->reg.rkey = desc->data_mr->rkey; 816 mem_reg->rkey = desc->data_mr->rkey;
817 else 817 else
818 regd_buf->reg.rkey = device->mr->rkey; 818 mem_reg->rkey = device->mr->rkey;
819 819
820 regd_buf->reg.lkey = data_sge.lkey; 820 mem_reg->lkey = data_sge.lkey;
821 regd_buf->reg.va = data_sge.addr; 821 mem_reg->va = data_sge.addr;
822 regd_buf->reg.len = data_sge.length; 822 mem_reg->len = data_sge.length;
823 } 823 }
824 824
825 return 0; 825 return 0;
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 986b5f4823ea..20eec09dc86a 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -1220,7 +1220,7 @@ static void iser_cq_callback(struct ib_cq *cq, void *cq_context)
1220u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task, 1220u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,
1221 enum iser_data_dir cmd_dir, sector_t *sector) 1221 enum iser_data_dir cmd_dir, sector_t *sector)
1222{ 1222{
1223 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg; 1223 struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
1224 struct fast_reg_descriptor *desc = reg->mem_h; 1224 struct fast_reg_descriptor *desc = reg->mem_h;
1225 unsigned long sector_size = iser_task->sc->device->sector_size; 1225 unsigned long sector_size = iser_task->sc->device->sector_size;
1226 struct ib_mr_status mr_status; 1226 struct ib_mr_status mr_status;