diff options
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_memory.c')
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_memory.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index d0b03f4265..0606744c3f 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
@@ -369,6 +369,44 @@ static void iser_page_vec_build(struct iser_data_buf *data, | |||
369 | } | 369 | } |
370 | } | 370 | } |
371 | 371 | ||
372 | int iser_dma_map_task_data(struct iscsi_iser_cmd_task *iser_ctask, | ||
373 | struct iser_data_buf *data, | ||
374 | enum iser_data_dir iser_dir, | ||
375 | enum dma_data_direction dma_dir) | ||
376 | { | ||
377 | struct device *dma_device; | ||
378 | |||
379 | iser_ctask->dir[iser_dir] = 1; | ||
380 | dma_device = | ||
381 | iser_ctask->iser_conn->ib_conn->device->ib_device->dma_device; | ||
382 | |||
383 | data->dma_nents = dma_map_sg(dma_device, data->buf, data->size, dma_dir); | ||
384 | if (data->dma_nents == 0) { | ||
385 | iser_err("dma_map_sg failed!!!\n"); | ||
386 | return -EINVAL; | ||
387 | } | ||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | void iser_dma_unmap_task_data(struct iscsi_iser_cmd_task *iser_ctask) | ||
392 | { | ||
393 | struct device *dma_device; | ||
394 | struct iser_data_buf *data; | ||
395 | |||
396 | dma_device = | ||
397 | iser_ctask->iser_conn->ib_conn->device->ib_device->dma_device; | ||
398 | |||
399 | if (iser_ctask->dir[ISER_DIR_IN]) { | ||
400 | data = &iser_ctask->data[ISER_DIR_IN]; | ||
401 | dma_unmap_sg(dma_device, data->buf, data->size, DMA_FROM_DEVICE); | ||
402 | } | ||
403 | |||
404 | if (iser_ctask->dir[ISER_DIR_OUT]) { | ||
405 | data = &iser_ctask->data[ISER_DIR_OUT]; | ||
406 | dma_unmap_sg(dma_device, data->buf, data->size, DMA_TO_DEVICE); | ||
407 | } | ||
408 | } | ||
409 | |||
372 | /** | 410 | /** |
373 | * iser_reg_rdma_mem - Registers memory intended for RDMA, | 411 | * iser_reg_rdma_mem - Registers memory intended for RDMA, |
374 | * obtaining rkey and va | 412 | * obtaining rkey and va |
@@ -394,6 +432,10 @@ int iser_reg_rdma_mem(struct iscsi_iser_cmd_task *iser_ctask, | |||
394 | iser_err("rdma alignment violation %d/%d aligned\n", | 432 | iser_err("rdma alignment violation %d/%d aligned\n", |
395 | aligned_len, mem->size); | 433 | aligned_len, mem->size); |
396 | iser_data_buf_dump(mem); | 434 | iser_data_buf_dump(mem); |
435 | |||
436 | /* unmap the command data before accessing it */ | ||
437 | iser_dma_unmap_task_data(iser_ctask); | ||
438 | |||
397 | /* allocate copy buf, if we are writing, copy the */ | 439 | /* allocate copy buf, if we are writing, copy the */ |
398 | /* unaligned scatterlist, dma map the copy */ | 440 | /* unaligned scatterlist, dma map the copy */ |
399 | if (iser_start_rdma_unaligned_sg(iser_ctask, cmd_dir) != 0) | 441 | if (iser_start_rdma_unaligned_sg(iser_ctask, cmd_dir) != 0) |