diff options
-rw-r--r-- | drivers/net/netdevsim/bpf.c | 30 | ||||
-rw-r--r-- | drivers/net/netdevsim/netdevsim.h | 11 | ||||
-rwxr-xr-x | tools/testing/selftests/bpf/test_offload.py | 5 |
3 files changed, 27 insertions, 19 deletions
diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c index c36d2a768202..357f9e62f306 100644 --- a/drivers/net/netdevsim/bpf.c +++ b/drivers/net/netdevsim/bpf.c | |||
@@ -238,8 +238,8 @@ static int nsim_bpf_create_prog(struct netdevsim *ns, struct bpf_prog *prog) | |||
238 | state->state = "verify"; | 238 | state->state = "verify"; |
239 | 239 | ||
240 | /* Program id is not populated yet when we create the state. */ | 240 | /* Program id is not populated yet when we create the state. */ |
241 | sprintf(name, "%u", ns->prog_id_gen++); | 241 | sprintf(name, "%u", ns->sdev->prog_id_gen++); |
242 | state->ddir = debugfs_create_dir(name, ns->ddir_bpf_bound_progs); | 242 | state->ddir = debugfs_create_dir(name, ns->sdev->ddir_bpf_bound_progs); |
243 | if (IS_ERR_OR_NULL(state->ddir)) { | 243 | if (IS_ERR_OR_NULL(state->ddir)) { |
244 | kfree(state); | 244 | kfree(state); |
245 | return -ENOMEM; | 245 | return -ENOMEM; |
@@ -250,7 +250,7 @@ static int nsim_bpf_create_prog(struct netdevsim *ns, struct bpf_prog *prog) | |||
250 | &state->state, &nsim_bpf_string_fops); | 250 | &state->state, &nsim_bpf_string_fops); |
251 | debugfs_create_bool("loaded", 0400, state->ddir, &state->is_loaded); | 251 | debugfs_create_bool("loaded", 0400, state->ddir, &state->is_loaded); |
252 | 252 | ||
253 | list_add_tail(&state->l, &ns->bpf_bound_progs); | 253 | list_add_tail(&state->l, &ns->sdev->bpf_bound_progs); |
254 | 254 | ||
255 | prog->aux->offload->dev_priv = state; | 255 | prog->aux->offload->dev_priv = state; |
256 | 256 | ||
@@ -497,7 +497,7 @@ nsim_bpf_map_alloc(struct netdevsim *ns, struct bpf_offloaded_map *offmap) | |||
497 | } | 497 | } |
498 | 498 | ||
499 | offmap->dev_ops = &nsim_bpf_map_ops; | 499 | offmap->dev_ops = &nsim_bpf_map_ops; |
500 | list_add_tail(&nmap->l, &ns->bpf_bound_maps); | 500 | list_add_tail(&nmap->l, &ns->sdev->bpf_bound_maps); |
501 | 501 | ||
502 | return 0; | 502 | return 0; |
503 | 503 | ||
@@ -582,8 +582,15 @@ int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) | |||
582 | 582 | ||
583 | int nsim_bpf_init(struct netdevsim *ns) | 583 | int nsim_bpf_init(struct netdevsim *ns) |
584 | { | 584 | { |
585 | INIT_LIST_HEAD(&ns->bpf_bound_progs); | 585 | if (ns->sdev->refcnt == 1) { |
586 | INIT_LIST_HEAD(&ns->bpf_bound_maps); | 586 | INIT_LIST_HEAD(&ns->sdev->bpf_bound_progs); |
587 | INIT_LIST_HEAD(&ns->sdev->bpf_bound_maps); | ||
588 | |||
589 | ns->sdev->ddir_bpf_bound_progs = | ||
590 | debugfs_create_dir("bpf_bound_progs", ns->sdev->ddir); | ||
591 | if (IS_ERR_OR_NULL(ns->sdev->ddir_bpf_bound_progs)) | ||
592 | return -ENOMEM; | ||
593 | } | ||
587 | 594 | ||
588 | debugfs_create_u32("bpf_offloaded_id", 0400, ns->ddir, | 595 | debugfs_create_u32("bpf_offloaded_id", 0400, ns->ddir, |
589 | &ns->bpf_offloaded_id); | 596 | &ns->bpf_offloaded_id); |
@@ -593,10 +600,6 @@ int nsim_bpf_init(struct netdevsim *ns) | |||
593 | &ns->bpf_bind_accept); | 600 | &ns->bpf_bind_accept); |
594 | debugfs_create_u32("bpf_bind_verifier_delay", 0600, ns->ddir, | 601 | debugfs_create_u32("bpf_bind_verifier_delay", 0600, ns->ddir, |
595 | &ns->bpf_bind_verifier_delay); | 602 | &ns->bpf_bind_verifier_delay); |
596 | ns->ddir_bpf_bound_progs = | ||
597 | debugfs_create_dir("bpf_bound_progs", ns->ddir); | ||
598 | if (IS_ERR_OR_NULL(ns->ddir_bpf_bound_progs)) | ||
599 | return -ENOMEM; | ||
600 | 603 | ||
601 | ns->bpf_tc_accept = true; | 604 | ns->bpf_tc_accept = true; |
602 | debugfs_create_bool("bpf_tc_accept", 0600, ns->ddir, | 605 | debugfs_create_bool("bpf_tc_accept", 0600, ns->ddir, |
@@ -619,9 +622,12 @@ int nsim_bpf_init(struct netdevsim *ns) | |||
619 | 622 | ||
620 | void nsim_bpf_uninit(struct netdevsim *ns) | 623 | void nsim_bpf_uninit(struct netdevsim *ns) |
621 | { | 624 | { |
622 | WARN_ON(!list_empty(&ns->bpf_bound_progs)); | ||
623 | WARN_ON(!list_empty(&ns->bpf_bound_maps)); | ||
624 | WARN_ON(ns->xdp.prog); | 625 | WARN_ON(ns->xdp.prog); |
625 | WARN_ON(ns->xdp_hw.prog); | 626 | WARN_ON(ns->xdp_hw.prog); |
626 | WARN_ON(ns->bpf_offloaded); | 627 | WARN_ON(ns->bpf_offloaded); |
628 | |||
629 | if (ns->sdev->refcnt == 1) { | ||
630 | WARN_ON(!list_empty(&ns->sdev->bpf_bound_progs)); | ||
631 | WARN_ON(!list_empty(&ns->sdev->bpf_bound_maps)); | ||
632 | } | ||
627 | } | 633 | } |
diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index 8743ce74d2d9..98f26fa1e671 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h | |||
@@ -35,6 +35,12 @@ struct netdevsim_shared_dev { | |||
35 | u32 switch_id; | 35 | u32 switch_id; |
36 | 36 | ||
37 | struct dentry *ddir; | 37 | struct dentry *ddir; |
38 | |||
39 | struct dentry *ddir_bpf_bound_progs; | ||
40 | u32 prog_id_gen; | ||
41 | |||
42 | struct list_head bpf_bound_progs; | ||
43 | struct list_head bpf_bound_maps; | ||
38 | }; | 44 | }; |
39 | 45 | ||
40 | #define NSIM_IPSEC_MAX_SA_COUNT 33 | 46 | #define NSIM_IPSEC_MAX_SA_COUNT 33 |
@@ -79,12 +85,8 @@ struct netdevsim { | |||
79 | struct xdp_attachment_info xdp; | 85 | struct xdp_attachment_info xdp; |
80 | struct xdp_attachment_info xdp_hw; | 86 | struct xdp_attachment_info xdp_hw; |
81 | 87 | ||
82 | u32 prog_id_gen; | ||
83 | |||
84 | bool bpf_bind_accept; | 88 | bool bpf_bind_accept; |
85 | u32 bpf_bind_verifier_delay; | 89 | u32 bpf_bind_verifier_delay; |
86 | struct dentry *ddir_bpf_bound_progs; | ||
87 | struct list_head bpf_bound_progs; | ||
88 | 90 | ||
89 | bool bpf_tc_accept; | 91 | bool bpf_tc_accept; |
90 | bool bpf_tc_non_bound_accept; | 92 | bool bpf_tc_non_bound_accept; |
@@ -92,7 +94,6 @@ struct netdevsim { | |||
92 | bool bpf_xdpoffload_accept; | 94 | bool bpf_xdpoffload_accept; |
93 | 95 | ||
94 | bool bpf_map_accept; | 96 | bool bpf_map_accept; |
95 | struct list_head bpf_bound_maps; | ||
96 | #if IS_ENABLED(CONFIG_NET_DEVLINK) | 97 | #if IS_ENABLED(CONFIG_NET_DEVLINK) |
97 | struct devlink *devlink; | 98 | struct devlink *devlink; |
98 | #endif | 99 | #endif |
diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py index b746227eaff2..ee1abef384ea 100755 --- a/tools/testing/selftests/bpf/test_offload.py +++ b/tools/testing/selftests/bpf/test_offload.py | |||
@@ -314,6 +314,7 @@ class NetdevSim: | |||
314 | self.ns = "" | 314 | self.ns = "" |
315 | 315 | ||
316 | self.dfs_dir = '/sys/kernel/debug/netdevsim/%s' % (self.dev['ifname']) | 316 | self.dfs_dir = '/sys/kernel/debug/netdevsim/%s' % (self.dev['ifname']) |
317 | self.sdev_dir = self.dfs_dir + '/sdev/' | ||
317 | self.dfs_refresh() | 318 | self.dfs_refresh() |
318 | 319 | ||
319 | def __getitem__(self, key): | 320 | def __getitem__(self, key): |
@@ -345,12 +346,12 @@ class NetdevSim: | |||
345 | return data.strip() | 346 | return data.strip() |
346 | 347 | ||
347 | def dfs_num_bound_progs(self): | 348 | def dfs_num_bound_progs(self): |
348 | path = os.path.join(self.dfs_dir, "bpf_bound_progs") | 349 | path = os.path.join(self.sdev_dir, "bpf_bound_progs") |
349 | _, progs = cmd('ls %s' % (path)) | 350 | _, progs = cmd('ls %s' % (path)) |
350 | return len(progs.split()) | 351 | return len(progs.split()) |
351 | 352 | ||
352 | def dfs_get_bound_progs(self, expected): | 353 | def dfs_get_bound_progs(self, expected): |
353 | progs = DebugfsDir(os.path.join(self.dfs_dir, "bpf_bound_progs")) | 354 | progs = DebugfsDir(os.path.join(self.sdev_dir, "bpf_bound_progs")) |
354 | if expected is not None: | 355 | if expected is not None: |
355 | if len(progs) != expected: | 356 | if len(progs) != expected: |
356 | fail(True, "%d BPF programs bound, expected %d" % | 357 | fail(True, "%d BPF programs bound, expected %d" % |