]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
devlink: extend reload command to add support for network namespace change
authorJiri Pirko <jiri@mellanox.com>
Thu, 3 Oct 2019 09:51:15 +0000 (11:51 +0200)
committerDavid Ahern <dsahern@kernel.org>
Mon, 7 Oct 2019 22:00:49 +0000 (22:00 +0000)
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 <jiri@mellanox.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
devlink/devlink.c
man/man8/devlink-dev.8

index 852e2257cb64deabc074f75bb6cc673675ab73de..a0cd6a47d26fa09f5c7995343b82fad0c472b0fd 100644 (file)
@@ -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;
 
index 1021ee8d064cc822f44844fd0eda75853ed864fa..2c6acbd3af694403468410f847cfa8aeb2e11c0c 100644 (file)
@@ -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