From 5fc494225c1eb81309cc4c91f183cd30e4edb674 Mon Sep 17 00:00:00 2001 From: Jiri Pirko Date: Thu, 25 Apr 2019 15:59:42 +0200 Subject: netdevsim: create devlink instance per netdevsim instance Currently there is one devlink instance created per network namespace. That is quite odd considering the fact that devlink instance should represent an ASIC. The following patches are going to move the devlink instance even more down to a bus device, but until then, have one devlink instance per netdevsim instance. Struct nsim_devlink is introduced to hold fib setting. The changes in the fib code are only related to holding the configuration per devlink instance instead of network namespace. Signed-off-by: Jiri Pirko Signed-off-by: David S. Miller --- drivers/net/netdevsim/devlink.c | 179 ++++++++++++++-------------------------- 1 file changed, 64 insertions(+), 115 deletions(-) (limited to 'drivers/net/netdevsim/devlink.c') diff --git a/drivers/net/netdevsim/devlink.c b/drivers/net/netdevsim/devlink.c index 5135fc371f01..f718912fa52d 100644 --- a/drivers/net/netdevsim/devlink.c +++ b/drivers/net/netdevsim/devlink.c @@ -15,59 +15,59 @@ */ #include +#include #include -#include #include "netdevsim.h" -static unsigned int nsim_devlink_id; - -/* place holder until devlink and namespaces is sorted out */ -static struct net *nsim_devlink_net(struct devlink *devlink) -{ - return &init_net; -} +struct nsim_devlink { + struct nsim_fib_data *fib_data; +}; /* IPv4 */ static u64 nsim_ipv4_fib_resource_occ_get(void *priv) { - struct net *net = priv; + struct nsim_devlink *nsim_devlink = priv; - return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, false); + return nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV4_FIB, false); } static u64 nsim_ipv4_fib_rules_res_occ_get(void *priv) { - struct net *net = priv; + struct nsim_devlink *nsim_devlink = priv; - return nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, false); + return nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV4_FIB_RULES, false); } /* IPv6 */ static u64 nsim_ipv6_fib_resource_occ_get(void *priv) { - struct net *net = priv; + struct nsim_devlink *nsim_devlink = priv; - return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, false); + return nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV6_FIB, false); } static u64 nsim_ipv6_fib_rules_res_occ_get(void *priv) { - struct net *net = priv; + struct nsim_devlink *nsim_devlink = priv; - return nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, false); + return nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV6_FIB_RULES, false); } static int devlink_resources_register(struct devlink *devlink) { + struct nsim_devlink *nsim_devlink = devlink_priv(devlink); struct devlink_resource_size_params params = { .size_max = (u64)-1, .size_granularity = 1, .unit = DEVLINK_RESOURCE_UNIT_ENTRY }; - struct net *net = nsim_devlink_net(devlink); int err; u64 n; @@ -81,7 +81,8 @@ static int devlink_resources_register(struct devlink *devlink) goto out; } - n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB, true); + n = nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV4_FIB, true); err = devlink_resource_register(devlink, "fib", n, NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4, ¶ms); @@ -90,7 +91,8 @@ static int devlink_resources_register(struct devlink *devlink) return err; } - n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV4_FIB_RULES, true); + n = nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV4_FIB_RULES, true); err = devlink_resource_register(devlink, "fib-rules", n, NSIM_RESOURCE_IPV4_FIB_RULES, NSIM_RESOURCE_IPV4, ¶ms); @@ -109,7 +111,8 @@ static int devlink_resources_register(struct devlink *devlink) goto out; } - n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB, true); + n = nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV6_FIB, true); err = devlink_resource_register(devlink, "fib", n, NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6, ¶ms); @@ -118,7 +121,8 @@ static int devlink_resources_register(struct devlink *devlink) return err; } - n = nsim_fib_get_val(net, NSIM_RESOURCE_IPV6_FIB_RULES, true); + n = nsim_fib_get_val(nsim_devlink->fib_data, + NSIM_RESOURCE_IPV6_FIB_RULES, true); err = devlink_resource_register(devlink, "fib-rules", n, NSIM_RESOURCE_IPV6_FIB_RULES, NSIM_RESOURCE_IPV6, ¶ms); @@ -130,19 +134,19 @@ static int devlink_resources_register(struct devlink *devlink) devlink_resource_occ_get_register(devlink, NSIM_RESOURCE_IPV4_FIB, nsim_ipv4_fib_resource_occ_get, - net); + nsim_devlink); devlink_resource_occ_get_register(devlink, NSIM_RESOURCE_IPV4_FIB_RULES, nsim_ipv4_fib_rules_res_occ_get, - net); + nsim_devlink); devlink_resource_occ_get_register(devlink, NSIM_RESOURCE_IPV6_FIB, nsim_ipv6_fib_resource_occ_get, - net); + nsim_devlink); devlink_resource_occ_get_register(devlink, NSIM_RESOURCE_IPV6_FIB_RULES, nsim_ipv6_fib_rules_res_occ_get, - net); + nsim_devlink); out: return err; } @@ -150,11 +154,11 @@ out: static int nsim_devlink_reload(struct devlink *devlink, struct netlink_ext_ack *extack) { + struct nsim_devlink *nsim_devlink = devlink_priv(devlink); enum nsim_resource_id res_ids[] = { NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB_RULES }; - struct net *net = nsim_devlink_net(devlink); int i; for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { @@ -163,7 +167,8 @@ static int nsim_devlink_reload(struct devlink *devlink, err = devlink_resource_size_get(devlink, res_ids[i], &val); if (!err) { - err = nsim_fib_set_max(net, res_ids[i], val, extack); + err = nsim_fib_set_max(nsim_devlink->fib_data, + res_ids[i], val, extack); if (err) return err; } @@ -172,124 +177,68 @@ static int nsim_devlink_reload(struct devlink *devlink, return 0; } -static void nsim_devlink_net_reset(struct net *net) -{ - enum nsim_resource_id res_ids[] = { - NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, - NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB_RULES - }; - int i; - - for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { - if (nsim_fib_set_max(net, res_ids[i], (u64)-1, NULL)) { - pr_err("Failed to reset limit for resource %u\n", - res_ids[i]); - } - } -} - static const struct devlink_ops nsim_devlink_ops = { .reload = nsim_devlink_reload, }; -/* once devlink / namespace issues are sorted out - * this needs to be net in which a devlink instance - * is to be created. e.g., dev_net(ns->netdev) - */ -static struct net *nsim_to_net(struct netdevsim *ns) +static int __nsim_devlink_init(struct netdevsim *ns) { - return &init_net; -} - -void nsim_devlink_teardown(struct netdevsim *ns) -{ - if (ns->devlink) { - struct net *net = nsim_to_net(ns); - bool *reg_devlink = net_generic(net, nsim_devlink_id); - - devlink_resources_unregister(ns->devlink, NULL); - devlink_unregister(ns->devlink); - devlink_free(ns->devlink); - ns->devlink = NULL; - - nsim_devlink_net_reset(net); - *reg_devlink = true; - } -} - -int nsim_devlink_setup(struct netdevsim *ns) -{ - struct net *net = nsim_to_net(ns); - bool *reg_devlink = net_generic(net, nsim_devlink_id); + struct nsim_devlink *nsim_devlink; struct devlink *devlink; int err; - /* only one device per namespace controls devlink */ - if (!*reg_devlink) { - ns->devlink = NULL; - return 0; - } - - devlink = devlink_alloc(&nsim_devlink_ops, 0); + devlink = devlink_alloc(&nsim_devlink_ops, sizeof(*nsim_devlink)); if (!devlink) return -ENOMEM; + nsim_devlink = devlink_priv(devlink); - err = devlink_register(devlink, &ns->dev); - if (err) + nsim_devlink->fib_data = nsim_fib_create(); + if (IS_ERR(nsim_devlink->fib_data)) { + err = PTR_ERR(nsim_devlink->fib_data); goto err_devlink_free; + } err = devlink_resources_register(devlink); if (err) - goto err_dl_unregister; + goto err_fib_destroy; - ns->devlink = devlink; + err = devlink_register(devlink, &ns->dev); + if (err) + goto err_resources_unregister; - *reg_devlink = false; + ns->devlink = devlink; return 0; -err_dl_unregister: - devlink_unregister(devlink); +err_resources_unregister: + devlink_resources_unregister(devlink, NULL); +err_fib_destroy: + nsim_fib_destroy(nsim_devlink->fib_data); err_devlink_free: devlink_free(devlink); return err; } -/* Initialize per network namespace state */ -static int __net_init nsim_devlink_netns_init(struct net *net) +int nsim_devlink_init(struct netdevsim *ns) { - bool *reg_devlink = net_generic(net, nsim_devlink_id); - - *reg_devlink = true; - - return 0; -} - -static struct pernet_operations nsim_devlink_net_ops = { - .init = nsim_devlink_netns_init, - .id = &nsim_devlink_id, - .size = sizeof(bool), -}; + int err; -void nsim_devlink_exit(void) -{ - unregister_pernet_subsys(&nsim_devlink_net_ops); - nsim_fib_exit(); + dev_hold(ns->netdev); + rtnl_unlock(); + err = __nsim_devlink_init(ns); + rtnl_lock(); + dev_put(ns->netdev); + return err; } -int nsim_devlink_init(void) +void nsim_devlink_exit(struct netdevsim *ns) { - int err; + struct devlink *devlink = ns->devlink; + struct nsim_devlink *nsim_devlink = devlink_priv(devlink); - err = nsim_fib_init(); - if (err) - goto err_out; - - err = register_pernet_subsys(&nsim_devlink_net_ops); - if (err) - nsim_fib_exit(); - -err_out: - return err; + devlink_unregister(devlink); + devlink_resources_unregister(devlink, NULL); + nsim_fib_destroy(nsim_devlink->fib_data); + devlink_free(devlink); } -- cgit v1.2.3 From 8fb4bc6fd5bd5bab9a34581e45b00d9a041d1d71 Mon Sep 17 00:00:00 2001 From: Jiri Pirko Date: Thu, 25 Apr 2019 15:59:43 +0200 Subject: netdevsim: rename devlink.c to dev.c to contain per-dev(asic) items The existing devlink.c code is going to be extended to represent asic device on a bus. As this is about more than just devlink, rename the file. Do appropriate prefix renaming alongside with that. Signed-off-by: Jiri Pirko Signed-off-by: David S. Miller --- drivers/net/netdevsim/Makefile | 2 +- drivers/net/netdevsim/dev.c | 241 +++++++++++++++++++++++++++++++++++++ drivers/net/netdevsim/devlink.c | 244 -------------------------------------- drivers/net/netdevsim/netdev.c | 10 +- drivers/net/netdevsim/netdevsim.h | 4 +- 5 files changed, 249 insertions(+), 252 deletions(-) create mode 100644 drivers/net/netdevsim/dev.c delete mode 100644 drivers/net/netdevsim/devlink.c (limited to 'drivers/net/netdevsim/devlink.c') diff --git a/drivers/net/netdevsim/Makefile b/drivers/net/netdevsim/Makefile index cdf8611d2811..a72dec8e179c 100644 --- a/drivers/net/netdevsim/Makefile +++ b/drivers/net/netdevsim/Makefile @@ -3,7 +3,7 @@ obj-$(CONFIG_NETDEVSIM) += netdevsim.o netdevsim-objs := \ - netdev.o devlink.o fib.o sdev.o \ + netdev.o dev.o fib.o sdev.o ifeq ($(CONFIG_BPF_SYSCALL),y) netdevsim-objs += \ diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c new file mode 100644 index 000000000000..c87f0abfaff7 --- /dev/null +++ b/drivers/net/netdevsim/dev.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2018 Cumulus Networks. All rights reserved. + * Copyright (c) 2018 David Ahern + * Copyright (c) 2019 Mellanox Technologies. All rights reserved. + * + * This software is licensed under the GNU General License Version 2, + * June 1991 as shown in the file COPYING in the top-level directory of this + * source tree. + * + * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE + * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME + * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + */ + +#include +#include +#include + +#include "netdevsim.h" + +struct nsim_dev { + struct nsim_fib_data *fib_data; +}; + +static u64 nsim_dev_ipv4_fib_resource_occ_get(void *priv) +{ + struct nsim_dev *nsim_dev = priv; + + return nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV4_FIB, false); +} + +static u64 nsim_dev_ipv4_fib_rules_res_occ_get(void *priv) +{ + struct nsim_dev *nsim_dev = priv; + + return nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV4_FIB_RULES, false); +} + +static u64 nsim_dev_ipv6_fib_resource_occ_get(void *priv) +{ + struct nsim_dev *nsim_dev = priv; + + return nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV6_FIB, false); +} + +static u64 nsim_dev_ipv6_fib_rules_res_occ_get(void *priv) +{ + struct nsim_dev *nsim_dev = priv; + + return nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV6_FIB_RULES, false); +} + +static int nsim_dev_resources_register(struct devlink *devlink) +{ + struct nsim_dev *nsim_dev = devlink_priv(devlink); + struct devlink_resource_size_params params = { + .size_max = (u64)-1, + .size_granularity = 1, + .unit = DEVLINK_RESOURCE_UNIT_ENTRY + }; + int err; + u64 n; + + /* Resources for IPv4 */ + err = devlink_resource_register(devlink, "IPv4", (u64)-1, + NSIM_RESOURCE_IPV4, + DEVLINK_RESOURCE_ID_PARENT_TOP, + ¶ms); + if (err) { + pr_err("Failed to register IPv4 top resource\n"); + goto out; + } + + n = nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV4_FIB, true); + err = devlink_resource_register(devlink, "fib", n, + NSIM_RESOURCE_IPV4_FIB, + NSIM_RESOURCE_IPV4, ¶ms); + if (err) { + pr_err("Failed to register IPv4 FIB resource\n"); + return err; + } + + n = nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV4_FIB_RULES, true); + err = devlink_resource_register(devlink, "fib-rules", n, + NSIM_RESOURCE_IPV4_FIB_RULES, + NSIM_RESOURCE_IPV4, ¶ms); + if (err) { + pr_err("Failed to register IPv4 FIB rules resource\n"); + return err; + } + + /* Resources for IPv6 */ + err = devlink_resource_register(devlink, "IPv6", (u64)-1, + NSIM_RESOURCE_IPV6, + DEVLINK_RESOURCE_ID_PARENT_TOP, + ¶ms); + if (err) { + pr_err("Failed to register IPv6 top resource\n"); + goto out; + } + + n = nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV6_FIB, true); + err = devlink_resource_register(devlink, "fib", n, + NSIM_RESOURCE_IPV6_FIB, + NSIM_RESOURCE_IPV6, ¶ms); + if (err) { + pr_err("Failed to register IPv6 FIB resource\n"); + return err; + } + + n = nsim_fib_get_val(nsim_dev->fib_data, + NSIM_RESOURCE_IPV6_FIB_RULES, true); + err = devlink_resource_register(devlink, "fib-rules", n, + NSIM_RESOURCE_IPV6_FIB_RULES, + NSIM_RESOURCE_IPV6, ¶ms); + if (err) { + pr_err("Failed to register IPv6 FIB rules resource\n"); + return err; + } + + devlink_resource_occ_get_register(devlink, + NSIM_RESOURCE_IPV4_FIB, + nsim_dev_ipv4_fib_resource_occ_get, + nsim_dev); + devlink_resource_occ_get_register(devlink, + NSIM_RESOURCE_IPV4_FIB_RULES, + nsim_dev_ipv4_fib_rules_res_occ_get, + nsim_dev); + devlink_resource_occ_get_register(devlink, + NSIM_RESOURCE_IPV6_FIB, + nsim_dev_ipv6_fib_resource_occ_get, + nsim_dev); + devlink_resource_occ_get_register(devlink, + NSIM_RESOURCE_IPV6_FIB_RULES, + nsim_dev_ipv6_fib_rules_res_occ_get, + nsim_dev); +out: + return err; +} + +static int nsim_dev_reload(struct devlink *devlink, + struct netlink_ext_ack *extack) +{ + struct nsim_dev *nsim_dev = devlink_priv(devlink); + enum nsim_resource_id res_ids[] = { + NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, + NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB_RULES + }; + int i; + + for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { + int err; + u64 val; + + err = devlink_resource_size_get(devlink, res_ids[i], &val); + if (!err) { + err = nsim_fib_set_max(nsim_dev->fib_data, + res_ids[i], val, extack); + if (err) + return err; + } + } + + return 0; +} + +static const struct devlink_ops nsim_dev_devlink_ops = { + .reload = nsim_dev_reload, +}; + +static int __nsim_dev_init(struct netdevsim *ns) +{ + struct nsim_dev *nsim_dev; + struct devlink *devlink; + int err; + + devlink = devlink_alloc(&nsim_dev_devlink_ops, sizeof(*nsim_dev)); + if (!devlink) + return -ENOMEM; + nsim_dev = devlink_priv(devlink); + + nsim_dev->fib_data = nsim_fib_create(); + if (IS_ERR(nsim_dev->fib_data)) { + err = PTR_ERR(nsim_dev->fib_data); + goto err_devlink_free; + } + + err = nsim_dev_resources_register(devlink); + if (err) + goto err_fib_destroy; + + err = devlink_register(devlink, &ns->dev); + if (err) + goto err_resources_unregister; + + ns->devlink = devlink; + + return 0; + +err_resources_unregister: + devlink_resources_unregister(devlink, NULL); +err_fib_destroy: + nsim_fib_destroy(nsim_dev->fib_data); +err_devlink_free: + devlink_free(devlink); + + return err; +} + +int nsim_dev_init(struct netdevsim *ns) +{ + int err; + + dev_hold(ns->netdev); + rtnl_unlock(); + err = __nsim_dev_init(ns); + rtnl_lock(); + dev_put(ns->netdev); + return err; +} + +void nsim_dev_exit(struct netdevsim *ns) +{ + struct devlink *devlink = ns->devlink; + struct nsim_dev *nsim_dev = devlink_priv(devlink); + + devlink_unregister(devlink); + devlink_resources_unregister(devlink, NULL); + nsim_fib_destroy(nsim_dev->fib_data); + devlink_free(devlink); +} diff --git a/drivers/net/netdevsim/devlink.c b/drivers/net/netdevsim/devlink.c deleted file mode 100644 index f718912fa52d..000000000000 --- a/drivers/net/netdevsim/devlink.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2018 Cumulus Networks. All rights reserved. - * Copyright (c) 2018 David Ahern - * - * This software is licensed under the GNU General License Version 2, - * June 1991 as shown in the file COPYING in the top-level directory of this - * source tree. - * - * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" - * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME - * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - */ - -#include -#include -#include - -#include "netdevsim.h" - -struct nsim_devlink { - struct nsim_fib_data *fib_data; -}; - -/* IPv4 - */ -static u64 nsim_ipv4_fib_resource_occ_get(void *priv) -{ - struct nsim_devlink *nsim_devlink = priv; - - return nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV4_FIB, false); -} - -static u64 nsim_ipv4_fib_rules_res_occ_get(void *priv) -{ - struct nsim_devlink *nsim_devlink = priv; - - return nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV4_FIB_RULES, false); -} - -/* IPv6 - */ -static u64 nsim_ipv6_fib_resource_occ_get(void *priv) -{ - struct nsim_devlink *nsim_devlink = priv; - - return nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV6_FIB, false); -} - -static u64 nsim_ipv6_fib_rules_res_occ_get(void *priv) -{ - struct nsim_devlink *nsim_devlink = priv; - - return nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV6_FIB_RULES, false); -} - -static int devlink_resources_register(struct devlink *devlink) -{ - struct nsim_devlink *nsim_devlink = devlink_priv(devlink); - struct devlink_resource_size_params params = { - .size_max = (u64)-1, - .size_granularity = 1, - .unit = DEVLINK_RESOURCE_UNIT_ENTRY - }; - int err; - u64 n; - - /* Resources for IPv4 */ - err = devlink_resource_register(devlink, "IPv4", (u64)-1, - NSIM_RESOURCE_IPV4, - DEVLINK_RESOURCE_ID_PARENT_TOP, - ¶ms); - if (err) { - pr_err("Failed to register IPv4 top resource\n"); - goto out; - } - - n = nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV4_FIB, true); - err = devlink_resource_register(devlink, "fib", n, - NSIM_RESOURCE_IPV4_FIB, - NSIM_RESOURCE_IPV4, ¶ms); - if (err) { - pr_err("Failed to register IPv4 FIB resource\n"); - return err; - } - - n = nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV4_FIB_RULES, true); - err = devlink_resource_register(devlink, "fib-rules", n, - NSIM_RESOURCE_IPV4_FIB_RULES, - NSIM_RESOURCE_IPV4, ¶ms); - if (err) { - pr_err("Failed to register IPv4 FIB rules resource\n"); - return err; - } - - /* Resources for IPv6 */ - err = devlink_resource_register(devlink, "IPv6", (u64)-1, - NSIM_RESOURCE_IPV6, - DEVLINK_RESOURCE_ID_PARENT_TOP, - ¶ms); - if (err) { - pr_err("Failed to register IPv6 top resource\n"); - goto out; - } - - n = nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV6_FIB, true); - err = devlink_resource_register(devlink, "fib", n, - NSIM_RESOURCE_IPV6_FIB, - NSIM_RESOURCE_IPV6, ¶ms); - if (err) { - pr_err("Failed to register IPv6 FIB resource\n"); - return err; - } - - n = nsim_fib_get_val(nsim_devlink->fib_data, - NSIM_RESOURCE_IPV6_FIB_RULES, true); - err = devlink_resource_register(devlink, "fib-rules", n, - NSIM_RESOURCE_IPV6_FIB_RULES, - NSIM_RESOURCE_IPV6, ¶ms); - if (err) { - pr_err("Failed to register IPv6 FIB rules resource\n"); - return err; - } - - devlink_resource_occ_get_register(devlink, - NSIM_RESOURCE_IPV4_FIB, - nsim_ipv4_fib_resource_occ_get, - nsim_devlink); - devlink_resource_occ_get_register(devlink, - NSIM_RESOURCE_IPV4_FIB_RULES, - nsim_ipv4_fib_rules_res_occ_get, - nsim_devlink); - devlink_resource_occ_get_register(devlink, - NSIM_RESOURCE_IPV6_FIB, - nsim_ipv6_fib_resource_occ_get, - nsim_devlink); - devlink_resource_occ_get_register(devlink, - NSIM_RESOURCE_IPV6_FIB_RULES, - nsim_ipv6_fib_rules_res_occ_get, - nsim_devlink); -out: - return err; -} - -static int nsim_devlink_reload(struct devlink *devlink, - struct netlink_ext_ack *extack) -{ - struct nsim_devlink *nsim_devlink = devlink_priv(devlink); - enum nsim_resource_id res_ids[] = { - NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES, - NSIM_RESOURCE_IPV6_FIB, NSIM_RESOURCE_IPV6_FIB_RULES - }; - int i; - - for (i = 0; i < ARRAY_SIZE(res_ids); ++i) { - int err; - u64 val; - - err = devlink_resource_size_get(devlink, res_ids[i], &val); - if (!err) { - err = nsim_fib_set_max(nsim_devlink->fib_data, - res_ids[i], val, extack); - if (err) - return err; - } - } - - return 0; -} - -static const struct devlink_ops nsim_devlink_ops = { - .reload = nsim_devlink_reload, -}; - -static int __nsim_devlink_init(struct netdevsim *ns) -{ - struct nsim_devlink *nsim_devlink; - struct devlink *devlink; - int err; - - devlink = devlink_alloc(&nsim_devlink_ops, sizeof(*nsim_devlink)); - if (!devlink) - return -ENOMEM; - nsim_devlink = devlink_priv(devlink); - - nsim_devlink->fib_data = nsim_fib_create(); - if (IS_ERR(nsim_devlink->fib_data)) { - err = PTR_ERR(nsim_devlink->fib_data); - goto err_devlink_free; - } - - err = devlink_resources_register(devlink); - if (err) - goto err_fib_destroy; - - err = devlink_register(devlink, &ns->dev); - if (err) - goto err_resources_unregister; - - ns->devlink = devlink; - - return 0; - -err_resources_unregister: - devlink_resources_unregister(devlink, NULL); -err_fib_destroy: - nsim_fib_destroy(nsim_devlink->fib_data); -err_devlink_free: - devlink_free(devlink); - - return err; -} - -int nsim_devlink_init(struct netdevsim *ns) -{ - int err; - - dev_hold(ns->netdev); - rtnl_unlock(); - err = __nsim_devlink_init(ns); - rtnl_lock(); - dev_put(ns->netdev); - return err; -} - -void nsim_devlink_exit(struct netdevsim *ns) -{ - struct devlink *devlink = ns->devlink; - struct nsim_devlink *nsim_devlink = devlink_priv(devlink); - - devlink_unregister(devlink); - devlink_resources_unregister(devlink, NULL); - nsim_fib_destroy(nsim_devlink->fib_data); - devlink_free(devlink); -} diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 04aa084dc34c..31fc6564d181 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -195,7 +195,7 @@ static void nsim_free(struct net_device *dev) { struct netdevsim *ns = netdev_priv(dev); - nsim_devlink_exit(ns); + nsim_dev_exit(ns); device_unregister(&ns->dev); /* netdev and vf state will be freed out of device_release() */ nsim_sdev_put(ns->sdev); @@ -506,17 +506,17 @@ static int nsim_newlink(struct net *src_net, struct net_device *dev, SET_NETDEV_DEV(dev, &ns->dev); ns->netdev = dev; - err = nsim_devlink_init(ns); + err = nsim_dev_init(ns); if (err) goto err_unreg_dev; err = register_netdevice(dev); if (err) - goto err_devlink_exit; + goto err_dev_exit; return 0; -err_devlink_exit: - nsim_devlink_exit(ns); +err_dev_exit: + nsim_dev_exit(ns); err_unreg_dev: device_unregister(&ns->dev); err_sdev_put: diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index df50eb19715d..23d19b461873 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -154,8 +154,8 @@ enum nsim_resource_id { NSIM_RESOURCE_IPV6_FIB_RULES, }; -int nsim_devlink_init(struct netdevsim *ns); -void nsim_devlink_exit(struct netdevsim *ns); +int nsim_dev_init(struct netdevsim *ns); +void nsim_dev_exit(struct netdevsim *ns); struct nsim_fib_data *nsim_fib_create(void); void nsim_fib_destroy(struct nsim_fib_data *fib_data); -- cgit v1.2.3