Skip to content

Commit 4418f86

Browse files
jpirkodavem330
authored andcommitted
netdevsim: implement support for devlink region and snapshots
Implement dummy region of size 32K and allow user to create snapshots or random data using debugfs file trigger. Signed-off-by: Jiri Pirko <[email protected]> Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bd00cc3 commit 4418f86

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

drivers/net/netdevsim/dev.c

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,41 @@
2727

2828
static struct dentry *nsim_dev_ddir;
2929

30+
#define NSIM_DEV_DUMMY_REGION_SIZE (1024 * 32)
31+
32+
static ssize_t nsim_dev_take_snapshot_write(struct file *file,
33+
const char __user *data,
34+
size_t count, loff_t *ppos)
35+
{
36+
struct nsim_dev *nsim_dev = file->private_data;
37+
void *dummy_data;
38+
int err;
39+
u32 id;
40+
41+
dummy_data = kmalloc(NSIM_DEV_DUMMY_REGION_SIZE, GFP_KERNEL);
42+
if (!dummy_data)
43+
return -ENOMEM;
44+
45+
get_random_bytes(dummy_data, NSIM_DEV_DUMMY_REGION_SIZE);
46+
47+
id = devlink_region_shapshot_id_get(priv_to_devlink(nsim_dev));
48+
err = devlink_region_snapshot_create(nsim_dev->dummy_region,
49+
dummy_data, id, kfree);
50+
if (err) {
51+
pr_err("Failed to create region snapshot\n");
52+
kfree(dummy_data);
53+
return err;
54+
}
55+
56+
return count;
57+
}
58+
59+
static const struct file_operations nsim_dev_take_snapshot_fops = {
60+
.open = simple_open,
61+
.write = nsim_dev_take_snapshot_write,
62+
.llseek = generic_file_llseek,
63+
};
64+
3065
static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)
3166
{
3267
char dev_ddir_name[16];
@@ -44,6 +79,8 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev)
4479
&nsim_dev->max_macs);
4580
debugfs_create_bool("test1", 0600, nsim_dev->ddir,
4681
&nsim_dev->test1);
82+
debugfs_create_file("take_snapshot", 0200, nsim_dev->ddir, nsim_dev,
83+
&nsim_dev_take_snapshot_fops);
4784
return 0;
4885
}
4986

@@ -248,6 +285,23 @@ static void nsim_devlink_param_load_driverinit_values(struct devlink *devlink)
248285
nsim_dev->test1 = saved_value.vbool;
249286
}
250287

288+
#define NSIM_DEV_DUMMY_REGION_SNAPSHOT_MAX 16
289+
290+
static int nsim_dev_dummy_region_init(struct nsim_dev *nsim_dev,
291+
struct devlink *devlink)
292+
{
293+
nsim_dev->dummy_region =
294+
devlink_region_create(devlink, "dummy",
295+
NSIM_DEV_DUMMY_REGION_SNAPSHOT_MAX,
296+
NSIM_DEV_DUMMY_REGION_SIZE);
297+
return PTR_ERR_OR_ZERO(nsim_dev->dummy_region);
298+
}
299+
300+
static void nsim_dev_dummy_region_exit(struct nsim_dev *nsim_dev)
301+
{
302+
devlink_region_destroy(nsim_dev->dummy_region);
303+
}
304+
251305
static int nsim_dev_reload(struct devlink *devlink,
252306
struct netlink_ext_ack *extack)
253307
{
@@ -363,10 +417,14 @@ nsim_dev_create(struct nsim_bus_dev *nsim_bus_dev, unsigned int port_count)
363417
goto err_dl_unregister;
364418
nsim_devlink_set_params_init_values(nsim_dev, devlink);
365419

366-
err = nsim_dev_debugfs_init(nsim_dev);
420+
err = nsim_dev_dummy_region_init(nsim_dev, devlink);
367421
if (err)
368422
goto err_params_unregister;
369423

424+
err = nsim_dev_debugfs_init(nsim_dev);
425+
if (err)
426+
goto err_dummy_region_exit;
427+
370428
err = nsim_bpf_dev_init(nsim_dev);
371429
if (err)
372430
goto err_debugfs_exit;
@@ -376,6 +434,8 @@ nsim_dev_create(struct nsim_bus_dev *nsim_bus_dev, unsigned int port_count)
376434

377435
err_debugfs_exit:
378436
nsim_dev_debugfs_exit(nsim_dev);
437+
err_dummy_region_exit:
438+
nsim_dev_dummy_region_exit(nsim_dev);
379439
err_params_unregister:
380440
devlink_params_unregister(devlink, nsim_devlink_params,
381441
ARRAY_SIZE(nsim_devlink_params));
@@ -396,6 +456,7 @@ static void nsim_dev_destroy(struct nsim_dev *nsim_dev)
396456

397457
nsim_bpf_dev_exit(nsim_dev);
398458
nsim_dev_debugfs_exit(nsim_dev);
459+
nsim_dev_dummy_region_exit(nsim_dev);
399460
devlink_params_unregister(devlink, nsim_devlink_params,
400461
ARRAY_SIZE(nsim_devlink_params));
401462
devlink_unregister(devlink);

drivers/net/netdevsim/netdevsim.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ struct nsim_dev {
160160
bool fw_update_status;
161161
u32 max_macs;
162162
bool test1;
163+
struct devlink_region *dummy_region;
163164
};
164165

165166
int nsim_dev_init(void);

0 commit comments

Comments
 (0)