Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'netdevsim-implement-support-for-devlink-region-and-snapshots'

Jiri Pirko says:

====================
netdevsim: implement support for devlink region and snapshots

Implement devlink region support for netdevsim and test it.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+116 -2
+62 -1
drivers/net/netdevsim/dev.c
··· 27 27 28 28 static struct dentry *nsim_dev_ddir; 29 29 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 + 30 65 static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) 31 66 { 32 67 char dev_ddir_name[16]; ··· 79 44 &nsim_dev->max_macs); 80 45 debugfs_create_bool("test1", 0600, nsim_dev->ddir, 81 46 &nsim_dev->test1); 47 + debugfs_create_file("take_snapshot", 0200, nsim_dev->ddir, nsim_dev, 48 + &nsim_dev_take_snapshot_fops); 82 49 return 0; 83 50 } 84 51 ··· 285 248 nsim_dev->test1 = saved_value.vbool; 286 249 } 287 250 251 + #define NSIM_DEV_DUMMY_REGION_SNAPSHOT_MAX 16 252 + 253 + static int nsim_dev_dummy_region_init(struct nsim_dev *nsim_dev, 254 + struct devlink *devlink) 255 + { 256 + nsim_dev->dummy_region = 257 + devlink_region_create(devlink, "dummy", 258 + NSIM_DEV_DUMMY_REGION_SNAPSHOT_MAX, 259 + NSIM_DEV_DUMMY_REGION_SIZE); 260 + return PTR_ERR_OR_ZERO(nsim_dev->dummy_region); 261 + } 262 + 263 + static void nsim_dev_dummy_region_exit(struct nsim_dev *nsim_dev) 264 + { 265 + devlink_region_destroy(nsim_dev->dummy_region); 266 + } 267 + 288 268 static int nsim_dev_reload(struct devlink *devlink, 289 269 struct netlink_ext_ack *extack) 290 270 { ··· 417 363 goto err_dl_unregister; 418 364 nsim_devlink_set_params_init_values(nsim_dev, devlink); 419 365 420 - err = nsim_dev_debugfs_init(nsim_dev); 366 + err = nsim_dev_dummy_region_init(nsim_dev, devlink); 421 367 if (err) 422 368 goto err_params_unregister; 369 + 370 + err = nsim_dev_debugfs_init(nsim_dev); 371 + if (err) 372 + goto err_dummy_region_exit; 423 373 424 374 err = nsim_bpf_dev_init(nsim_dev); 425 375 if (err) ··· 434 376 435 377 err_debugfs_exit: 436 378 nsim_dev_debugfs_exit(nsim_dev); 379 + err_dummy_region_exit: 380 + nsim_dev_dummy_region_exit(nsim_dev); 437 381 err_params_unregister: 438 382 devlink_params_unregister(devlink, nsim_devlink_params, 439 383 ARRAY_SIZE(nsim_devlink_params)); ··· 456 396 457 397 nsim_bpf_dev_exit(nsim_dev); 458 398 nsim_dev_debugfs_exit(nsim_dev); 399 + nsim_dev_dummy_region_exit(nsim_dev); 459 400 devlink_params_unregister(devlink, nsim_devlink_params, 460 401 ARRAY_SIZE(nsim_devlink_params)); 461 402 devlink_unregister(devlink);
+1
drivers/net/netdevsim/netdevsim.h
··· 160 160 bool fw_update_status; 161 161 u32 max_macs; 162 162 bool test1; 163 + struct devlink_region *dummy_region; 163 164 }; 164 165 165 166 int nsim_dev_init(void);
+53 -1
tools/testing/selftests/drivers/net/netdevsim/devlink.sh
··· 3 3 4 4 lib_dir=$(dirname $0)/../../../net/forwarding 5 5 6 - ALL_TESTS="fw_flash_test params_test" 6 + ALL_TESTS="fw_flash_test params_test regions_test" 7 7 NUM_NETIFS=0 8 8 source $lib_dir/lib.sh 9 9 ··· 88 88 check_value test1 post-reload false N 89 89 90 90 log_test "params test" 91 + } 92 + 93 + check_region_size() 94 + { 95 + local name=$1 96 + local size 97 + 98 + size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size') 99 + check_err $? "Failed to get $name region size" 100 + [ $size -eq 32768 ] 101 + check_err $? "Invalid $name region size" 102 + } 103 + 104 + check_region_snapshot_count() 105 + { 106 + local name=$1 107 + local phase_name=$2 108 + local expected_count=$3 109 + local count 110 + 111 + count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length') 112 + [ $count -eq $expected_count ] 113 + check_err $? "Unexpected $phase_name snapshot count" 114 + } 115 + 116 + regions_test() 117 + { 118 + RET=0 119 + 120 + local count 121 + 122 + check_region_size dummy 123 + check_region_snapshot_count dummy initial 0 124 + 125 + echo ""> $DEBUGFS_DIR/take_snapshot 126 + check_err $? "Failed to take first dummy region snapshot" 127 + check_region_snapshot_count dummy post-first-snapshot 1 128 + 129 + echo ""> $DEBUGFS_DIR/take_snapshot 130 + check_err $? "Failed to take second dummy region snapshot" 131 + check_region_snapshot_count dummy post-second-snapshot 2 132 + 133 + echo ""> $DEBUGFS_DIR/take_snapshot 134 + check_err $? "Failed to take third dummy region snapshot" 135 + check_region_snapshot_count dummy post-third-snapshot 3 136 + 137 + devlink region del $DL_HANDLE/dummy snapshot 1 138 + check_err $? "Failed to delete first dummy region snapshot" 139 + 140 + check_region_snapshot_count dummy post-first-delete 2 141 + 142 + log_test "regions test" 91 143 } 92 144 93 145 setup_prepare()