mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 11:41:29 -04:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user