@@ -56,6 +56,14 @@ static inline unsigned int nsim_dev_port_index_to_vf_index(unsigned int port_ind
56
56
57
57
static struct dentry * nsim_dev_ddir ;
58
58
59
+ unsigned int nsim_dev_get_vfs (struct nsim_dev * nsim_dev )
60
+ {
61
+ WARN_ON (!lockdep_rtnl_is_held () &&
62
+ !lockdep_is_held (& nsim_dev -> vfs_lock ));
63
+
64
+ return nsim_dev -> nsim_bus_dev -> num_vfs ;
65
+ }
66
+
59
67
#define NSIM_DEV_DUMMY_REGION_SIZE (1024 * 32)
60
68
61
69
static int
@@ -260,7 +268,7 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)
260
268
nsim_dev -> ddir ,
261
269
& nsim_dev -> fail_trap_policer_counter_get );
262
270
debugfs_create_file ("max_vfs" , 0600 , nsim_dev -> ddir ,
263
- nsim_dev -> nsim_bus_dev , & nsim_dev_max_vfs_fops );
271
+ nsim_dev , & nsim_dev_max_vfs_fops );
264
272
265
273
nsim_dev -> nodes_ddir = debugfs_create_dir ("rate_nodes" , nsim_dev -> ddir );
266
274
if (IS_ERR (nsim_dev -> nodes_ddir )) {
@@ -326,9 +334,9 @@ static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev,
326
334
unsigned int vf_id = nsim_dev_port_index_to_vf_index (port_index );
327
335
328
336
debugfs_create_u16 ("tx_share" , 0400 , nsim_dev_port -> ddir ,
329
- & nsim_bus_dev -> vfconfigs [vf_id ].min_tx_rate );
337
+ & nsim_dev -> vfconfigs [vf_id ].min_tx_rate );
330
338
debugfs_create_u16 ("tx_max" , 0400 , nsim_dev_port -> ddir ,
331
- & nsim_bus_dev -> vfconfigs [vf_id ].max_tx_rate );
339
+ & nsim_dev -> vfconfigs [vf_id ].max_tx_rate );
332
340
nsim_dev_port -> rate_parent = debugfs_create_file ("rate_parent" ,
333
341
0400 ,
334
342
nsim_dev_port -> ddir ,
@@ -508,7 +516,7 @@ int nsim_esw_switchdev_enable(struct nsim_dev *nsim_dev, struct netlink_ext_ack
508
516
struct nsim_bus_dev * nsim_bus_dev = nsim_dev -> nsim_bus_dev ;
509
517
int i , err ;
510
518
511
- for (i = 0 ; i < nsim_bus_dev -> num_vfs ; i ++ ) {
519
+ for (i = 0 ; i < nsim_dev_get_vfs ( nsim_dev ) ; i ++ ) {
512
520
err = nsim_dev_port_add (nsim_bus_dev , NSIM_DEV_PORT_TYPE_VF , i );
513
521
if (err ) {
514
522
NL_SET_ERR_MSG_MOD (extack , "Failed to initialize VFs' netdevsim ports" );
@@ -531,7 +539,7 @@ static int nsim_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
531
539
struct nsim_dev * nsim_dev = devlink_priv (devlink );
532
540
int err = 0 ;
533
541
534
- mutex_lock (& nsim_dev -> nsim_bus_dev -> vfs_lock );
542
+ mutex_lock (& nsim_dev -> vfs_lock );
535
543
if (mode == nsim_dev -> esw_mode )
536
544
goto unlock ;
537
545
@@ -543,7 +551,7 @@ static int nsim_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
543
551
err = - EINVAL ;
544
552
545
553
unlock :
546
- mutex_unlock (& nsim_dev -> nsim_bus_dev -> vfs_lock );
554
+ mutex_unlock (& nsim_dev -> vfs_lock );
547
555
return err ;
548
556
}
549
557
@@ -1091,31 +1099,31 @@ static int nsim_leaf_tx_share_set(struct devlink_rate *devlink_rate, void *priv,
1091
1099
u64 tx_share , struct netlink_ext_ack * extack )
1092
1100
{
1093
1101
struct nsim_dev_port * nsim_dev_port = priv ;
1094
- struct nsim_bus_dev * nsim_bus_dev = nsim_dev_port -> ns -> nsim_bus_dev ;
1102
+ struct nsim_dev * nsim_dev = nsim_dev_port -> ns -> nsim_dev ;
1095
1103
int vf_id = nsim_dev_port_index_to_vf_index (nsim_dev_port -> port_index );
1096
1104
int err ;
1097
1105
1098
1106
err = nsim_rate_bytes_to_units ("tx_share" , & tx_share , extack );
1099
1107
if (err )
1100
1108
return err ;
1101
1109
1102
- nsim_bus_dev -> vfconfigs [vf_id ].min_tx_rate = tx_share ;
1110
+ nsim_dev -> vfconfigs [vf_id ].min_tx_rate = tx_share ;
1103
1111
return 0 ;
1104
1112
}
1105
1113
1106
1114
static int nsim_leaf_tx_max_set (struct devlink_rate * devlink_rate , void * priv ,
1107
1115
u64 tx_max , struct netlink_ext_ack * extack )
1108
1116
{
1109
1117
struct nsim_dev_port * nsim_dev_port = priv ;
1110
- struct nsim_bus_dev * nsim_bus_dev = nsim_dev_port -> ns -> nsim_bus_dev ;
1118
+ struct nsim_dev * nsim_dev = nsim_dev_port -> ns -> nsim_dev ;
1111
1119
int vf_id = nsim_dev_port_index_to_vf_index (nsim_dev_port -> port_index );
1112
1120
int err ;
1113
1121
1114
1122
err = nsim_rate_bytes_to_units ("tx_max" , & tx_max , extack );
1115
1123
if (err )
1116
1124
return err ;
1117
1125
1118
- nsim_bus_dev -> vfconfigs [vf_id ].max_tx_rate = tx_max ;
1126
+ nsim_dev -> vfconfigs [vf_id ].max_tx_rate = tx_max ;
1119
1127
return 0 ;
1120
1128
}
1121
1129
@@ -1271,13 +1279,12 @@ static const struct devlink_ops nsim_dev_devlink_ops = {
1271
1279
static int __nsim_dev_port_add (struct nsim_dev * nsim_dev , enum nsim_dev_port_type type ,
1272
1280
unsigned int port_index )
1273
1281
{
1274
- struct nsim_bus_dev * nsim_bus_dev = nsim_dev -> nsim_bus_dev ;
1275
1282
struct devlink_port_attrs attrs = {};
1276
1283
struct nsim_dev_port * nsim_dev_port ;
1277
1284
struct devlink_port * devlink_port ;
1278
1285
int err ;
1279
1286
1280
- if (type == NSIM_DEV_PORT_TYPE_VF && !nsim_bus_dev -> num_vfs )
1287
+ if (type == NSIM_DEV_PORT_TYPE_VF && !nsim_dev_get_vfs ( nsim_dev ) )
1281
1288
return - EINVAL ;
1282
1289
1283
1290
nsim_dev_port = kzalloc (sizeof (* nsim_dev_port ), GFP_KERNEL );
@@ -1455,6 +1462,7 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
1455
1462
nsim_dev -> switch_id .id_len = sizeof (nsim_dev -> switch_id .id );
1456
1463
get_random_bytes (nsim_dev -> switch_id .id , nsim_dev -> switch_id .id_len );
1457
1464
INIT_LIST_HEAD (& nsim_dev -> port_list );
1465
+ mutex_init (& nsim_dev -> vfs_lock );
1458
1466
mutex_init (& nsim_dev -> port_list_lock );
1459
1467
nsim_dev -> fw_update_status = true;
1460
1468
nsim_dev -> fw_update_overwrite_mask = 0 ;
@@ -1464,9 +1472,17 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
1464
1472
1465
1473
dev_set_drvdata (& nsim_bus_dev -> dev , nsim_dev );
1466
1474
1475
+ nsim_dev -> vfconfigs = kcalloc (nsim_bus_dev -> max_vfs ,
1476
+ sizeof (struct nsim_vf_config ),
1477
+ GFP_KERNEL | __GFP_NOWARN );
1478
+ if (!nsim_dev -> vfconfigs ) {
1479
+ err = - ENOMEM ;
1480
+ goto err_devlink_free ;
1481
+ }
1482
+
1467
1483
err = nsim_dev_resources_register (devlink );
1468
1484
if (err )
1469
- goto err_devlink_free ;
1485
+ goto err_vfc_free ;
1470
1486
1471
1487
err = devlink_params_register (devlink , nsim_devlink_params ,
1472
1488
ARRAY_SIZE (nsim_devlink_params ));
@@ -1532,8 +1548,11 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
1532
1548
ARRAY_SIZE (nsim_devlink_params ));
1533
1549
err_dl_unregister :
1534
1550
devlink_resources_unregister (devlink , NULL );
1551
+ err_vfc_free :
1552
+ kfree (nsim_dev -> vfconfigs );
1535
1553
err_devlink_free :
1536
1554
devlink_free (devlink );
1555
+ dev_set_drvdata (& nsim_bus_dev -> dev , NULL );
1537
1556
return err ;
1538
1557
}
1539
1558
@@ -1545,10 +1564,10 @@ static void nsim_dev_reload_destroy(struct nsim_dev *nsim_dev)
1545
1564
return ;
1546
1565
debugfs_remove (nsim_dev -> take_snapshot );
1547
1566
1548
- mutex_lock (& nsim_dev -> nsim_bus_dev -> vfs_lock );
1549
- if (nsim_dev -> nsim_bus_dev -> num_vfs )
1567
+ mutex_lock (& nsim_dev -> vfs_lock );
1568
+ if (nsim_dev_get_vfs ( nsim_dev ) )
1550
1569
nsim_bus_dev_vfs_disable (nsim_dev -> nsim_bus_dev );
1551
- mutex_unlock (& nsim_dev -> nsim_bus_dev -> vfs_lock );
1570
+ mutex_unlock (& nsim_dev -> vfs_lock );
1552
1571
1553
1572
nsim_dev_port_del_all (nsim_dev );
1554
1573
nsim_dev_psample_exit (nsim_dev );
@@ -1572,7 +1591,9 @@ void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev)
1572
1591
devlink_params_unregister (devlink , nsim_devlink_params ,
1573
1592
ARRAY_SIZE (nsim_devlink_params ));
1574
1593
devlink_resources_unregister (devlink , NULL );
1594
+ kfree (nsim_dev -> vfconfigs );
1575
1595
devlink_free (devlink );
1596
+ dev_set_drvdata (& nsim_bus_dev -> dev , NULL );
1576
1597
}
1577
1598
1578
1599
static struct nsim_dev_port *
0 commit comments