@@ -2299,37 +2299,37 @@ static void smbd_mr_recovery_work(struct work_struct *work)
2299
2299
if (smbdirect_mr -> state == MR_INVALIDATED ||
2300
2300
smbdirect_mr -> state == MR_ERROR ) {
2301
2301
2302
- if (smbdirect_mr -> state == MR_INVALIDATED ) {
2302
+ /* recover this MR entry */
2303
+ rc = ib_dereg_mr (smbdirect_mr -> mr );
2304
+ if (rc ) {
2305
+ log_rdma_mr (ERR ,
2306
+ "ib_dereg_mr failed rc=%x\n" ,
2307
+ rc );
2308
+ smbd_disconnect_rdma_connection (info );
2309
+ continue ;
2310
+ }
2311
+
2312
+ smbdirect_mr -> mr = ib_alloc_mr (
2313
+ info -> pd , info -> mr_type ,
2314
+ info -> max_frmr_depth );
2315
+ if (IS_ERR (smbdirect_mr -> mr )) {
2316
+ log_rdma_mr (ERR ,
2317
+ "ib_alloc_mr failed mr_type=%x "
2318
+ "max_frmr_depth=%x\n" ,
2319
+ info -> mr_type ,
2320
+ info -> max_frmr_depth );
2321
+ smbd_disconnect_rdma_connection (info );
2322
+ continue ;
2323
+ }
2324
+
2325
+ if (smbdirect_mr -> state == MR_INVALIDATED )
2303
2326
ib_dma_unmap_sg (
2304
2327
info -> id -> device , smbdirect_mr -> sgl ,
2305
2328
smbdirect_mr -> sgl_count ,
2306
2329
smbdirect_mr -> dir );
2307
- smbdirect_mr -> state = MR_READY ;
2308
- } else if (smbdirect_mr -> state == MR_ERROR ) {
2309
-
2310
- /* recover this MR entry */
2311
- rc = ib_dereg_mr (smbdirect_mr -> mr );
2312
- if (rc ) {
2313
- log_rdma_mr (ERR ,
2314
- "ib_dereg_mr failed rc=%x\n" ,
2315
- rc );
2316
- smbd_disconnect_rdma_connection (info );
2317
- }
2318
2330
2319
- smbdirect_mr -> mr = ib_alloc_mr (
2320
- info -> pd , info -> mr_type ,
2321
- info -> max_frmr_depth );
2322
- if (IS_ERR (smbdirect_mr -> mr )) {
2323
- log_rdma_mr (ERR ,
2324
- "ib_alloc_mr failed mr_type=%x "
2325
- "max_frmr_depth=%x\n" ,
2326
- info -> mr_type ,
2327
- info -> max_frmr_depth );
2328
- smbd_disconnect_rdma_connection (info );
2329
- }
2331
+ smbdirect_mr -> state = MR_READY ;
2330
2332
2331
- smbdirect_mr -> state = MR_READY ;
2332
- }
2333
2333
/* smbdirect_mr->state is updated by this function
2334
2334
* and is read and updated by I/O issuing CPUs trying
2335
2335
* to get a MR, the call to atomic_inc_return
@@ -2475,7 +2475,7 @@ static struct smbd_mr *get_mr(struct smbd_connection *info)
2475
2475
*/
2476
2476
struct smbd_mr * smbd_register_mr (
2477
2477
struct smbd_connection * info , struct page * pages [], int num_pages ,
2478
- int tailsz , bool writing , bool need_invalidate )
2478
+ int offset , int tailsz , bool writing , bool need_invalidate )
2479
2479
{
2480
2480
struct smbd_mr * smbdirect_mr ;
2481
2481
int rc , i ;
@@ -2498,26 +2498,40 @@ struct smbd_mr *smbd_register_mr(
2498
2498
smbdirect_mr -> sgl_count = num_pages ;
2499
2499
sg_init_table (smbdirect_mr -> sgl , num_pages );
2500
2500
2501
- for ( i = 0 ; i < num_pages - 1 ; i ++ )
2502
- sg_set_page ( & smbdirect_mr -> sgl [ i ], pages [ i ], PAGE_SIZE , 0 );
2501
+ log_rdma_mr ( INFO , "num_pages=0x%x offset=0x%x tailsz=0x%x\n" ,
2502
+ num_pages , offset , tailsz );
2503
2503
2504
+ if (num_pages == 1 ) {
2505
+ sg_set_page (& smbdirect_mr -> sgl [0 ], pages [0 ], tailsz , offset );
2506
+ goto skip_multiple_pages ;
2507
+ }
2508
+
2509
+ /* We have at least two pages to register */
2510
+ sg_set_page (
2511
+ & smbdirect_mr -> sgl [0 ], pages [0 ], PAGE_SIZE - offset , offset );
2512
+ i = 1 ;
2513
+ while (i < num_pages - 1 ) {
2514
+ sg_set_page (& smbdirect_mr -> sgl [i ], pages [i ], PAGE_SIZE , 0 );
2515
+ i ++ ;
2516
+ }
2504
2517
sg_set_page (& smbdirect_mr -> sgl [i ], pages [i ],
2505
2518
tailsz ? tailsz : PAGE_SIZE , 0 );
2506
2519
2520
+ skip_multiple_pages :
2507
2521
dir = writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE ;
2508
2522
smbdirect_mr -> dir = dir ;
2509
2523
rc = ib_dma_map_sg (info -> id -> device , smbdirect_mr -> sgl , num_pages , dir );
2510
2524
if (!rc ) {
2511
- log_rdma_mr (INFO , "ib_dma_map_sg num_pages=%x dir=%x rc=%x\n" ,
2525
+ log_rdma_mr (ERR , "ib_dma_map_sg num_pages=%x dir=%x rc=%x\n" ,
2512
2526
num_pages , dir , rc );
2513
2527
goto dma_map_error ;
2514
2528
}
2515
2529
2516
2530
rc = ib_map_mr_sg (smbdirect_mr -> mr , smbdirect_mr -> sgl , num_pages ,
2517
2531
NULL , PAGE_SIZE );
2518
2532
if (rc != num_pages ) {
2519
- log_rdma_mr (INFO ,
2520
- "ib_map_mr_sg failed rc = %x num_pages = %x\n" ,
2533
+ log_rdma_mr (ERR ,
2534
+ "ib_map_mr_sg failed rc = %d num_pages = %x\n" ,
2521
2535
rc , num_pages );
2522
2536
goto map_mr_error ;
2523
2537
}
0 commit comments