Skip to content

Commit 80303ee

Browse files
mgurtovoyjgunthorpe
authored andcommitted
IB/iser: Generalize map/unmap dma tasks
Avoid code duplication and add the mapping/unmapping of the protection buffers to the iser_dma_map_task_data/iser_dma_unmap_task_data functions. Link: https://lore.kernel.org/r/20220308145546.8372-4-mgurtovoy@nvidia.com Reviewed-by: Sergey Gorenko <sergeygo@nvidia.com> Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com> Acked-by: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
1 parent ee4efea commit 80303ee

3 files changed

Lines changed: 31 additions & 45 deletions

File tree

drivers/infiniband/ulp/iser/iscsi_iser.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -531,13 +531,12 @@ int iser_post_recvm(struct iser_conn *iser_conn,
531531
int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc);
532532

533533
int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
534-
struct iser_data_buf *data,
535534
enum iser_data_dir iser_dir,
536535
enum dma_data_direction dma_dir);
537536

538537
void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
539-
struct iser_data_buf *data,
540-
enum dma_data_direction dir);
538+
enum iser_data_dir iser_dir,
539+
enum dma_data_direction dma_dir);
541540

542541
int iser_initialize_task_headers(struct iscsi_task *task,
543542
struct iser_tx_desc *tx_desc);

drivers/infiniband/ulp/iser/iser_initiator.c

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,13 @@ static int iser_prepare_read_cmd(struct iscsi_task *task)
5252
struct iser_mem_reg *mem_reg;
5353
int err;
5454
struct iser_ctrl *hdr = &iser_task->desc.iser_header;
55-
struct iser_data_buf *buf_in = &iser_task->data[ISER_DIR_IN];
5655

5756
err = iser_dma_map_task_data(iser_task,
58-
buf_in,
5957
ISER_DIR_IN,
6058
DMA_FROM_DEVICE);
6159
if (err)
6260
return err;
6361

64-
if (scsi_prot_sg_count(iser_task->sc)) {
65-
struct iser_data_buf *pbuf_in = &iser_task->prot[ISER_DIR_IN];
66-
67-
err = iser_dma_map_task_data(iser_task,
68-
pbuf_in,
69-
ISER_DIR_IN,
70-
DMA_FROM_DEVICE);
71-
if (err)
72-
return err;
73-
}
74-
7562
err = iser_reg_mem_fastreg(iser_task, ISER_DIR_IN, false);
7663
if (err) {
7764
iser_err("Failed to set up Data-IN RDMA\n");
@@ -106,23 +93,11 @@ static int iser_prepare_write_cmd(struct iscsi_task *task, unsigned int imm_sz,
10693
struct ib_sge *tx_dsg = &iser_task->desc.tx_sg[1];
10794

10895
err = iser_dma_map_task_data(iser_task,
109-
buf_out,
11096
ISER_DIR_OUT,
11197
DMA_TO_DEVICE);
11298
if (err)
11399
return err;
114100

115-
if (scsi_prot_sg_count(iser_task->sc)) {
116-
struct iser_data_buf *pbuf_out = &iser_task->prot[ISER_DIR_OUT];
117-
118-
err = iser_dma_map_task_data(iser_task,
119-
pbuf_out,
120-
ISER_DIR_OUT,
121-
DMA_TO_DEVICE);
122-
if (err)
123-
return err;
124-
}
125-
126101
err = iser_reg_mem_fastreg(iser_task, ISER_DIR_OUT,
127102
buf_out->data_len == imm_sz);
128103
if (err != 0) {
@@ -740,27 +715,16 @@ void iser_task_rdma_init(struct iscsi_iser_task *iser_task)
740715

741716
void iser_task_rdma_finalize(struct iscsi_iser_task *iser_task)
742717
{
743-
int prot_count = scsi_prot_sg_count(iser_task->sc);
744718

745719
if (iser_task->dir[ISER_DIR_IN]) {
746720
iser_unreg_mem_fastreg(iser_task, ISER_DIR_IN);
747-
iser_dma_unmap_task_data(iser_task,
748-
&iser_task->data[ISER_DIR_IN],
721+
iser_dma_unmap_task_data(iser_task, ISER_DIR_IN,
749722
DMA_FROM_DEVICE);
750-
if (prot_count)
751-
iser_dma_unmap_task_data(iser_task,
752-
&iser_task->prot[ISER_DIR_IN],
753-
DMA_FROM_DEVICE);
754723
}
755724

756725
if (iser_task->dir[ISER_DIR_OUT]) {
757726
iser_unreg_mem_fastreg(iser_task, ISER_DIR_OUT);
758-
iser_dma_unmap_task_data(iser_task,
759-
&iser_task->data[ISER_DIR_OUT],
727+
iser_dma_unmap_task_data(iser_task, ISER_DIR_OUT,
760728
DMA_TO_DEVICE);
761-
if (prot_count)
762-
iser_dma_unmap_task_data(iser_task,
763-
&iser_task->prot[ISER_DIR_OUT],
764-
DMA_TO_DEVICE);
765729
}
766730
}

drivers/infiniband/ulp/iser/iser_memory.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ static void iser_reg_desc_put_fr(struct ib_conn *ib_conn,
7070
}
7171

7272
int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
73-
struct iser_data_buf *data,
7473
enum iser_data_dir iser_dir,
7574
enum dma_data_direction dma_dir)
7675
{
76+
struct iser_data_buf *data = &iser_task->data[iser_dir];
7777
struct ib_device *dev;
7878

7979
iser_task->dir[iser_dir] = 1;
@@ -84,17 +84,40 @@ int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
8484
iser_err("dma_map_sg failed!!!\n");
8585
return -EINVAL;
8686
}
87+
88+
if (scsi_prot_sg_count(iser_task->sc)) {
89+
struct iser_data_buf *pdata = &iser_task->prot[iser_dir];
90+
91+
pdata->dma_nents = ib_dma_map_sg(dev, pdata->sg, pdata->size, dma_dir);
92+
if (unlikely(pdata->dma_nents == 0)) {
93+
iser_err("protection dma_map_sg failed!!!\n");
94+
goto out_unmap;
95+
}
96+
}
97+
8798
return 0;
99+
100+
out_unmap:
101+
ib_dma_unmap_sg(dev, data->sg, data->size, dma_dir);
102+
return -EINVAL;
88103
}
89104

105+
90106
void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
91-
struct iser_data_buf *data,
92-
enum dma_data_direction dir)
107+
enum iser_data_dir iser_dir,
108+
enum dma_data_direction dma_dir)
93109
{
110+
struct iser_data_buf *data = &iser_task->data[iser_dir];
94111
struct ib_device *dev;
95112

96113
dev = iser_task->iser_conn->ib_conn.device->ib_device;
97-
ib_dma_unmap_sg(dev, data->sg, data->size, dir);
114+
ib_dma_unmap_sg(dev, data->sg, data->size, dma_dir);
115+
116+
if (scsi_prot_sg_count(iser_task->sc)) {
117+
struct iser_data_buf *pdata = &iser_task->prot[iser_dir];
118+
119+
ib_dma_unmap_sg(dev, pdata->sg, pdata->size, dma_dir);
120+
}
98121
}
99122

100123
static int iser_reg_dma(struct iser_device *device, struct iser_data_buf *mem,

0 commit comments

Comments
 (0)