Skip to content

Commit 8172290

Browse files
Sagi Grimbergdledford
authored andcommitted
IB/iser: Make reg_desc_get a per device routine
As for fmrs we will hold a single registration descriptor as no need for multiple like in the frwr mode (descriptor for each task). This change helps unifying the duplicate registration code paths. Signed-off-by: Sagi Grimberg <[email protected]> Signed-off-by: Adir Lev <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent 7d0483c commit 8172290

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

drivers/infiniband/ulp/iser/iscsi_iser.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,8 @@ struct iser_comp {
333333
* @free_reg_res: Free registration resources
334334
* @reg_rdma_mem: Register memory buffers
335335
* @unreg_rdma_mem: Un-register memory buffers
336+
* @reg_desc_get: Get a registration descriptor for pool
337+
* @reg_desc_put: Get a registration descriptor to pool
336338
*/
337339
struct iser_reg_ops {
338340
int (*alloc_reg_res)(struct ib_conn *ib_conn,
@@ -342,6 +344,9 @@ struct iser_reg_ops {
342344
enum iser_data_dir cmd_dir);
343345
void (*unreg_rdma_mem)(struct iscsi_iser_task *iser_task,
344346
enum iser_data_dir cmd_dir);
347+
struct iser_fr_desc * (*reg_desc_get)(struct ib_conn *ib_conn);
348+
void (*reg_desc_put)(struct ib_conn *ib_conn,
349+
struct iser_fr_desc *desc);
345350
};
346351

347352
/**
@@ -657,8 +662,13 @@ void iser_free_fastreg_pool(struct ib_conn *ib_conn);
657662
u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,
658663
enum iser_data_dir cmd_dir, sector_t *sector);
659664
struct iser_fr_desc *
660-
iser_reg_desc_get(struct ib_conn *ib_conn);
665+
iser_reg_desc_get_fr(struct ib_conn *ib_conn);
661666
void
662-
iser_reg_desc_put(struct ib_conn *ib_conn,
663-
struct iser_fr_desc *desc);
667+
iser_reg_desc_put_fr(struct ib_conn *ib_conn,
668+
struct iser_fr_desc *desc);
669+
struct iser_fr_desc *
670+
iser_reg_desc_get_fmr(struct ib_conn *ib_conn);
671+
void
672+
iser_reg_desc_put_fmr(struct ib_conn *ib_conn,
673+
struct iser_fr_desc *desc);
664674
#endif

drivers/infiniband/ulp/iser/iser_memory.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,17 @@ static struct iser_reg_ops fastreg_ops = {
4444
.free_reg_res = iser_free_fastreg_pool,
4545
.reg_rdma_mem = iser_reg_rdma_mem_fastreg,
4646
.unreg_rdma_mem = iser_unreg_mem_fastreg,
47+
.reg_desc_get = iser_reg_desc_get_fr,
48+
.reg_desc_put = iser_reg_desc_put_fr,
4749
};
4850

4951
static struct iser_reg_ops fmr_ops = {
5052
.alloc_reg_res = iser_alloc_fmr_pool,
5153
.free_reg_res = iser_free_fmr_pool,
5254
.reg_rdma_mem = iser_reg_rdma_mem_fmr,
5355
.unreg_rdma_mem = iser_unreg_mem_fmr,
56+
.reg_desc_get = iser_reg_desc_get_fmr,
57+
.reg_desc_put = iser_reg_desc_put_fmr,
5458
};
5559

5660
int iser_assign_reg_ops(struct iser_device *device)
@@ -182,7 +186,7 @@ iser_copy_to_bounce(struct iser_data_buf *data)
182186
}
183187

184188
struct iser_fr_desc *
185-
iser_reg_desc_get(struct ib_conn *ib_conn)
189+
iser_reg_desc_get_fr(struct ib_conn *ib_conn)
186190
{
187191
struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
188192
struct iser_fr_desc *desc;
@@ -198,8 +202,8 @@ iser_reg_desc_get(struct ib_conn *ib_conn)
198202
}
199203

200204
void
201-
iser_reg_desc_put(struct ib_conn *ib_conn,
202-
struct iser_fr_desc *desc)
205+
iser_reg_desc_put_fr(struct ib_conn *ib_conn,
206+
struct iser_fr_desc *desc)
203207
{
204208
struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
205209
unsigned long flags;
@@ -209,6 +213,21 @@ iser_reg_desc_put(struct ib_conn *ib_conn,
209213
spin_unlock_irqrestore(&fr_pool->lock, flags);
210214
}
211215

216+
struct iser_fr_desc *
217+
iser_reg_desc_get_fmr(struct ib_conn *ib_conn)
218+
{
219+
struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
220+
221+
return list_first_entry(&fr_pool->list,
222+
struct iser_fr_desc, list);
223+
}
224+
225+
void
226+
iser_reg_desc_put_fmr(struct ib_conn *ib_conn,
227+
struct iser_fr_desc *desc)
228+
{
229+
}
230+
212231
/**
213232
* iser_start_rdma_unaligned_sg
214233
*/
@@ -544,13 +563,14 @@ void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,
544563
void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
545564
enum iser_data_dir cmd_dir)
546565
{
566+
struct iser_device *device = iser_task->iser_conn->ib_conn.device;
547567
struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
548568

549569
if (!reg->mem_h)
550570
return;
551571

552-
iser_reg_desc_put(&iser_task->iser_conn->ib_conn,
553-
reg->mem_h);
572+
device->reg_ops->reg_desc_put(&iser_task->iser_conn->ib_conn,
573+
reg->mem_h);
554574
reg->mem_h = NULL;
555575
}
556576

@@ -564,7 +584,6 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
564584
enum iser_data_dir cmd_dir)
565585
{
566586
struct ib_conn *ib_conn = &iser_task->iser_conn->ib_conn;
567-
struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
568587
struct iser_device *device = ib_conn->device;
569588
struct ib_device *ibdev = device->ib_device;
570589
struct iser_data_buf *mem = &iser_task->data[cmd_dir];
@@ -590,8 +609,7 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
590609
} else { /* use FMR for multiple dma entries */
591610
struct iser_fr_desc *desc;
592611

593-
desc = list_first_entry(&fr_pool->list,
594-
struct iser_fr_desc, list);
612+
desc = device->reg_ops->reg_desc_get(ib_conn);
595613
err = iser_fast_reg_fmr(iser_task, mem, &desc->rsc, mem_reg);
596614
if (err && err != -EAGAIN) {
597615
iser_data_buf_dump(mem, ibdev);
@@ -844,7 +862,7 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
844862

845863
if (mem->dma_nents != 1 ||
846864
scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) {
847-
desc = iser_reg_desc_get(ib_conn);
865+
desc = device->reg_ops->reg_desc_get(ib_conn);
848866
mem_reg->mem_h = desc;
849867
}
850868

@@ -887,7 +905,7 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
887905
return 0;
888906
err_reg:
889907
if (desc)
890-
iser_reg_desc_put(ib_conn, desc);
908+
device->reg_ops->reg_desc_put(ib_conn, desc);
891909

892910
return err;
893911
}

0 commit comments

Comments
 (0)