From 08e8e1ca3e0575bfe5ae15a7549b382ede65af35 Mon Sep 17 00:00:00 2001 From: Jiri Pirko Date: Thu, 3 Oct 2019 11:51:15 +0200 Subject: [PATCH] devlink: extend reload command to add support for network namespace change Extend existing devlink reload command by adding option "netns" by which user can instruct kernel to reload the devlink instance into specified network namespace. Example: $ ip netns add testns1 $ devlink dev reload netdevsim/netdevsim10 netns testns1 Signed-off-by: Jiri Pirko Signed-off-by: David Ahern --- devlink/devlink.c | 31 +++++++++++++++++++++++++++---- man/man8/devlink-dev.8 | 7 +++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/devlink/devlink.c b/devlink/devlink.c index 852e2257..a0cd6a47 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -261,6 +261,7 @@ static void ifname_map_free(struct ifname_map *ifname_map) #define DL_OPT_TRAP_NAME BIT(30) #define DL_OPT_TRAP_ACTION BIT(31) #define DL_OPT_TRAP_GROUP_NAME BIT(32) +#define DL_OPT_NETNS BIT(33) struct dl_opts { uint64_t present; /* flags of present items */ @@ -300,6 +301,8 @@ struct dl_opts { const char *trap_name; const char *trap_group_name; enum devlink_trap_action trap_action; + bool netns_is_pid; + uint32_t netns; }; struct dl { @@ -1440,6 +1443,22 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required, if (err) return err; o_found |= DL_OPT_TRAP_ACTION; + } else if (dl_argv_match(dl, "netns") && + (o_all & DL_OPT_NETNS)) { + const char *netns_str; + + dl_arg_inc(dl); + err = dl_argv_str(dl, &netns_str); + if (err) + return err; + opts->netns = netns_get_fd(netns_str); + if (opts->netns < 0) { + err = dl_argv_uint32_t(dl, &opts->netns); + if (err) + return err; + opts->netns_is_pid = true; + } + o_found |= DL_OPT_NETNS; } else { pr_err("Unknown option \"%s\"\n", dl_argv(dl)); return -EINVAL; @@ -1562,7 +1581,11 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl) if (opts->present & DL_OPT_TRAP_ACTION) mnl_attr_put_u8(nlh, DEVLINK_ATTR_TRAP_ACTION, opts->trap_action); - + if (opts->present & DL_OPT_NETNS) + mnl_attr_put_u32(nlh, + opts->netns_is_pid ? DEVLINK_ATTR_NETNS_PID : + DEVLINK_ATTR_NETNS_FD, + opts->netns); } static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl, @@ -1623,7 +1646,7 @@ static void cmd_dev_help(void) pr_err(" devlink dev eswitch show DEV\n"); pr_err(" devlink dev param set DEV name PARAMETER value VALUE cmode { permanent | driverinit | runtime }\n"); pr_err(" devlink dev param show [DEV name PARAMETER]\n"); - pr_err(" devlink dev reload DEV\n"); + pr_err(" devlink dev reload DEV [ netns { PID | NAME | ID } ]\n"); pr_err(" devlink dev info [ DEV ]\n"); pr_err(" devlink dev flash DEV file PATH [ component NAME ]\n"); } @@ -2724,7 +2747,7 @@ static int cmd_dev_show(struct dl *dl) static void cmd_dev_reload_help(void) { - pr_err("Usage: devlink dev reload [ DEV ]\n"); + pr_err("Usage: devlink dev reload DEV [ netns { PID | NAME | ID } ]\n"); } static int cmd_dev_reload(struct dl *dl) @@ -2740,7 +2763,7 @@ static int cmd_dev_reload(struct dl *dl) nlh = mnlg_msg_prepare(dl->nlg, DEVLINK_CMD_RELOAD, NLM_F_REQUEST | NLM_F_ACK); - err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, 0); + err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE, DL_OPT_NETNS); if (err) return err; diff --git a/man/man8/devlink-dev.8 b/man/man8/devlink-dev.8 index 1021ee8d..2c6acbd3 100644 --- a/man/man8/devlink-dev.8 +++ b/man/man8/devlink-dev.8 @@ -62,6 +62,9 @@ devlink-dev \- devlink device configuration .ti -8 .BR "devlink dev reload" .IR DEV +.RI "[ " +.BI "netns { " PID " | " NAME " | " ID " } +.RI "]" .ti -8 .BR "devlink dev info" @@ -167,6 +170,10 @@ If this argument is omitted all parameters supported by devlink devices are list .I "DEV" - Specifies the devlink device to reload. +.BR netns +.BI { " PID " | " NAME " | " ID " } +- Specifies the network namespace to reload into, either by pid, name or id. + .SS devlink dev info - display device information. Display device information provided by the driver. This command can be used to query versions of the hardware components or device components which