[PATCH] selftests: net: reuseport_bpf_numa: consider cpuless numa node

Feng Tang <[email protected]>
Newsgroups org.kernel.vger.linux-kselftest,org.kernel.vger.bpf,org.kernel.vger.linux-kernel,org.kernel.vger.netdev
Message-ID <[email protected]>
'reuseport_bpf_numa' case failed on a platform with CXL memory:

	#./reuseport_bpf_numa
	---- IPv4 UDP ----
	send node 0, receive socket 0
	./reuseport_bpf_numa: failed to pin to node: Invalid argument

The root cause is that platform has 2 numa nodes: node 0 has both
cpu and memory, while node 1 is a CXL node which only has memory,
which caused numa_run_on_node() failure.

Add check to skip cpuless numa node for the numa binding test.

Signed-off-by: Feng Tang <[email protected]>
---
 .../selftests/net/reuseport_bpf_numa.c        | 31 +++++++++++++++++--
 1 file changed, 28 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/net/reuseport_bpf_numa.c b/tools/testing/selftests/net/reuseport_bpf_numa.c
index 8ec52fc5ef41..197dbfc475f6 100644
--- a/tools/testing/selftests/net/reuseport_bpf_numa.c
+++ b/tools/testing/selftests/net/reuseport_bpf_numa.c
@@ -104,13 +104,35 @@ static void attach_bpf(int fd)
 	close(bpf_fd);
 }
 
-static void send_from_node(int node_id, int family, int proto)
+static inline bool is_cpuless_node(int node_id)
+{
+	struct bitmask *cpumask;
+	bool ret = false;
+
+	cpumask = numa_allocate_cpumask();
+
+	numa_node_to_cpus(node_id, cpumask);
+	if (!numa_bitmask_weight(cpumask))
+		ret = true;
+
+	numa_bitmask_free(cpumask);
+	return ret;
+}
+
+/*
+ * return -1 on node_id pointing to a cpuless node (like a CXL node),
+ * return 0 on successful numa setup
+ */
+static int send_from_node(int node_id, int family, int proto)
 {
 	struct sockaddr_storage saddr, daddr;
 	struct sockaddr_in  *saddr4, *daddr4;
 	struct sockaddr_in6 *saddr6, *daddr6;
 	int fd;
 
+	if (is_cpuless_node(node_id))
+		return -1;
+
 	switch (family) {
 	case AF_INET:
 		saddr4 = (struct sockaddr_in *)&saddr;
@@ -155,6 +177,7 @@ static void send_from_node(int node_id, int family, int proto)
 		error(1, errno, "failed to send message");
 
 	close(fd);
+	return 0;
 }
 
 static
@@ -213,7 +236,8 @@ static void test(int *rcv_fd, int len, int family, int proto)
 	for (node = 0; node < len; ++node) {
 		if (!numa_bitmask_isbitset(numa_nodes_ptr, node))
 			continue;
-		send_from_node(node, family, proto);
+		if (send_from_node(node, family, proto))
+			continue;
 		receive_on_node(rcv_fd, len, epfd, node, proto);
 	}
 
@@ -221,7 +245,8 @@ static void test(int *rcv_fd, int len, int family, int proto)
 	for (node = len - 1; node >= 0; --node) {
 		if (!numa_bitmask_isbitset(numa_nodes_ptr, node))
 			continue;
-		send_from_node(node, family, proto);
+		if (send_from_node(node, family, proto))
+			continue;
 		receive_on_node(rcv_fd, len, epfd, node, proto);
 	}
 
-- 
2.39.5 (Apple Git-154)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.