@@ -1317,8 +1317,8 @@ static const struct attribute_group dql_group = {
1317
1317
static ssize_t xps_cpus_show (struct netdev_queue * queue ,
1318
1318
char * buf )
1319
1319
{
1320
+ int cpu , len , ret , num_tc = 1 , tc = 0 ;
1320
1321
struct net_device * dev = queue -> dev ;
1321
- int cpu , len , num_tc = 1 , tc = 0 ;
1322
1322
struct xps_dev_maps * dev_maps ;
1323
1323
cpumask_var_t mask ;
1324
1324
unsigned long index ;
@@ -1328,22 +1328,31 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
1328
1328
1329
1329
index = get_netdev_queue_index (queue );
1330
1330
1331
+ if (!rtnl_trylock ())
1332
+ return restart_syscall ();
1333
+
1331
1334
if (dev -> num_tc ) {
1332
1335
/* Do not allow XPS on subordinate device directly */
1333
1336
num_tc = dev -> num_tc ;
1334
- if (num_tc < 0 )
1335
- return - EINVAL ;
1337
+ if (num_tc < 0 ) {
1338
+ ret = - EINVAL ;
1339
+ goto err_rtnl_unlock ;
1340
+ }
1336
1341
1337
1342
/* If queue belongs to subordinate dev use its map */
1338
1343
dev = netdev_get_tx_queue (dev , index )-> sb_dev ? : dev ;
1339
1344
1340
1345
tc = netdev_txq_to_tc (dev , index );
1341
- if (tc < 0 )
1342
- return - EINVAL ;
1346
+ if (tc < 0 ) {
1347
+ ret = - EINVAL ;
1348
+ goto err_rtnl_unlock ;
1349
+ }
1343
1350
}
1344
1351
1345
- if (!zalloc_cpumask_var (& mask , GFP_KERNEL ))
1346
- return - ENOMEM ;
1352
+ if (!zalloc_cpumask_var (& mask , GFP_KERNEL )) {
1353
+ ret = - ENOMEM ;
1354
+ goto err_rtnl_unlock ;
1355
+ }
1347
1356
1348
1357
rcu_read_lock ();
1349
1358
dev_maps = rcu_dereference (dev -> xps_cpus_map );
@@ -1366,9 +1375,15 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
1366
1375
}
1367
1376
rcu_read_unlock ();
1368
1377
1378
+ rtnl_unlock ();
1379
+
1369
1380
len = snprintf (buf , PAGE_SIZE , "%*pb\n" , cpumask_pr_args (mask ));
1370
1381
free_cpumask_var (mask );
1371
1382
return len < PAGE_SIZE ? len : - EINVAL ;
1383
+
1384
+ err_rtnl_unlock :
1385
+ rtnl_unlock ();
1386
+ return ret ;
1372
1387
}
1373
1388
1374
1389
static ssize_t xps_cpus_store (struct netdev_queue * queue ,
@@ -1396,7 +1411,13 @@ static ssize_t xps_cpus_store(struct netdev_queue *queue,
1396
1411
return err ;
1397
1412
}
1398
1413
1414
+ if (!rtnl_trylock ()) {
1415
+ free_cpumask_var (mask );
1416
+ return restart_syscall ();
1417
+ }
1418
+
1399
1419
err = netif_set_xps_queue (dev , mask , index );
1420
+ rtnl_unlock ();
1400
1421
1401
1422
free_cpumask_var (mask );
1402
1423
@@ -1408,22 +1429,29 @@ static struct netdev_queue_attribute xps_cpus_attribute __ro_after_init
1408
1429
1409
1430
static ssize_t xps_rxqs_show (struct netdev_queue * queue , char * buf )
1410
1431
{
1432
+ int j , len , ret , num_tc = 1 , tc = 0 ;
1411
1433
struct net_device * dev = queue -> dev ;
1412
1434
struct xps_dev_maps * dev_maps ;
1413
1435
unsigned long * mask , index ;
1414
- int j , len , num_tc = 1 , tc = 0 ;
1415
1436
1416
1437
index = get_netdev_queue_index (queue );
1417
1438
1439
+ if (!rtnl_trylock ())
1440
+ return restart_syscall ();
1441
+
1418
1442
if (dev -> num_tc ) {
1419
1443
num_tc = dev -> num_tc ;
1420
1444
tc = netdev_txq_to_tc (dev , index );
1421
- if (tc < 0 )
1422
- return - EINVAL ;
1445
+ if (tc < 0 ) {
1446
+ ret = - EINVAL ;
1447
+ goto err_rtnl_unlock ;
1448
+ }
1423
1449
}
1424
1450
mask = bitmap_zalloc (dev -> num_rx_queues , GFP_KERNEL );
1425
- if (!mask )
1426
- return - ENOMEM ;
1451
+ if (!mask ) {
1452
+ ret = - ENOMEM ;
1453
+ goto err_rtnl_unlock ;
1454
+ }
1427
1455
1428
1456
rcu_read_lock ();
1429
1457
dev_maps = rcu_dereference (dev -> xps_rxqs_map );
@@ -1449,10 +1477,16 @@ static ssize_t xps_rxqs_show(struct netdev_queue *queue, char *buf)
1449
1477
out_no_maps :
1450
1478
rcu_read_unlock ();
1451
1479
1480
+ rtnl_unlock ();
1481
+
1452
1482
len = bitmap_print_to_pagebuf (false, buf , mask , dev -> num_rx_queues );
1453
1483
bitmap_free (mask );
1454
1484
1455
1485
return len < PAGE_SIZE ? len : - EINVAL ;
1486
+
1487
+ err_rtnl_unlock :
1488
+ rtnl_unlock ();
1489
+ return ret ;
1456
1490
}
1457
1491
1458
1492
static ssize_t xps_rxqs_store (struct netdev_queue * queue , const char * buf ,
@@ -1478,10 +1512,17 @@ static ssize_t xps_rxqs_store(struct netdev_queue *queue, const char *buf,
1478
1512
return err ;
1479
1513
}
1480
1514
1515
+ if (!rtnl_trylock ()) {
1516
+ bitmap_free (mask );
1517
+ return restart_syscall ();
1518
+ }
1519
+
1481
1520
cpus_read_lock ();
1482
1521
err = __netif_set_xps_queue (dev , mask , index , true);
1483
1522
cpus_read_unlock ();
1484
1523
1524
+ rtnl_unlock ();
1525
+
1485
1526
bitmap_free (mask );
1486
1527
return err ? : len ;
1487
1528
}
0 commit comments