2727
2828static 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+
3065static 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+
251305static 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
377435err_debugfs_exit :
378436 nsim_dev_debugfs_exit (nsim_dev );
437+ err_dummy_region_exit :
438+ nsim_dev_dummy_region_exit (nsim_dev );
379439err_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 );
0 commit comments