Skip to content

Commit 5e388f3

Browse files
kuba-moodavem330
authored andcommitted
netdevsim: move vfconfig to nsim_dev
When netdevsim got split into the faux bus vfconfig ended up in the bus device (think pci_dev) which is strange because it contains very networky not to say netdevy information. Move it to nsim_dev, which is the driver "priv" structure for the device. To make sure we don't race with probe/remove take the device lock (much like PCI). While at it remove the NULL-checking of vfconfigs. It appears to be pointless. Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 26c37d8 commit 5e388f3

File tree

4 files changed

+111
-91
lines changed

4 files changed

+111
-91
lines changed

drivers/net/netdevsim/bus.c

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ static int nsim_bus_dev_vfs_enable(struct nsim_bus_dev *nsim_bus_dev,
4040

4141
if (nsim_bus_dev->max_vfs < num_vfs)
4242
return -ENOMEM;
43-
44-
if (!nsim_bus_dev->vfconfigs)
45-
return -ENOMEM;
4643
nsim_bus_dev_set_vfs(nsim_bus_dev, num_vfs);
4744

4845
nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
@@ -70,14 +67,21 @@ nsim_bus_dev_numvfs_store(struct device *dev, struct device_attribute *attr,
7067
const char *buf, size_t count)
7168
{
7269
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
70+
struct nsim_dev *nsim_dev = dev_get_drvdata(dev);
7371
unsigned int num_vfs;
7472
int ret;
7573

7674
ret = kstrtouint(buf, 0, &num_vfs);
7775
if (ret)
7876
return ret;
7977

80-
mutex_lock(&nsim_bus_dev->vfs_lock);
78+
device_lock(dev);
79+
if (!nsim_dev) {
80+
ret = -ENOENT;
81+
goto exit_unlock;
82+
}
83+
84+
mutex_lock(&nsim_dev->vfs_lock);
8185
if (nsim_bus_dev->num_vfs == num_vfs)
8286
goto exit_good;
8387
if (nsim_bus_dev->num_vfs && num_vfs) {
@@ -95,7 +99,8 @@ nsim_bus_dev_numvfs_store(struct device *dev, struct device_attribute *attr,
9599
exit_good:
96100
ret = count;
97101
exit_unlock:
98-
mutex_unlock(&nsim_bus_dev->vfs_lock);
102+
mutex_unlock(&nsim_dev->vfs_lock);
103+
device_unlock(dev);
99104

100105
return ret;
101106
}
@@ -117,7 +122,8 @@ ssize_t nsim_bus_dev_max_vfs_read(struct file *file,
117122
char __user *data,
118123
size_t count, loff_t *ppos)
119124
{
120-
struct nsim_bus_dev *nsim_bus_dev = file->private_data;
125+
struct nsim_dev *nsim_dev = file->private_data;
126+
struct nsim_bus_dev *nsim_bus_dev = nsim_dev->nsim_bus_dev;
121127
char buf[11];
122128
ssize_t len;
123129

@@ -132,7 +138,8 @@ ssize_t nsim_bus_dev_max_vfs_write(struct file *file,
132138
const char __user *data,
133139
size_t count, loff_t *ppos)
134140
{
135-
struct nsim_bus_dev *nsim_bus_dev = file->private_data;
141+
struct nsim_dev *nsim_dev = file->private_data;
142+
struct nsim_bus_dev *nsim_bus_dev = nsim_dev->nsim_bus_dev;
136143
struct nsim_vf_config *vfconfigs;
137144
ssize_t ret;
138145
char buf[10];
@@ -144,7 +151,7 @@ ssize_t nsim_bus_dev_max_vfs_write(struct file *file,
144151
if (count >= sizeof(buf))
145152
return -ENOSPC;
146153

147-
mutex_lock(&nsim_bus_dev->vfs_lock);
154+
mutex_lock(&nsim_dev->vfs_lock);
148155
/* Reject if VFs are configured */
149156
if (nsim_bus_dev->num_vfs) {
150157
ret = -EBUSY;
@@ -176,13 +183,13 @@ ssize_t nsim_bus_dev_max_vfs_write(struct file *file,
176183
goto unlock;
177184
}
178185

179-
kfree(nsim_bus_dev->vfconfigs);
180-
nsim_bus_dev->vfconfigs = vfconfigs;
186+
kfree(nsim_dev->vfconfigs);
187+
nsim_dev->vfconfigs = vfconfigs;
181188
nsim_bus_dev->max_vfs = val;
182189
*ppos += count;
183190
ret = count;
184191
unlock:
185-
mutex_unlock(&nsim_bus_dev->vfs_lock);
192+
mutex_unlock(&nsim_dev->vfs_lock);
186193
return ret;
187194
}
188195

@@ -428,26 +435,15 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count, unsigned int num_queu
428435
nsim_bus_dev->initial_net = current->nsproxy->net_ns;
429436
nsim_bus_dev->max_vfs = NSIM_BUS_DEV_MAX_VFS;
430437
mutex_init(&nsim_bus_dev->nsim_bus_reload_lock);
431-
mutex_init(&nsim_bus_dev->vfs_lock);
432438
/* Disallow using nsim_bus_dev */
433439
smp_store_release(&nsim_bus_dev->init, false);
434440

435-
nsim_bus_dev->vfconfigs = kcalloc(nsim_bus_dev->max_vfs,
436-
sizeof(struct nsim_vf_config),
437-
GFP_KERNEL | __GFP_NOWARN);
438-
if (!nsim_bus_dev->vfconfigs) {
439-
err = -ENOMEM;
440-
goto err_nsim_bus_dev_id_free;
441-
}
442-
443441
err = device_register(&nsim_bus_dev->dev);
444442
if (err)
445-
goto err_nsim_vfs_free;
443+
goto err_nsim_bus_dev_id_free;
446444

447445
return nsim_bus_dev;
448446

449-
err_nsim_vfs_free:
450-
kfree(nsim_bus_dev->vfconfigs);
451447
err_nsim_bus_dev_id_free:
452448
ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id);
453449
err_nsim_bus_dev_free:
@@ -461,7 +457,6 @@ static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev)
461457
smp_store_release(&nsim_bus_dev->init, false);
462458
device_unregister(&nsim_bus_dev->dev);
463459
ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id);
464-
kfree(nsim_bus_dev->vfconfigs);
465460
kfree(nsim_bus_dev);
466461
}
467462

drivers/net/netdevsim/dev.c

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ static inline unsigned int nsim_dev_port_index_to_vf_index(unsigned int port_ind
5656

5757
static struct dentry *nsim_dev_ddir;
5858

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+
5967
#define NSIM_DEV_DUMMY_REGION_SIZE (1024 * 32)
6068

6169
static int
@@ -260,7 +268,7 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)
260268
nsim_dev->ddir,
261269
&nsim_dev->fail_trap_policer_counter_get);
262270
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);
264272

265273
nsim_dev->nodes_ddir = debugfs_create_dir("rate_nodes", nsim_dev->ddir);
266274
if (IS_ERR(nsim_dev->nodes_ddir)) {
@@ -326,9 +334,9 @@ static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev,
326334
unsigned int vf_id = nsim_dev_port_index_to_vf_index(port_index);
327335

328336
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);
330338
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);
332340
nsim_dev_port->rate_parent = debugfs_create_file("rate_parent",
333341
0400,
334342
nsim_dev_port->ddir,
@@ -508,7 +516,7 @@ int nsim_esw_switchdev_enable(struct nsim_dev *nsim_dev, struct netlink_ext_ack
508516
struct nsim_bus_dev *nsim_bus_dev = nsim_dev->nsim_bus_dev;
509517
int i, err;
510518

511-
for (i = 0; i < nsim_bus_dev->num_vfs; i++) {
519+
for (i = 0; i < nsim_dev_get_vfs(nsim_dev); i++) {
512520
err = nsim_dev_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_VF, i);
513521
if (err) {
514522
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,
531539
struct nsim_dev *nsim_dev = devlink_priv(devlink);
532540
int err = 0;
533541

534-
mutex_lock(&nsim_dev->nsim_bus_dev->vfs_lock);
542+
mutex_lock(&nsim_dev->vfs_lock);
535543
if (mode == nsim_dev->esw_mode)
536544
goto unlock;
537545

@@ -543,7 +551,7 @@ static int nsim_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
543551
err = -EINVAL;
544552

545553
unlock:
546-
mutex_unlock(&nsim_dev->nsim_bus_dev->vfs_lock);
554+
mutex_unlock(&nsim_dev->vfs_lock);
547555
return err;
548556
}
549557

@@ -1091,31 +1099,31 @@ static int nsim_leaf_tx_share_set(struct devlink_rate *devlink_rate, void *priv,
10911099
u64 tx_share, struct netlink_ext_ack *extack)
10921100
{
10931101
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;
10951103
int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
10961104
int err;
10971105

10981106
err = nsim_rate_bytes_to_units("tx_share", &tx_share, extack);
10991107
if (err)
11001108
return err;
11011109

1102-
nsim_bus_dev->vfconfigs[vf_id].min_tx_rate = tx_share;
1110+
nsim_dev->vfconfigs[vf_id].min_tx_rate = tx_share;
11031111
return 0;
11041112
}
11051113

11061114
static int nsim_leaf_tx_max_set(struct devlink_rate *devlink_rate, void *priv,
11071115
u64 tx_max, struct netlink_ext_ack *extack)
11081116
{
11091117
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;
11111119
int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
11121120
int err;
11131121

11141122
err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack);
11151123
if (err)
11161124
return err;
11171125

1118-
nsim_bus_dev->vfconfigs[vf_id].max_tx_rate = tx_max;
1126+
nsim_dev->vfconfigs[vf_id].max_tx_rate = tx_max;
11191127
return 0;
11201128
}
11211129

@@ -1271,13 +1279,12 @@ static const struct devlink_ops nsim_dev_devlink_ops = {
12711279
static int __nsim_dev_port_add(struct nsim_dev *nsim_dev, enum nsim_dev_port_type type,
12721280
unsigned int port_index)
12731281
{
1274-
struct nsim_bus_dev *nsim_bus_dev = nsim_dev->nsim_bus_dev;
12751282
struct devlink_port_attrs attrs = {};
12761283
struct nsim_dev_port *nsim_dev_port;
12771284
struct devlink_port *devlink_port;
12781285
int err;
12791286

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))
12811288
return -EINVAL;
12821289

12831290
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)
14551462
nsim_dev->switch_id.id_len = sizeof(nsim_dev->switch_id.id);
14561463
get_random_bytes(nsim_dev->switch_id.id, nsim_dev->switch_id.id_len);
14571464
INIT_LIST_HEAD(&nsim_dev->port_list);
1465+
mutex_init(&nsim_dev->vfs_lock);
14581466
mutex_init(&nsim_dev->port_list_lock);
14591467
nsim_dev->fw_update_status = true;
14601468
nsim_dev->fw_update_overwrite_mask = 0;
@@ -1464,9 +1472,17 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
14641472

14651473
dev_set_drvdata(&nsim_bus_dev->dev, nsim_dev);
14661474

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+
14671483
err = nsim_dev_resources_register(devlink);
14681484
if (err)
1469-
goto err_devlink_free;
1485+
goto err_vfc_free;
14701486

14711487
err = devlink_params_register(devlink, nsim_devlink_params,
14721488
ARRAY_SIZE(nsim_devlink_params));
@@ -1532,8 +1548,11 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
15321548
ARRAY_SIZE(nsim_devlink_params));
15331549
err_dl_unregister:
15341550
devlink_resources_unregister(devlink, NULL);
1551+
err_vfc_free:
1552+
kfree(nsim_dev->vfconfigs);
15351553
err_devlink_free:
15361554
devlink_free(devlink);
1555+
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
15371556
return err;
15381557
}
15391558

@@ -1545,10 +1564,10 @@ static void nsim_dev_reload_destroy(struct nsim_dev *nsim_dev)
15451564
return;
15461565
debugfs_remove(nsim_dev->take_snapshot);
15471566

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))
15501569
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);
15521571

15531572
nsim_dev_port_del_all(nsim_dev);
15541573
nsim_dev_psample_exit(nsim_dev);
@@ -1572,7 +1591,9 @@ void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev)
15721591
devlink_params_unregister(devlink, nsim_devlink_params,
15731592
ARRAY_SIZE(nsim_devlink_params));
15741593
devlink_resources_unregister(devlink, NULL);
1594+
kfree(nsim_dev->vfconfigs);
15751595
devlink_free(devlink);
1596+
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
15761597
}
15771598

15781599
static struct nsim_dev_port *

0 commit comments

Comments
 (0)