@@ -78,7 +78,7 @@ static struct list_head bnxt_re_dev_list = LIST_HEAD_INIT(bnxt_re_dev_list);
78
78
/* Mutex to protect the list of bnxt_re devices added */
79
79
static DEFINE_MUTEX (bnxt_re_dev_lock );
80
80
static struct workqueue_struct * bnxt_re_wq ;
81
- static void bnxt_re_ib_unreg (struct bnxt_re_dev * rdev , bool lock_wait );
81
+ static void bnxt_re_ib_unreg (struct bnxt_re_dev * rdev );
82
82
83
83
/* SR-IOV helper functions */
84
84
@@ -182,7 +182,7 @@ static void bnxt_re_shutdown(void *p)
182
182
if (!rdev )
183
183
return ;
184
184
185
- bnxt_re_ib_unreg (rdev , false );
185
+ bnxt_re_ib_unreg (rdev );
186
186
}
187
187
188
188
static void bnxt_re_stop_irq (void * handle )
@@ -251,7 +251,7 @@ static struct bnxt_ulp_ops bnxt_re_ulp_ops = {
251
251
/* Driver registration routines used to let the networking driver (bnxt_en)
252
252
* to know that the RoCE driver is now installed
253
253
*/
254
- static int bnxt_re_unregister_netdev (struct bnxt_re_dev * rdev , bool lock_wait )
254
+ static int bnxt_re_unregister_netdev (struct bnxt_re_dev * rdev )
255
255
{
256
256
struct bnxt_en_dev * en_dev ;
257
257
int rc ;
@@ -260,14 +260,9 @@ static int bnxt_re_unregister_netdev(struct bnxt_re_dev *rdev, bool lock_wait)
260
260
return - EINVAL ;
261
261
262
262
en_dev = rdev -> en_dev ;
263
- /* Acquire rtnl lock if it is not invokded from netdev event */
264
- if (lock_wait )
265
- rtnl_lock ();
266
263
267
264
rc = en_dev -> en_ops -> bnxt_unregister_device (rdev -> en_dev ,
268
265
BNXT_ROCE_ULP );
269
- if (lock_wait )
270
- rtnl_unlock ();
271
266
return rc ;
272
267
}
273
268
@@ -281,14 +276,12 @@ static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev)
281
276
282
277
en_dev = rdev -> en_dev ;
283
278
284
- rtnl_lock ();
285
279
rc = en_dev -> en_ops -> bnxt_register_device (en_dev , BNXT_ROCE_ULP ,
286
280
& bnxt_re_ulp_ops , rdev );
287
- rtnl_unlock ();
288
281
return rc ;
289
282
}
290
283
291
- static int bnxt_re_free_msix (struct bnxt_re_dev * rdev , bool lock_wait )
284
+ static int bnxt_re_free_msix (struct bnxt_re_dev * rdev )
292
285
{
293
286
struct bnxt_en_dev * en_dev ;
294
287
int rc ;
@@ -298,13 +291,9 @@ static int bnxt_re_free_msix(struct bnxt_re_dev *rdev, bool lock_wait)
298
291
299
292
en_dev = rdev -> en_dev ;
300
293
301
- if (lock_wait )
302
- rtnl_lock ();
303
294
304
295
rc = en_dev -> en_ops -> bnxt_free_msix (rdev -> en_dev , BNXT_ROCE_ULP );
305
296
306
- if (lock_wait )
307
- rtnl_unlock ();
308
297
return rc ;
309
298
}
310
299
@@ -320,7 +309,6 @@ static int bnxt_re_request_msix(struct bnxt_re_dev *rdev)
320
309
321
310
num_msix_want = min_t (u32 , BNXT_RE_MAX_MSIX , num_online_cpus ());
322
311
323
- rtnl_lock ();
324
312
num_msix_got = en_dev -> en_ops -> bnxt_request_msix (en_dev , BNXT_ROCE_ULP ,
325
313
rdev -> msix_entries ,
326
314
num_msix_want );
@@ -335,7 +323,6 @@ static int bnxt_re_request_msix(struct bnxt_re_dev *rdev)
335
323
}
336
324
rdev -> num_msix = num_msix_got ;
337
325
done :
338
- rtnl_unlock ();
339
326
return rc ;
340
327
}
341
328
@@ -358,24 +345,18 @@ static void bnxt_re_fill_fw_msg(struct bnxt_fw_msg *fw_msg, void *msg,
358
345
fw_msg -> timeout = timeout ;
359
346
}
360
347
361
- static int bnxt_re_net_ring_free (struct bnxt_re_dev * rdev , u16 fw_ring_id ,
362
- bool lock_wait )
348
+ static int bnxt_re_net_ring_free (struct bnxt_re_dev * rdev , u16 fw_ring_id )
363
349
{
364
350
struct bnxt_en_dev * en_dev = rdev -> en_dev ;
365
351
struct hwrm_ring_free_input req = {0 };
366
352
struct hwrm_ring_free_output resp ;
367
353
struct bnxt_fw_msg fw_msg ;
368
- bool do_unlock = false;
369
354
int rc = - EINVAL ;
370
355
371
356
if (!en_dev )
372
357
return rc ;
373
358
374
359
memset (& fw_msg , 0 , sizeof (fw_msg ));
375
- if (lock_wait ) {
376
- rtnl_lock ();
377
- do_unlock = true;
378
- }
379
360
380
361
bnxt_re_init_hwrm_hdr (rdev , (void * )& req , HWRM_RING_FREE , -1 , -1 );
381
362
req .ring_type = RING_ALLOC_REQ_RING_TYPE_L2_CMPL ;
@@ -386,8 +367,6 @@ static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev, u16 fw_ring_id,
386
367
if (rc )
387
368
dev_err (rdev_to_dev (rdev ),
388
369
"Failed to free HW ring:%d :%#x" , req .ring_id , rc );
389
- if (do_unlock )
390
- rtnl_unlock ();
391
370
return rc ;
392
371
}
393
372
@@ -405,7 +384,6 @@ static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev, dma_addr_t *dma_arr,
405
384
return rc ;
406
385
407
386
memset (& fw_msg , 0 , sizeof (fw_msg ));
408
- rtnl_lock ();
409
387
bnxt_re_init_hwrm_hdr (rdev , (void * )& req , HWRM_RING_ALLOC , -1 , -1 );
410
388
req .enables = 0 ;
411
389
req .page_tbl_addr = cpu_to_le64 (dma_arr [0 ]);
@@ -426,27 +404,21 @@ static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev, dma_addr_t *dma_arr,
426
404
if (!rc )
427
405
* fw_ring_id = le16_to_cpu (resp .ring_id );
428
406
429
- rtnl_unlock ();
430
407
return rc ;
431
408
}
432
409
433
410
static int bnxt_re_net_stats_ctx_free (struct bnxt_re_dev * rdev ,
434
- u32 fw_stats_ctx_id , bool lock_wait )
411
+ u32 fw_stats_ctx_id )
435
412
{
436
413
struct bnxt_en_dev * en_dev = rdev -> en_dev ;
437
414
struct hwrm_stat_ctx_free_input req = {0 };
438
415
struct bnxt_fw_msg fw_msg ;
439
- bool do_unlock = false;
440
416
int rc = - EINVAL ;
441
417
442
418
if (!en_dev )
443
419
return rc ;
444
420
445
421
memset (& fw_msg , 0 , sizeof (fw_msg ));
446
- if (lock_wait ) {
447
- rtnl_lock ();
448
- do_unlock = true;
449
- }
450
422
451
423
bnxt_re_init_hwrm_hdr (rdev , (void * )& req , HWRM_STAT_CTX_FREE , -1 , -1 );
452
424
req .stat_ctx_id = cpu_to_le32 (fw_stats_ctx_id );
@@ -457,8 +429,6 @@ static int bnxt_re_net_stats_ctx_free(struct bnxt_re_dev *rdev,
457
429
dev_err (rdev_to_dev (rdev ),
458
430
"Failed to free HW stats context %#x" , rc );
459
431
460
- if (do_unlock )
461
- rtnl_unlock ();
462
432
return rc ;
463
433
}
464
434
@@ -478,7 +448,6 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,
478
448
return rc ;
479
449
480
450
memset (& fw_msg , 0 , sizeof (fw_msg ));
481
- rtnl_lock ();
482
451
483
452
bnxt_re_init_hwrm_hdr (rdev , (void * )& req , HWRM_STAT_CTX_ALLOC , -1 , -1 );
484
453
req .update_period_ms = cpu_to_le32 (1000 );
@@ -490,7 +459,6 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,
490
459
if (!rc )
491
460
* fw_stats_ctx_id = le32_to_cpu (resp .stat_ctx_id );
492
461
493
- rtnl_unlock ();
494
462
return rc ;
495
463
}
496
464
@@ -929,19 +897,19 @@ static int bnxt_re_init_res(struct bnxt_re_dev *rdev)
929
897
return rc ;
930
898
}
931
899
932
- static void bnxt_re_free_nq_res (struct bnxt_re_dev * rdev , bool lock_wait )
900
+ static void bnxt_re_free_nq_res (struct bnxt_re_dev * rdev )
933
901
{
934
902
int i ;
935
903
936
904
for (i = 0 ; i < rdev -> num_msix - 1 ; i ++ ) {
937
- bnxt_re_net_ring_free (rdev , rdev -> nq [i ].ring_id , lock_wait );
905
+ bnxt_re_net_ring_free (rdev , rdev -> nq [i ].ring_id );
938
906
bnxt_qplib_free_nq (& rdev -> nq [i ]);
939
907
}
940
908
}
941
909
942
- static void bnxt_re_free_res (struct bnxt_re_dev * rdev , bool lock_wait )
910
+ static void bnxt_re_free_res (struct bnxt_re_dev * rdev )
943
911
{
944
- bnxt_re_free_nq_res (rdev , lock_wait );
912
+ bnxt_re_free_nq_res (rdev );
945
913
946
914
if (rdev -> qplib_res .dpi_tbl .max ) {
947
915
bnxt_qplib_dealloc_dpi (& rdev -> qplib_res ,
@@ -1219,7 +1187,7 @@ static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev)
1219
1187
return 0 ;
1220
1188
}
1221
1189
1222
- static void bnxt_re_ib_unreg (struct bnxt_re_dev * rdev , bool lock_wait )
1190
+ static void bnxt_re_ib_unreg (struct bnxt_re_dev * rdev )
1223
1191
{
1224
1192
int i , rc ;
1225
1193
@@ -1234,28 +1202,27 @@ static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev, bool lock_wait)
1234
1202
cancel_delayed_work (& rdev -> worker );
1235
1203
1236
1204
bnxt_re_cleanup_res (rdev );
1237
- bnxt_re_free_res (rdev , lock_wait );
1205
+ bnxt_re_free_res (rdev );
1238
1206
1239
1207
if (test_and_clear_bit (BNXT_RE_FLAG_RCFW_CHANNEL_EN , & rdev -> flags )) {
1240
1208
rc = bnxt_qplib_deinit_rcfw (& rdev -> rcfw );
1241
1209
if (rc )
1242
1210
dev_warn (rdev_to_dev (rdev ),
1243
1211
"Failed to deinitialize RCFW: %#x" , rc );
1244
- bnxt_re_net_stats_ctx_free (rdev , rdev -> qplib_ctx .stats .fw_id ,
1245
- lock_wait );
1212
+ bnxt_re_net_stats_ctx_free (rdev , rdev -> qplib_ctx .stats .fw_id );
1246
1213
bnxt_qplib_free_ctx (rdev -> en_dev -> pdev , & rdev -> qplib_ctx );
1247
1214
bnxt_qplib_disable_rcfw_channel (& rdev -> rcfw );
1248
- bnxt_re_net_ring_free (rdev , rdev -> rcfw .creq_ring_id , lock_wait );
1215
+ bnxt_re_net_ring_free (rdev , rdev -> rcfw .creq_ring_id );
1249
1216
bnxt_qplib_free_rcfw_channel (& rdev -> rcfw );
1250
1217
}
1251
1218
if (test_and_clear_bit (BNXT_RE_FLAG_GOT_MSIX , & rdev -> flags )) {
1252
- rc = bnxt_re_free_msix (rdev , lock_wait );
1219
+ rc = bnxt_re_free_msix (rdev );
1253
1220
if (rc )
1254
1221
dev_warn (rdev_to_dev (rdev ),
1255
1222
"Failed to free MSI-X vectors: %#x" , rc );
1256
1223
}
1257
1224
if (test_and_clear_bit (BNXT_RE_FLAG_NETDEV_REGISTERED , & rdev -> flags )) {
1258
- rc = bnxt_re_unregister_netdev (rdev , lock_wait );
1225
+ rc = bnxt_re_unregister_netdev (rdev );
1259
1226
if (rc )
1260
1227
dev_warn (rdev_to_dev (rdev ),
1261
1228
"Failed to unregister with netdev: %#x" , rc );
@@ -1276,6 +1243,12 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
1276
1243
{
1277
1244
int i , j , rc ;
1278
1245
1246
+ bool locked ;
1247
+
1248
+ /* Acquire rtnl lock through out this function */
1249
+ rtnl_lock ();
1250
+ locked = true;
1251
+
1279
1252
/* Registered a new RoCE device instance to netdev */
1280
1253
rc = bnxt_re_register_netdev (rdev );
1281
1254
if (rc ) {
@@ -1374,12 +1347,16 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
1374
1347
schedule_delayed_work (& rdev -> worker , msecs_to_jiffies (30000 ));
1375
1348
}
1376
1349
1350
+ rtnl_unlock ();
1351
+ locked = false;
1352
+
1377
1353
/* Register ib dev */
1378
1354
rc = bnxt_re_register_ib (rdev );
1379
1355
if (rc ) {
1380
1356
pr_err ("Failed to register with IB: %#x\n" , rc );
1381
1357
goto fail ;
1382
1358
}
1359
+ set_bit (BNXT_RE_FLAG_IBDEV_REGISTERED , & rdev -> flags );
1383
1360
dev_info (rdev_to_dev (rdev ), "Device registered successfully" );
1384
1361
for (i = 0 ; i < ARRAY_SIZE (bnxt_re_attributes ); i ++ ) {
1385
1362
rc = device_create_file (& rdev -> ibdev .dev ,
@@ -1395,7 +1372,6 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
1395
1372
goto fail ;
1396
1373
}
1397
1374
}
1398
- set_bit (BNXT_RE_FLAG_IBDEV_REGISTERED , & rdev -> flags );
1399
1375
ib_get_eth_speed (& rdev -> ibdev , 1 , & rdev -> active_speed ,
1400
1376
& rdev -> active_width );
1401
1377
set_bit (BNXT_RE_FLAG_ISSUE_ROCE_STATS , & rdev -> flags );
@@ -1404,17 +1380,21 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)
1404
1380
1405
1381
return 0 ;
1406
1382
free_sctx :
1407
- bnxt_re_net_stats_ctx_free (rdev , rdev -> qplib_ctx .stats .fw_id , true );
1383
+ bnxt_re_net_stats_ctx_free (rdev , rdev -> qplib_ctx .stats .fw_id );
1408
1384
free_ctx :
1409
1385
bnxt_qplib_free_ctx (rdev -> en_dev -> pdev , & rdev -> qplib_ctx );
1410
1386
disable_rcfw :
1411
1387
bnxt_qplib_disable_rcfw_channel (& rdev -> rcfw );
1412
1388
free_ring :
1413
- bnxt_re_net_ring_free (rdev , rdev -> rcfw .creq_ring_id , true );
1389
+ bnxt_re_net_ring_free (rdev , rdev -> rcfw .creq_ring_id );
1414
1390
free_rcfw :
1415
1391
bnxt_qplib_free_rcfw_channel (& rdev -> rcfw );
1416
1392
fail :
1417
- bnxt_re_ib_unreg (rdev , true);
1393
+ if (!locked )
1394
+ rtnl_lock ();
1395
+ bnxt_re_ib_unreg (rdev );
1396
+ rtnl_unlock ();
1397
+
1418
1398
return rc ;
1419
1399
}
1420
1400
@@ -1567,7 +1547,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
1567
1547
*/
1568
1548
if (atomic_read (& rdev -> sched_count ) > 0 )
1569
1549
goto exit ;
1570
- bnxt_re_ib_unreg (rdev , false );
1550
+ bnxt_re_ib_unreg (rdev );
1571
1551
bnxt_re_remove_one (rdev );
1572
1552
bnxt_re_dev_unreg (rdev );
1573
1553
break ;
@@ -1646,7 +1626,10 @@ static void __exit bnxt_re_mod_exit(void)
1646
1626
*/
1647
1627
flush_workqueue (bnxt_re_wq );
1648
1628
bnxt_re_dev_stop (rdev );
1649
- bnxt_re_ib_unreg (rdev , true);
1629
+ /* Acquire the rtnl_lock as the L2 resources are freed here */
1630
+ rtnl_lock ();
1631
+ bnxt_re_ib_unreg (rdev );
1632
+ rtnl_unlock ();
1650
1633
bnxt_re_remove_one (rdev );
1651
1634
bnxt_re_dev_unreg (rdev );
1652
1635
}
0 commit comments