aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoi Dayan <roid@mellanox.com>2014-12-28 07:26:11 -0500
committerRoland Dreier <roland@purestorage.com>2015-02-13 14:27:31 -0500
commitc6c95ef4cec680f7a10aa425a9970744b35b6489 (patch)
tree080f2256dcfa5cdc1a107989a808863449e08bc8
parentbfa76d49576599a4b9f9b7a71f23d73d6dcff735 (diff)
IB/iser: Use correct dma direction when unmapping SGs
We always unmap SGs with the same direction instead of unmapping with the direction the mapping was done, fix that. Fixes: 9a8b08fad2ef ("IB/iser: Generalize iser_unmap_task_data and [...]") Signed-off-by: Roi Dayan <roid@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.h4
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c12
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c9
3 files changed, 17 insertions, 8 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index 5ce26817e7e1..b47aea1094b2 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -654,7 +654,9 @@ int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
654 enum dma_data_direction dma_dir); 654 enum dma_data_direction dma_dir);
655 655
656void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task, 656void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
657 struct iser_data_buf *data); 657 struct iser_data_buf *data,
658 enum dma_data_direction dir);
659
658int iser_initialize_task_headers(struct iscsi_task *task, 660int iser_initialize_task_headers(struct iscsi_task *task,
659 struct iser_tx_desc *tx_desc); 661 struct iser_tx_desc *tx_desc);
660int iser_alloc_rx_descriptors(struct iser_conn *iser_conn, 662int iser_alloc_rx_descriptors(struct iser_conn *iser_conn,
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index 3821633f1065..bdf2b22e336b 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -714,19 +714,23 @@ void iser_task_rdma_finalize(struct iscsi_iser_task *iser_task)
714 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_IN); 714 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_IN);
715 if (is_rdma_data_aligned) 715 if (is_rdma_data_aligned)
716 iser_dma_unmap_task_data(iser_task, 716 iser_dma_unmap_task_data(iser_task,
717 &iser_task->data[ISER_DIR_IN]); 717 &iser_task->data[ISER_DIR_IN],
718 DMA_FROM_DEVICE);
718 if (prot_count && is_rdma_prot_aligned) 719 if (prot_count && is_rdma_prot_aligned)
719 iser_dma_unmap_task_data(iser_task, 720 iser_dma_unmap_task_data(iser_task,
720 &iser_task->prot[ISER_DIR_IN]); 721 &iser_task->prot[ISER_DIR_IN],
722 DMA_FROM_DEVICE);
721 } 723 }
722 724
723 if (iser_task->dir[ISER_DIR_OUT]) { 725 if (iser_task->dir[ISER_DIR_OUT]) {
724 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_OUT); 726 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_OUT);
725 if (is_rdma_data_aligned) 727 if (is_rdma_data_aligned)
726 iser_dma_unmap_task_data(iser_task, 728 iser_dma_unmap_task_data(iser_task,
727 &iser_task->data[ISER_DIR_OUT]); 729 &iser_task->data[ISER_DIR_OUT],
730 DMA_TO_DEVICE);
728 if (prot_count && is_rdma_prot_aligned) 731 if (prot_count && is_rdma_prot_aligned)
729 iser_dma_unmap_task_data(iser_task, 732 iser_dma_unmap_task_data(iser_task,
730 &iser_task->prot[ISER_DIR_OUT]); 733 &iser_task->prot[ISER_DIR_OUT],
734 DMA_TO_DEVICE);
731 } 735 }
732} 736}
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index abce9339333f..341040bf0984 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -332,12 +332,13 @@ int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
332} 332}
333 333
334void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task, 334void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
335 struct iser_data_buf *data) 335 struct iser_data_buf *data,
336 enum dma_data_direction dir)
336{ 337{
337 struct ib_device *dev; 338 struct ib_device *dev;
338 339
339 dev = iser_task->iser_conn->ib_conn.device->ib_device; 340 dev = iser_task->iser_conn->ib_conn.device->ib_device;
340 ib_dma_unmap_sg(dev, data->buf, data->size, DMA_FROM_DEVICE); 341 ib_dma_unmap_sg(dev, data->buf, data->size, dir);
341} 342}
342 343
343static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task, 344static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,
@@ -357,7 +358,9 @@ static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,
357 iser_data_buf_dump(mem, ibdev); 358 iser_data_buf_dump(mem, ibdev);
358 359
359 /* unmap the command data before accessing it */ 360 /* unmap the command data before accessing it */
360 iser_dma_unmap_task_data(iser_task, mem); 361 iser_dma_unmap_task_data(iser_task, mem,
362 (cmd_dir == ISER_DIR_OUT) ?
363 DMA_TO_DEVICE : DMA_FROM_DEVICE);
361 364
362 /* allocate copy buf, if we are writing, copy the */ 365 /* allocate copy buf, if we are writing, copy the */
363 /* unaligned scatterlist, dma map the copy */ 366 /* unaligned scatterlist, dma map the copy */