Linux RDMA and InfiniBand development
 help / color / mirror / Atom feed
* [PATCH iproute2-next v2 0/4] Allow rdma dev netns to take a pid
@ 2026-05-12 19:34 David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 1/4] namespace: Add fallback to netns by pid David Ahern
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: David Ahern @ 2026-05-12 19:34 UTC (permalink / raw)
  To: stephen; +Cc: netdev, leonro, linux-rdma, David Ahern

From: David Ahern <dahern@nvidia.com>

Avoid the extra hurdle of creating an entry in /var/run/netns
and allow the netns argument to be a name or a pid.

v2
- update netns_get_fd to handle the pid fallback
- update devlink code

David Ahern (4):
  namespace: Add fallback to netns by pid
  iplink: Drop pid fallback code for netns
  rdma: Allow netns to be specified by pid
  devlink: Drop now duplicate pid fallback for netns

 devlink/devlink.c   | 25 +++++++------------------
 ip/iplink.c         | 10 +---------
 lib/namespace.c     | 28 +++++++++++++++++++++-------
 man/man8/rdma-dev.8 |  3 ++-
 rdma/dev.c          | 11 ++++-------
 5 files changed, 35 insertions(+), 42 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH iproute2-next v2 1/4] namespace: Add fallback to netns by pid
  2026-05-12 19:34 [PATCH iproute2-next v2 0/4] Allow rdma dev netns to take a pid David Ahern
@ 2026-05-12 19:34 ` David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 2/4] iplink: Drop pid fallback code for netns David Ahern
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: David Ahern @ 2026-05-12 19:34 UTC (permalink / raw)
  To: stephen; +Cc: netdev, leonro, linux-rdma, David Ahern

From: David Ahern <dahern@nvidia.com>

Update netns_get_fd to try the passed in string as a name first. If the
netns filesystem entry does not exist, try converting the string to an
integer and if successful return an fd to /proc/<pid>/ns/net.

This allows netns_get_fd to uniformly handle the 2 common use cases of
specifying network namespace by name and pid.

Signed-off-by: David Ahern <dahern@nvidia.com>
---
 lib/namespace.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/lib/namespace.c b/lib/namespace.c
index 74b7e7caf0e5..0bba3a163563 100644
--- a/lib/namespace.c
+++ b/lib/namespace.c
@@ -99,19 +99,33 @@ int netns_switch(char *name)
 	return 0;
 }
 
-int netns_get_fd(const char *name)
+/* try str as the name of the namespace first, then
+ * fallback to pid
+ */
+int netns_get_fd(const char *str)
 {
 	char pathbuf[PATH_MAX];
-	const char *path, *ptr;
+	const char *path;
+	int pid;
+	int fd;
 
-	path = name;
-	ptr = strchr(name, '/');
-	if (!ptr) {
+	path = str;
+	if (!strchr(str, '/')) {
 		snprintf(pathbuf, sizeof(pathbuf), "%s/%s",
-			NETNS_RUN_DIR, name );
+			NETNS_RUN_DIR, str);
 		path = pathbuf;
 	}
-	return open(path, O_RDONLY);
+
+	fd = open(path, O_RDONLY);
+	if (fd >= 0)
+		return fd;
+
+	/* make sure string is an integer */
+	if (get_integer(&pid, str, 0) < 0)
+		return -1;
+
+	snprintf(pathbuf, sizeof(pathbuf), "/proc/%s/ns/net", str);
+	return open(pathbuf, O_RDONLY);
 }
 
 int netns_foreach(int (*func)(char *nsname, void *arg), void *arg)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH iproute2-next v2 2/4] iplink: Drop pid fallback code for netns
  2026-05-12 19:34 [PATCH iproute2-next v2 0/4] Allow rdma dev netns to take a pid David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 1/4] namespace: Add fallback to netns by pid David Ahern
@ 2026-05-12 19:34 ` David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 3/4] rdma: Allow netns to be specified by pid David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 4/4] devlink: Drop now duplicate pid fallback for netns David Ahern
  3 siblings, 0 replies; 5+ messages in thread
From: David Ahern @ 2026-05-12 19:34 UTC (permalink / raw)
  To: stephen; +Cc: netdev, leonro, linux-rdma, David Ahern

From: David Ahern <dahern@nvidia.com>

Prior commit handles the fallback to pid, so remove
the now duplicate code from iplink_parse.

Signed-off-by: David Ahern <dahern@nvidia.com>
---
 ip/iplink.c | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/ip/iplink.c b/ip/iplink.c
index eae51438d0be..2c052d2970ca 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -650,19 +650,11 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
 			if (offload && name == dev)
 				dev = NULL;
 		} else if (strcmp(*argv, "netns") == 0) {
-			int pid;
-
 			NEXT_ARG();
 			if (netns != -1)
 				duparg("netns", *argv);
+			/* try by name then by pid */
 			netns = netns_get_fd(*argv);
-			if (netns < 0 && get_integer(&pid, *argv, 0) == 0) {
-				char path[PATH_MAX];
-
-				snprintf(path, sizeof(path), "/proc/%d/ns/net",
-					 pid);
-				netns = open(path, O_RDONLY);
-			}
 			if (netns < 0)
 				invarg("Invalid \"netns\" value\n", *argv);
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH iproute2-next v2 3/4] rdma: Allow netns to be specified by pid
  2026-05-12 19:34 [PATCH iproute2-next v2 0/4] Allow rdma dev netns to take a pid David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 1/4] namespace: Add fallback to netns by pid David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 2/4] iplink: Drop pid fallback code for netns David Ahern
@ 2026-05-12 19:34 ` David Ahern
  2026-05-12 19:34 ` [PATCH iproute2-next v2 4/4] devlink: Drop now duplicate pid fallback for netns David Ahern
  3 siblings, 0 replies; 5+ messages in thread
From: David Ahern @ 2026-05-12 19:34 UTC (permalink / raw)
  To: stephen; +Cc: netdev, leonro, linux-rdma, David Ahern

From: David Ahern <dahern@nvidia.com>

Update rdma dev to work like ip link where the netns can be a
name or a pid by using netns_get_fd. Update man page and help
accordingly.

Signed-off-by: David Ahern <dahern@nvidia.com>
---
 man/man8/rdma-dev.8 |  3 ++-
 rdma/dev.c          | 11 ++++-------
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/man/man8/rdma-dev.8 b/man/man8/rdma-dev.8
index abc9f405ede5..34ea1c614ca4 100644
--- a/man/man8/rdma-dev.8
+++ b/man/man8/rdma-dev.8
@@ -32,7 +32,7 @@ rdma-dev \- RDMA device configuration
 .B rdma dev set
 .RI "[ " DEV " ]"
 .BR netns
-.BR NSNAME
+.BR { NSNAME | PID }
 
 .ti -8
 .B rdma dev set
@@ -104,6 +104,7 @@ Renames the mlx5_3 device to rdma_0.
 .RE
 .PP
 rdma dev set mlx5_3 netns foo
+rdma dev set mlx5_3 netns 1234
 .RS 4
 Changes the network namespace of RDMA device to foo where foo was
 previously created using the iproute2 ip command.
diff --git a/rdma/dev.c b/rdma/dev.c
index fd60c1a0e856..c8537912e48e 100644
--- a/rdma/dev.c
+++ b/rdma/dev.c
@@ -6,6 +6,7 @@
 
 #include <fcntl.h>
 #include "rdma.h"
+#include "namespace.h"
 
 static int dev_help(struct rd *rd)
 {
@@ -13,7 +14,7 @@ static int dev_help(struct rd *rd)
 	pr_out("       %s dev add DEVNAME type TYPE parent PARENT_DEVNAME\n", rd->filename);
 	pr_out("       %s dev delete DEVNAME\n", rd->filename);
 	pr_out("       %s dev set [DEV] name DEVNAME\n", rd->filename);
-	pr_out("       %s dev set [DEV] netns NSNAME\n", rd->filename);
+	pr_out("       %s dev set [DEV] netns { NSNAME | PID }\n", rd->filename);
 	pr_out("       %s dev set [DEV] adaptive-moderation [on|off]\n", rd->filename);
 	return 0;
 }
@@ -311,7 +312,7 @@ static int dev_set_name(struct rd *rd)
 
 static int dev_set_netns(struct rd *rd)
 {
-	char *netns_path;
+	char *arg = rd_argv(rd);
 	uint32_t seq;
 	int netns;
 	int ret;
@@ -321,10 +322,7 @@ static int dev_set_netns(struct rd *rd)
 		return -EINVAL;
 	}
 
-	if (asprintf(&netns_path, "%s/%s", NETNS_RUN_DIR, rd_argv(rd)) < 0)
-		return -ENOMEM;
-
-	netns = open(netns_path, O_RDONLY | O_CLOEXEC);
+	netns = netns_get_fd(arg);
 	if (netns < 0) {
 		fprintf(stderr, "Cannot open network namespace \"%s\": %s\n",
 			rd_argv(rd), strerror(errno));
@@ -339,7 +337,6 @@ static int dev_set_netns(struct rd *rd)
 	ret = rd_sendrecv_msg(rd, seq);
 	close(netns);
 done:
-	free(netns_path);
 	return ret;
 }
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH iproute2-next v2 4/4] devlink: Drop now duplicate pid fallback for netns
  2026-05-12 19:34 [PATCH iproute2-next v2 0/4] Allow rdma dev netns to take a pid David Ahern
                   ` (2 preceding siblings ...)
  2026-05-12 19:34 ` [PATCH iproute2-next v2 3/4] rdma: Allow netns to be specified by pid David Ahern
@ 2026-05-12 19:34 ` David Ahern
  3 siblings, 0 replies; 5+ messages in thread
From: David Ahern @ 2026-05-12 19:34 UTC (permalink / raw)
  To: stephen; +Cc: netdev, leonro, linux-rdma, David Ahern

From: David Ahern <dahern@nvidia.com>

Now that netns_get_fd handles by name and pid, the special
handling in devlink to fallback to PID can be removed with
both cases handled by the FD attribute.

Signed-off-by: David Ahern <dahern@nvidia.com>
---
 devlink/devlink.c | 25 +++++++------------------
 1 file changed, 7 insertions(+), 18 deletions(-)

diff --git a/devlink/devlink.c b/devlink/devlink.c
index 730515a78950..908a0e32be2b 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -428,12 +428,6 @@ static void dl_arg_inc(struct dl *dl)
 	dl->argv++;
 }
 
-static void dl_arg_dec(struct dl *dl)
-{
-	dl->argc++;
-	dl->argv--;
-}
-
 static char *dl_argv_next(struct dl *dl)
 {
 	char *ret;
@@ -2153,14 +2147,12 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required,
 			err = dl_argv_str(dl, &netns_str);
 			if (err)
 				return err;
-			opts->netns = netns_get_fd(netns_str);
-			if ((int)opts->netns < 0) {
-				dl_arg_dec(dl);
-				err = dl_argv_uint32_t(dl, &opts->netns);
-				if (err)
-					return err;
-				opts->netns_is_pid = true;
-			}
+
+			err = netns_get_fd(netns_str);
+			if (err < 0)
+				return err;
+
+			opts->netns = err;
 			o_found |= DL_OPT_NETNS;
 		} else if (dl_argv_match(dl, "action") &&
 			   (o_all & DL_OPT_RELOAD_ACTION)) {
@@ -2725,10 +2717,7 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
 		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);
+		mnl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_FD, opts->netns);
 	if (opts->present & DL_OPT_RELOAD_ACTION)
 		mnl_attr_put_u8(nlh, DEVLINK_ATTR_RELOAD_ACTION,
 				opts->reload_action);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-05-12 19:34 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-12 19:34 [PATCH iproute2-next v2 0/4] Allow rdma dev netns to take a pid David Ahern
2026-05-12 19:34 ` [PATCH iproute2-next v2 1/4] namespace: Add fallback to netns by pid David Ahern
2026-05-12 19:34 ` [PATCH iproute2-next v2 2/4] iplink: Drop pid fallback code for netns David Ahern
2026-05-12 19:34 ` [PATCH iproute2-next v2 3/4] rdma: Allow netns to be specified by pid David Ahern
2026-05-12 19:34 ` [PATCH iproute2-next v2 4/4] devlink: Drop now duplicate pid fallback for netns David Ahern

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox