aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netdevsim/netdev.c
diff options
context:
space:
mode:
authorDavid Ahern <dsa@cumulusnetworks.com>2018-03-27 21:22:00 -0400
committerDavid S. Miller <davem@davemloft.net>2018-03-29 14:10:31 -0400
commit37923ed6b8cea94d7d76038e2f72c57a0b45daab (patch)
tree51418fe5934da050f867b26bf0ee836e14cbc38a /drivers/net/netdevsim/netdev.c
parent2233000cba40ee0784a2d5b5e2b2c38c1159a7ef (diff)
netdevsim: Add simple FIB resource controller via devlink
Add devlink support to netdevsim and use it to implement a simple, profile based resource controller. Only one controller is needed per namespace, so the first netdevsim netdevice in a namespace registers with devlink. If that device is deleted, the resource settings are deleted. The resource controller allows a user to limit the number of IPv4 and IPv6 FIB entries and FIB rules. The resource paths are: /IPv4 /IPv4/fib /IPv4/fib-rules /IPv6 /IPv6/fib /IPv6/fib-rules The IPv4 and IPv6 top level resources are unlimited in size and can not be changed. From there, the number of FIB entries and FIB rule entries are unlimited by default. A user can specify a limit for the fib and fib-rules resources: $ devlink resource set netdevsim/netdevsim0 path /IPv4/fib size 96 $ devlink resource set netdevsim/netdevsim0 path /IPv4/fib-rules size 16 $ devlink resource set netdevsim/netdevsim0 path /IPv6/fib size 64 $ devlink resource set netdevsim/netdevsim0 path /IPv6/fib-rules size 16 $ devlink dev reload netdevsim/netdevsim0 such that the number of rules or routes is limited (96 ipv4 routes in the example above): $ for n in $(seq 1 32); do ip ro add 10.99.$n.0/24 dev eth1; done Error: netdevsim: Exceeded number of supported fib entries. $ devlink resource show netdevsim/netdevsim0 netdevsim/netdevsim0: name IPv4 size unlimited unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables non resources: name fib size 96 occ 96 unit entry size_min 0 size_max unlimited size_gran 1 dpipe_tables ... With this template in place for resource management, it is fairly trivial to extend and shows one way to implement a simple counter based resource controller typical of network profiles. Currently, devlink only supports initial namespace. Code is in place to adapt netdevsim to a per namespace controller once the network namespace issues are resolved. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netdevsim/netdev.c')
-rw-r--r--drivers/net/netdevsim/netdev.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
index 3fd567928f3d..8b30ab3ea2c2 100644
--- a/drivers/net/netdevsim/netdev.c
+++ b/drivers/net/netdevsim/netdev.c
@@ -167,6 +167,8 @@ static int nsim_init(struct net_device *dev)
167 167
168 SET_NETDEV_DEV(dev, &ns->dev); 168 SET_NETDEV_DEV(dev, &ns->dev);
169 169
170 nsim_devlink_setup(ns);
171
170 return 0; 172 return 0;
171 173
172err_bpf_uninit: 174err_bpf_uninit:
@@ -180,6 +182,7 @@ static void nsim_uninit(struct net_device *dev)
180{ 182{
181 struct netdevsim *ns = netdev_priv(dev); 183 struct netdevsim *ns = netdev_priv(dev);
182 184
185 nsim_devlink_teardown(ns);
183 debugfs_remove_recursive(ns->ddir); 186 debugfs_remove_recursive(ns->ddir);
184 nsim_bpf_uninit(ns); 187 nsim_bpf_uninit(ns);
185} 188}
@@ -478,12 +481,18 @@ static int __init nsim_module_init(void)
478 if (err) 481 if (err)
479 goto err_debugfs_destroy; 482 goto err_debugfs_destroy;
480 483
481 err = rtnl_link_register(&nsim_link_ops); 484 err = nsim_devlink_init();
482 if (err) 485 if (err)
483 goto err_unreg_bus; 486 goto err_unreg_bus;
484 487
488 err = rtnl_link_register(&nsim_link_ops);
489 if (err)
490 goto err_dl_fini;
491
485 return 0; 492 return 0;
486 493
494err_dl_fini:
495 nsim_devlink_exit();
487err_unreg_bus: 496err_unreg_bus:
488 bus_unregister(&nsim_bus); 497 bus_unregister(&nsim_bus);
489err_debugfs_destroy: 498err_debugfs_destroy:
@@ -494,6 +503,7 @@ err_debugfs_destroy:
494static void __exit nsim_module_exit(void) 503static void __exit nsim_module_exit(void)
495{ 504{
496 rtnl_link_unregister(&nsim_link_ops); 505 rtnl_link_unregister(&nsim_link_ops);
506 nsim_devlink_exit();
497 bus_unregister(&nsim_bus); 507 bus_unregister(&nsim_bus);
498 debugfs_remove_recursive(nsim_ddir); 508 debugfs_remove_recursive(nsim_ddir);
499} 509}