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

netdevsim: merge sdev into dev

As previously introduce dev which is mapped 1:1 to a bus device covers
the purpose of the original shared device, merge the sdev code into dev.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Pirko and committed by
David S. Miller
d514f41e a60f9e48

+120 -119
+1 -1
drivers/net/netdevsim/Makefile
··· 3 3 obj-$(CONFIG_NETDEVSIM) += netdevsim.o 4 4 5 5 netdevsim-objs := \ 6 - netdev.o dev.o fib.o sdev.o bus.o 6 + netdev.o dev.o fib.o bus.o 7 7 8 8 ifeq ($(CONFIG_BPF_SYSCALL),y) 9 9 netdevsim-objs += \
+33 -46
drivers/net/netdevsim/bpf.c
··· 27 27 bpf_verifier_log_write(env, "[netdevsim] " fmt, ##__VA_ARGS__) 28 28 29 29 struct nsim_bpf_bound_prog { 30 - struct netdevsim_shared_dev *sdev; 30 + struct nsim_dev *nsim_dev; 31 31 struct bpf_prog *prog; 32 32 struct dentry *ddir; 33 33 const char *state; ··· 65 65 struct nsim_bpf_bound_prog *state; 66 66 67 67 state = env->prog->aux->offload->dev_priv; 68 - if (state->sdev->bpf_bind_verifier_delay && !insn_idx) 69 - msleep(state->sdev->bpf_bind_verifier_delay); 68 + if (state->nsim_dev->bpf_bind_verifier_delay && !insn_idx) 69 + msleep(state->nsim_dev->bpf_bind_verifier_delay); 70 70 71 71 if (insn_idx == env->prog->len - 1) 72 72 pr_vlog(env, "Hello from netdevsim!\n"); ··· 213 213 return 0; 214 214 } 215 215 216 - static int nsim_bpf_create_prog(struct netdevsim_shared_dev *sdev, 216 + static int nsim_bpf_create_prog(struct nsim_dev *nsim_dev, 217 217 struct bpf_prog *prog) 218 218 { 219 219 struct nsim_bpf_bound_prog *state; ··· 223 223 if (!state) 224 224 return -ENOMEM; 225 225 226 - state->sdev = sdev; 226 + state->nsim_dev = nsim_dev; 227 227 state->prog = prog; 228 228 state->state = "verify"; 229 229 230 230 /* Program id is not populated yet when we create the state. */ 231 - sprintf(name, "%u", sdev->prog_id_gen++); 232 - state->ddir = debugfs_create_dir(name, sdev->ddir_bpf_bound_progs); 231 + sprintf(name, "%u", nsim_dev->prog_id_gen++); 232 + state->ddir = debugfs_create_dir(name, nsim_dev->ddir_bpf_bound_progs); 233 233 if (IS_ERR_OR_NULL(state->ddir)) { 234 234 kfree(state); 235 235 return -ENOMEM; ··· 240 240 &state->state, &nsim_bpf_string_fops); 241 241 debugfs_create_bool("loaded", 0400, state->ddir, &state->is_loaded); 242 242 243 - list_add_tail(&state->l, &sdev->bpf_bound_progs); 243 + list_add_tail(&state->l, &nsim_dev->bpf_bound_progs); 244 244 245 245 prog->aux->offload->dev_priv = state; 246 246 ··· 249 249 250 250 static int nsim_bpf_verifier_prep(struct bpf_prog *prog) 251 251 { 252 - struct netdevsim_shared_dev *sdev = 252 + struct nsim_dev *nsim_dev = 253 253 bpf_offload_dev_priv(prog->aux->offload->offdev); 254 254 255 - if (!sdev->bpf_bind_accept) 255 + if (!nsim_dev->bpf_bind_accept) 256 256 return -EOPNOTSUPP; 257 257 258 - return nsim_bpf_create_prog(sdev, prog); 258 + return nsim_bpf_create_prog(nsim_dev, prog); 259 259 } 260 260 261 261 static int nsim_bpf_translate(struct bpf_prog *prog) ··· 514 514 } 515 515 516 516 offmap->dev_ops = &nsim_bpf_map_ops; 517 - list_add_tail(&nmap->l, &ns->sdev->bpf_bound_maps); 517 + list_add_tail(&nmap->l, &ns->nsim_dev->bpf_bound_maps); 518 518 519 519 return 0; 520 520 ··· 578 578 } 579 579 } 580 580 581 - static int nsim_bpf_sdev_init(struct netdevsim_shared_dev *sdev) 581 + int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) 582 582 { 583 583 int err; 584 584 585 - INIT_LIST_HEAD(&sdev->bpf_bound_progs); 586 - INIT_LIST_HEAD(&sdev->bpf_bound_maps); 585 + INIT_LIST_HEAD(&nsim_dev->bpf_bound_progs); 586 + INIT_LIST_HEAD(&nsim_dev->bpf_bound_maps); 587 587 588 - sdev->ddir_bpf_bound_progs = 589 - debugfs_create_dir("bpf_bound_progs", sdev->ddir); 590 - if (IS_ERR_OR_NULL(sdev->ddir_bpf_bound_progs)) 588 + nsim_dev->ddir_bpf_bound_progs = debugfs_create_dir("bpf_bound_progs", 589 + nsim_dev->ddir); 590 + if (IS_ERR_OR_NULL(nsim_dev->ddir_bpf_bound_progs)) 591 591 return -ENOMEM; 592 592 593 - sdev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops, sdev); 594 - err = PTR_ERR_OR_ZERO(sdev->bpf_dev); 593 + nsim_dev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops, nsim_dev); 594 + err = PTR_ERR_OR_ZERO(nsim_dev->bpf_dev); 595 595 if (err) 596 596 return err; 597 597 598 - sdev->bpf_bind_accept = true; 599 - debugfs_create_bool("bpf_bind_accept", 0600, sdev->ddir, 600 - &sdev->bpf_bind_accept); 601 - debugfs_create_u32("bpf_bind_verifier_delay", 0600, sdev->ddir, 602 - &sdev->bpf_bind_verifier_delay); 598 + nsim_dev->bpf_bind_accept = true; 599 + debugfs_create_bool("bpf_bind_accept", 0600, nsim_dev->ddir, 600 + &nsim_dev->bpf_bind_accept); 601 + debugfs_create_u32("bpf_bind_verifier_delay", 0600, nsim_dev->ddir, 602 + &nsim_dev->bpf_bind_verifier_delay); 603 603 return 0; 604 604 } 605 605 606 - static void nsim_bpf_sdev_uninit(struct netdevsim_shared_dev *sdev) 606 + void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev) 607 607 { 608 - WARN_ON(!list_empty(&sdev->bpf_bound_progs)); 609 - WARN_ON(!list_empty(&sdev->bpf_bound_maps)); 610 - bpf_offload_dev_destroy(sdev->bpf_dev); 608 + WARN_ON(!list_empty(&nsim_dev->bpf_bound_progs)); 609 + WARN_ON(!list_empty(&nsim_dev->bpf_bound_maps)); 610 + bpf_offload_dev_destroy(nsim_dev->bpf_dev); 611 611 } 612 612 613 613 int nsim_bpf_init(struct netdevsim *ns) 614 614 { 615 615 int err; 616 616 617 - if (ns->sdev->refcnt == 1) { 618 - err = nsim_bpf_sdev_init(ns->sdev); 619 - if (err) 620 - return err; 621 - } 622 - 623 - err = bpf_offload_dev_netdev_register(ns->sdev->bpf_dev, ns->netdev); 617 + err = bpf_offload_dev_netdev_register(ns->nsim_dev->bpf_dev, 618 + ns->netdev); 624 619 if (err) 625 - goto err_bpf_sdev_uninit; 620 + return err; 626 621 627 622 debugfs_create_u32("bpf_offloaded_id", 0400, ns->ddir, 628 623 &ns->bpf_offloaded_id); ··· 639 644 &ns->bpf_map_accept); 640 645 641 646 return 0; 642 - 643 - err_bpf_sdev_uninit: 644 - if (ns->sdev->refcnt == 1) 645 - nsim_bpf_sdev_uninit(ns->sdev); 646 - return err; 647 647 } 648 648 649 649 void nsim_bpf_uninit(struct netdevsim *ns) ··· 646 656 WARN_ON(ns->xdp.prog); 647 657 WARN_ON(ns->xdp_hw.prog); 648 658 WARN_ON(ns->bpf_offloaded); 649 - bpf_offload_dev_netdev_unregister(ns->sdev->bpf_dev, ns->netdev); 650 - 651 - if (ns->sdev->refcnt == 1) 652 - nsim_bpf_sdev_uninit(ns->sdev); 659 + bpf_offload_dev_netdev_unregister(ns->nsim_dev->bpf_dev, ns->netdev); 653 660 }
+47
drivers/net/netdevsim/dev.c
··· 15 15 * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16 16 */ 17 17 18 + #include <linux/debugfs.h> 18 19 #include <linux/device.h> 19 20 #include <linux/rtnetlink.h> 20 21 #include <net/devlink.h> 21 22 22 23 #include "netdevsim.h" 24 + 25 + static struct dentry *nsim_dev_ddir; 26 + 27 + static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) 28 + { 29 + char dev_ddir_name[10]; 30 + 31 + sprintf(dev_ddir_name, "%u", nsim_dev->nsim_bus_dev->dev.id); 32 + nsim_dev->ddir = debugfs_create_dir(dev_ddir_name, nsim_dev_ddir); 33 + if (IS_ERR_OR_NULL(nsim_dev->ddir)) 34 + return PTR_ERR_OR_ZERO(nsim_dev->ddir) ?: -EINVAL; 35 + return 0; 36 + } 37 + 38 + static void nsim_dev_debugfs_exit(struct nsim_dev *nsim_dev) 39 + { 40 + debugfs_remove_recursive(nsim_dev->ddir); 41 + } 23 42 24 43 static u64 nsim_dev_ipv4_fib_resource_occ_get(void *priv) 25 44 { ··· 203 184 if (!devlink) 204 185 return ERR_PTR(-ENOMEM); 205 186 nsim_dev = devlink_priv(devlink); 187 + nsim_dev->nsim_bus_dev = nsim_bus_dev; 206 188 207 189 nsim_dev->fib_data = nsim_fib_create(); 208 190 if (IS_ERR(nsim_dev->fib_data)) { ··· 219 199 if (err) 220 200 goto err_resources_unregister; 221 201 202 + err = nsim_dev_debugfs_init(nsim_dev); 203 + if (err) 204 + goto err_dl_unregister; 205 + 206 + err = nsim_bpf_dev_init(nsim_dev); 207 + if (err) 208 + goto err_debugfs_exit; 209 + 222 210 return nsim_dev; 223 211 212 + err_debugfs_exit: 213 + nsim_dev_debugfs_exit(nsim_dev); 214 + err_dl_unregister: 215 + devlink_unregister(devlink); 224 216 err_resources_unregister: 225 217 devlink_resources_unregister(devlink, NULL); 226 218 err_fib_destroy: ··· 260 228 { 261 229 struct devlink *devlink = priv_to_devlink(nsim_dev); 262 230 231 + nsim_bpf_dev_exit(nsim_dev); 232 + nsim_dev_debugfs_exit(nsim_dev); 263 233 devlink_unregister(devlink); 264 234 devlink_resources_unregister(devlink, NULL); 265 235 nsim_fib_destroy(nsim_dev->fib_data); 266 236 devlink_free(devlink); 237 + } 238 + 239 + int nsim_dev_init(void) 240 + { 241 + nsim_dev_ddir = debugfs_create_dir(DRV_NAME "_dev", NULL); 242 + if (IS_ERR_OR_NULL(nsim_dev_ddir)) 243 + return -ENOMEM; 244 + return 0; 245 + } 246 + 247 + void nsim_dev_exit(void) 248 + { 249 + debugfs_remove_recursive(nsim_dev_ddir); 267 250 }
+13 -36
drivers/net/netdevsim/netdev.c
··· 32 32 { 33 33 struct netdevsim *ns = netdev_priv(dev); 34 34 35 - ppid->id_len = sizeof(ns->sdev->switch_id); 36 - memcpy(&ppid->id, &ns->sdev->switch_id, ppid->id_len); 35 + ppid->id_len = sizeof(ns->nsim_dev->nsim_bus_dev->dev.id); 36 + memcpy(&ppid->id, &ns->nsim_dev->nsim_bus_dev->dev.id, ppid->id_len); 37 37 return 0; 38 38 } 39 39 40 40 static int nsim_init(struct net_device *dev) 41 41 { 42 42 struct netdevsim *ns = netdev_priv(dev); 43 - char sdev_link_name[32]; 43 + char dev_link_name[32]; 44 44 int err; 45 45 46 46 ns->ddir = debugfs_create_dir(netdev_name(dev), nsim_ddir); 47 47 if (IS_ERR_OR_NULL(ns->ddir)) 48 48 return -ENOMEM; 49 49 50 - sprintf(sdev_link_name, "../../" DRV_NAME "_sdev/%u", 51 - ns->sdev->switch_id); 52 - debugfs_create_symlink("sdev", ns->ddir, sdev_link_name); 50 + sprintf(dev_link_name, "../../" DRV_NAME "_dev/%u", 51 + ns->nsim_dev->nsim_bus_dev->dev.id); 52 + debugfs_create_symlink("dev", ns->ddir, dev_link_name); 53 53 54 54 err = nsim_bpf_init(ns); 55 55 if (err) ··· 80 80 nsim_dev_destroy(ns->nsim_dev); 81 81 nsim_bus_dev_del(ns->nsim_bus_dev); 82 82 /* netdev and vf state will be freed out of device_release() */ 83 - nsim_sdev_put(ns->sdev); 84 83 } 85 84 86 85 static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev) ··· 365 366 struct netlink_ext_ack *extack) 366 367 { 367 368 struct netdevsim *ns = netdev_priv(dev); 368 - struct netdevsim *joinns = NULL; 369 369 int err; 370 370 371 - if (tb[IFLA_LINK]) { 372 - struct net_device *joindev; 373 - 374 - joindev = __dev_get_by_index(src_net, 375 - nla_get_u32(tb[IFLA_LINK])); 376 - if (!joindev) 377 - return -ENODEV; 378 - if (joindev->netdev_ops != &nsim_netdev_ops) 379 - return -EINVAL; 380 - 381 - joinns = netdev_priv(joindev); 382 - } 383 - 384 - ns->sdev = nsim_sdev_get(joinns); 385 - if (IS_ERR(ns->sdev)) 386 - return PTR_ERR(ns->sdev); 387 - 388 371 ns->nsim_bus_dev = nsim_bus_dev_new(~0, 0); 389 - if (IS_ERR(ns->nsim_bus_dev)) { 390 - err = PTR_ERR(ns->nsim_bus_dev); 391 - goto err_sdev_put; 392 - } 372 + if (IS_ERR(ns->nsim_bus_dev)) 373 + return PTR_ERR(ns->nsim_bus_dev); 393 374 394 375 SET_NETDEV_DEV(dev, &ns->nsim_bus_dev->dev); 395 376 ns->netdev = dev; ··· 389 410 nsim_dev_destroy(ns->nsim_dev); 390 411 err_dev_del: 391 412 nsim_bus_dev_del(ns->nsim_bus_dev); 392 - err_sdev_put: 393 - nsim_sdev_put(ns->sdev); 394 413 return err; 395 414 } 396 415 ··· 408 431 if (IS_ERR_OR_NULL(nsim_ddir)) 409 432 return -ENOMEM; 410 433 411 - err = nsim_sdev_init(); 434 + err = nsim_dev_init(); 412 435 if (err) 413 436 goto err_debugfs_destroy; 414 437 415 438 err = nsim_bus_init(); 416 439 if (err) 417 - goto err_sdev_exit; 440 + goto err_dev_exit; 418 441 419 442 err = rtnl_link_register(&nsim_link_ops); 420 443 if (err) ··· 424 447 425 448 err_bus_exit: 426 449 nsim_bus_exit(); 427 - err_sdev_exit: 428 - nsim_sdev_exit(); 450 + err_dev_exit: 451 + nsim_dev_exit(); 429 452 err_debugfs_destroy: 430 453 debugfs_remove_recursive(nsim_ddir); 431 454 return err; ··· 435 458 { 436 459 rtnl_link_unregister(&nsim_link_ops); 437 460 nsim_bus_exit(); 438 - nsim_sdev_exit(); 461 + nsim_dev_exit(); 439 462 debugfs_remove_recursive(nsim_ddir); 440 463 } 441 464
+22 -32
drivers/net/netdevsim/netdevsim.h
··· 26 26 27 27 #define NSIM_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg) 28 28 29 - struct bpf_prog; 30 - struct bpf_offload_dev; 31 - struct dentry; 32 - struct nsim_vf_config; 33 - struct nsim_fib_data; 34 - 35 - struct netdevsim_shared_dev { 36 - unsigned int refcnt; 37 - u32 switch_id; 38 - 39 - struct dentry *ddir; 40 - 41 - struct bpf_offload_dev *bpf_dev; 42 - 43 - bool bpf_bind_accept; 44 - u32 bpf_bind_verifier_delay; 45 - 46 - struct dentry *ddir_bpf_bound_progs; 47 - u32 prog_id_gen; 48 - 49 - struct list_head bpf_bound_progs; 50 - struct list_head bpf_bound_maps; 51 - }; 52 - 53 - struct netdevsim; 54 - 55 - struct netdevsim_shared_dev *nsim_sdev_get(struct netdevsim *joinns); 56 - void nsim_sdev_put(struct netdevsim_shared_dev *sdev); 57 - int nsim_sdev_init(void); 58 - void nsim_sdev_exit(void); 59 - 60 29 #define NSIM_IPSEC_MAX_SA_COUNT 33 61 30 #define NSIM_IPSEC_VALID BIT(31) 62 31 ··· 56 87 struct u64_stats_sync syncp; 57 88 58 89 struct nsim_bus_dev *nsim_bus_dev; 59 - struct netdevsim_shared_dev *sdev; 60 90 61 91 struct dentry *ddir; 62 92 ··· 75 107 }; 76 108 77 109 #ifdef CONFIG_BPF_SYSCALL 110 + int nsim_bpf_dev_init(struct nsim_dev *nsim_dev); 111 + void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev); 78 112 int nsim_bpf_init(struct netdevsim *ns); 79 113 void nsim_bpf_uninit(struct netdevsim *ns); 80 114 int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf); ··· 84 114 int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, 85 115 void *type_data, void *cb_priv); 86 116 #else 117 + 118 + static inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) 119 + { 120 + return 0; 121 + } 122 + 123 + static inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev) 124 + { 125 + } 87 126 static inline int nsim_bpf_init(struct netdevsim *ns) 88 127 { 89 128 return 0; ··· 131 152 }; 132 153 133 154 struct nsim_dev { 155 + struct nsim_bus_dev *nsim_bus_dev; 134 156 struct nsim_fib_data *fib_data; 157 + struct dentry *ddir; 158 + struct bpf_offload_dev *bpf_dev; 159 + bool bpf_bind_accept; 160 + u32 bpf_bind_verifier_delay; 161 + struct dentry *ddir_bpf_bound_progs; 162 + u32 prog_id_gen; 163 + struct list_head bpf_bound_progs; 164 + struct list_head bpf_bound_maps; 135 165 }; 136 166 137 167 struct nsim_dev * 138 168 nsim_dev_create_with_ns(struct nsim_bus_dev *nsim_bus_dev, 139 169 struct netdevsim *ns); 140 170 void nsim_dev_destroy(struct nsim_dev *nsim_dev); 171 + int nsim_dev_init(void); 172 + void nsim_dev_exit(void); 141 173 142 174 struct nsim_fib_data *nsim_fib_create(void); 143 175 void nsim_fib_destroy(struct nsim_fib_data *fib_data);
+4 -4
tools/testing/selftests/bpf/test_offload.py
··· 335 335 self.ns = "" 336 336 337 337 self.dfs_dir = '/sys/kernel/debug/netdevsim/%s' % (self.dev['ifname']) 338 - self.sdev_dir = self.dfs_dir + '/sdev/' 338 + self.dev_dir = self.dfs_dir + '/dev/' 339 339 self.dfs_refresh() 340 340 341 341 def __getitem__(self, key): ··· 368 368 return data.strip() 369 369 370 370 def dfs_num_bound_progs(self): 371 - path = os.path.join(self.sdev_dir, "bpf_bound_progs") 371 + path = os.path.join(self.dev_dir, "bpf_bound_progs") 372 372 _, progs = cmd('ls %s' % (path)) 373 373 return len(progs.split()) 374 374 375 375 def dfs_get_bound_progs(self, expected): 376 - progs = DebugfsDir(os.path.join(self.sdev_dir, "bpf_bound_progs")) 376 + progs = DebugfsDir(os.path.join(self.dev_dir, "bpf_bound_progs")) 377 377 if expected is not None: 378 378 if len(progs) != expected: 379 379 fail(True, "%d BPF programs bound, expected %d" % ··· 1055 1055 1056 1056 start_test("Test if netdev removal waits for translation...") 1057 1057 delay_msec = 500 1058 - sim.dfs["sdev/bpf_bind_verifier_delay"] = delay_msec 1058 + sim.dfs["dev/bpf_bind_verifier_delay"] = delay_msec 1059 1059 start = time.time() 1060 1060 cmd_line = "tc filter add dev %s ingress bpf %s da skip_sw" % \ 1061 1061 (sim['ifname'], obj)