selftests: net: reuseport_bpf_numa: consider cpuless numa node

reuseport_bpf_numa case failed when testing 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 the platform has 2 numa nodes: node 0 has
both cpu and memory, while node 1 is a CXL node which only has
memory, and caused numa_run_on_node() to fail.

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

Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260807002436.43991-1-feng.tang@linux.alibaba.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Feng Tang
2026-08-07 08:24:36 +08:00
committed by Paolo Abeni
parent 5d3ae80ecd
commit 88b8d85e88

View File

@@ -104,6 +104,26 @@ static void attach_bpf(int fd)
close(bpf_fd);
}
/*
* Return true if it is a cpuless node. Return false if it isn't or any
* error (very unlikely) happens during the libnuma calls.
*/
static bool is_cpuless_node(int node_id)
{
struct bitmask *cpumask;
bool ret = false;
cpumask = numa_allocate_cpumask();
if (!cpumask)
return ret;
if (!numa_node_to_cpus(node_id, cpumask) && !numa_bitmask_weight(cpumask))
ret = true;
numa_bitmask_free(cpumask);
return ret;
}
static void send_from_node(int node_id, int family, int proto)
{
struct sockaddr_storage saddr, daddr;
@@ -213,6 +233,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;
if (is_cpuless_node(node))
continue;
send_from_node(node, family, proto);
receive_on_node(rcv_fd, len, epfd, node, proto);
}
@@ -221,6 +243,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;
if (is_cpuless_node(node))
continue;
send_from_node(node, family, proto);
receive_on_node(rcv_fd, len, epfd, node, proto);
}