diff options
author | Roi Dayan <roid@mellanox.com> | 2014-12-28 07:26:11 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2015-02-13 14:27:31 -0500 |
commit | c6c95ef4cec680f7a10aa425a9970744b35b6489 (patch) | |
tree | 080f2256dcfa5cdc1a107989a808863449e08bc8 | |
parent | bfa76d49576599a4b9f9b7a71f23d73d6dcff735 (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.h | 4 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_initiator.c | 12 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_memory.c | 9 |
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 | ||
656 | void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task, | 656 | void 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 | |||
658 | int iser_initialize_task_headers(struct iscsi_task *task, | 660 | int iser_initialize_task_headers(struct iscsi_task *task, |
659 | struct iser_tx_desc *tx_desc); | 661 | struct iser_tx_desc *tx_desc); |
660 | int iser_alloc_rx_descriptors(struct iser_conn *iser_conn, | 662 | int 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 | ||
334 | void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task, | 334 | void 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 | ||
343 | static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task, | 344 | static 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 */ |