@@ -68,8 +68,8 @@ static unsigned int srp_sg_tablesize;
68
68
static unsigned int cmd_sg_entries ;
69
69
static unsigned int indirect_sg_entries ;
70
70
static bool allow_ext_sg ;
71
- static bool prefer_fr ;
72
- static bool register_always ;
71
+ static bool prefer_fr = true ;
72
+ static bool register_always = true ;
73
73
static int topspin_workarounds = 1 ;
74
74
75
75
module_param (srp_sg_tablesize , uint , 0444 );
@@ -1353,9 +1353,9 @@ static int srp_finish_mapping(struct srp_map_state *state,
1353
1353
if (state -> npages == 0 )
1354
1354
return 0 ;
1355
1355
1356
- if (state -> npages == 1 && ! register_always )
1356
+ if (state -> npages == 1 && target -> global_mr )
1357
1357
srp_map_desc (state , state -> base_dma_addr , state -> dma_len ,
1358
- target -> rkey );
1358
+ target -> global_mr -> rkey );
1359
1359
else
1360
1360
ret = dev -> use_fast_reg ? srp_map_finish_fr (state , ch ) :
1361
1361
srp_map_finish_fmr (state , ch );
@@ -1442,7 +1442,8 @@ static int srp_map_sg(struct srp_map_state *state, struct srp_rdma_ch *ch,
1442
1442
} else {
1443
1443
for_each_sg (scat , sg , count , i ) {
1444
1444
srp_map_desc (state , ib_sg_dma_address (dev -> dev , sg ),
1445
- ib_sg_dma_len (dev -> dev , sg ), target -> rkey );
1445
+ ib_sg_dma_len (dev -> dev , sg ),
1446
+ target -> global_mr -> rkey );
1446
1447
}
1447
1448
}
1448
1449
@@ -1531,7 +1532,7 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_rdma_ch *ch,
1531
1532
fmt = SRP_DATA_DESC_DIRECT ;
1532
1533
len = sizeof (struct srp_cmd ) + sizeof (struct srp_direct_buf );
1533
1534
1534
- if (count == 1 && ! register_always ) {
1535
+ if (count == 1 && target -> global_mr ) {
1535
1536
/*
1536
1537
* The midlayer only generated a single gather/scatter
1537
1538
* entry, or DMA mapping coalesced everything to a
@@ -1541,7 +1542,7 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_rdma_ch *ch,
1541
1542
struct srp_direct_buf * buf = (void * ) cmd -> add_data ;
1542
1543
1543
1544
buf -> va = cpu_to_be64 (ib_sg_dma_address (ibdev , scat ));
1544
- buf -> key = cpu_to_be32 (target -> rkey );
1545
+ buf -> key = cpu_to_be32 (target -> global_mr -> rkey );
1545
1546
buf -> len = cpu_to_be32 (ib_sg_dma_len (ibdev , scat ));
1546
1547
1547
1548
req -> nmdesc = 0 ;
@@ -1595,14 +1596,14 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_rdma_ch *ch,
1595
1596
memcpy (indirect_hdr -> desc_list , req -> indirect_desc ,
1596
1597
count * sizeof (struct srp_direct_buf ));
1597
1598
1598
- if (register_always && ( dev -> use_fast_reg || dev -> use_fmr ) ) {
1599
+ if (! target -> global_mr ) {
1599
1600
ret = srp_map_idb (ch , req , state .gen .next , state .gen .end ,
1600
1601
idb_len , & idb_rkey );
1601
1602
if (ret < 0 )
1602
1603
return ret ;
1603
1604
req -> nmdesc ++ ;
1604
1605
} else {
1605
- idb_rkey = target -> rkey ;
1606
+ idb_rkey = target -> global_mr -> rkey ;
1606
1607
}
1607
1608
1608
1609
indirect_hdr -> table_desc .va = cpu_to_be64 (req -> indirect_dma_addr );
@@ -3157,7 +3158,7 @@ static ssize_t srp_create_target(struct device *dev,
3157
3158
target -> scsi_host = target_host ;
3158
3159
target -> srp_host = host ;
3159
3160
target -> lkey = host -> srp_dev -> pd -> local_dma_lkey ;
3160
- target -> rkey = host -> srp_dev -> mr -> rkey ;
3161
+ target -> global_mr = host -> srp_dev -> global_mr ;
3161
3162
target -> cmd_sg_cnt = cmd_sg_entries ;
3162
3163
target -> sg_tablesize = indirect_sg_entries ? : cmd_sg_entries ;
3163
3164
target -> allow_ext_sg = allow_ext_sg ;
@@ -3447,12 +3448,16 @@ static void srp_add_one(struct ib_device *device)
3447
3448
if (IS_ERR (srp_dev -> pd ))
3448
3449
goto free_dev ;
3449
3450
3450
- srp_dev -> mr = ib_get_dma_mr (srp_dev -> pd ,
3451
- IB_ACCESS_LOCAL_WRITE |
3452
- IB_ACCESS_REMOTE_READ |
3453
- IB_ACCESS_REMOTE_WRITE );
3454
- if (IS_ERR (srp_dev -> mr ))
3455
- goto err_pd ;
3451
+ if (!register_always || (!srp_dev -> has_fmr && !srp_dev -> has_fr )) {
3452
+ srp_dev -> global_mr = ib_get_dma_mr (srp_dev -> pd ,
3453
+ IB_ACCESS_LOCAL_WRITE |
3454
+ IB_ACCESS_REMOTE_READ |
3455
+ IB_ACCESS_REMOTE_WRITE );
3456
+ if (IS_ERR (srp_dev -> global_mr ))
3457
+ goto err_pd ;
3458
+ } else {
3459
+ srp_dev -> global_mr = NULL ;
3460
+ }
3456
3461
3457
3462
for (p = rdma_start_port (device ); p <= rdma_end_port (device ); ++ p ) {
3458
3463
host = srp_add_port (srp_dev , p );
@@ -3509,7 +3514,8 @@ static void srp_remove_one(struct ib_device *device, void *client_data)
3509
3514
kfree (host );
3510
3515
}
3511
3516
3512
- ib_dereg_mr (srp_dev -> mr );
3517
+ if (srp_dev -> global_mr )
3518
+ ib_dereg_mr (srp_dev -> global_mr );
3513
3519
ib_dealloc_pd (srp_dev -> pd );
3514
3520
3515
3521
kfree (srp_dev );
0 commit comments