aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/netdevsim/bpf.c30
-rw-r--r--drivers/net/netdevsim/netdevsim.h11
-rwxr-xr-xtools/testing/selftests/bpf/test_offload.py5
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
583int nsim_bpf_init(struct netdevsim *ns) 583int 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
620void nsim_bpf_uninit(struct netdevsim *ns) 623void 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" %