selftest/futex: Compile also with libnuma < 2.0.16

After using numa_set_mempolicy_home_node() the test fails to compile on
systems with libnuma library versioned lower than 2.0.16.

In order to allow lower library version add a pkg-config related check
and exclude that part of the code. Without the proper MPOL setup it
can't be tested.

Make a total number of tests two. The first one is the first batch and
the second is the MPOL related one. The goal is to let the user know if
it has been skipped due to library limitation.

Remove test_futex_mpol(), it was unused and it is now complained by the
compiler if the part is not compiled.

Fixes: 0ecb4232fc ("selftests/futex: Set the home_node in futex_numa_mpol")
Closes: https://lore.kernel.org/oe-lkp/202507150858.bedaf012-lkp@intel.com
Reported-by: kernel test robot <oliver.sang@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
This commit is contained in:
Sebastian Andrzej Siewior 2025-09-15 23:26:30 +02:00 committed by Peter Zijlstra
parent 2951dddef0
commit ed323aeda5
2 changed files with 14 additions and 12 deletions

View File

@ -1,6 +1,9 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
PKG_CONFIG ?= pkg-config
LIBNUMA_TEST = $(shell sh -c "$(PKG_CONFIG) numa --atleast-version 2.0.16 > /dev/null 2>&1 && echo SUFFICIENT || echo NO")
INCLUDES := -I../include -I../../ $(KHDR_INCLUDES) INCLUDES := -I../include -I../../ $(KHDR_INCLUDES)
CFLAGS := $(CFLAGS) -g -O2 -Wall -pthread -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 $(INCLUDES) $(KHDR_INCLUDES) CFLAGS := $(CFLAGS) -g -O2 -Wall -pthread -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64 $(INCLUDES) $(KHDR_INCLUDES) -DLIBNUMA_VER_$(LIBNUMA_TEST)=1
LDLIBS := -lpthread -lrt -lnuma LDLIBS := -lpthread -lrt -lnuma
LOCAL_HDRS := \ LOCAL_HDRS := \

View File

@ -131,11 +131,6 @@ static void test_futex(void *futex_ptr, int err_value)
__test_futex(futex_ptr, err_value, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA); __test_futex(futex_ptr, err_value, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA);
} }
static void test_futex_mpol(void *futex_ptr, int err_value)
{
__test_futex(futex_ptr, err_value, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA | FUTEX2_MPOL);
}
static void usage(char *prog) static void usage(char *prog)
{ {
printf("Usage: %s\n", prog); printf("Usage: %s\n", prog);
@ -148,7 +143,7 @@ static void usage(char *prog)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct futex32_numa *futex_numa; struct futex32_numa *futex_numa;
int mem_size, i; int mem_size;
void *futex_ptr; void *futex_ptr;
int c; int c;
@ -171,7 +166,7 @@ int main(int argc, char *argv[])
} }
ksft_print_header(); ksft_print_header();
ksft_set_plan(1); ksft_set_plan(2);
mem_size = sysconf(_SC_PAGE_SIZE); mem_size = sysconf(_SC_PAGE_SIZE);
futex_ptr = mmap(NULL, mem_size * 2, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); futex_ptr = mmap(NULL, mem_size * 2, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
@ -211,8 +206,11 @@ int main(int argc, char *argv[])
ksft_print_msg("Memory back to RW\n"); ksft_print_msg("Memory back to RW\n");
test_futex(futex_ptr, 0); test_futex(futex_ptr, 0);
ksft_test_result_pass("futex2 memory boundarie tests passed\n");
/* MPOL test. Does not work as expected */ /* MPOL test. Does not work as expected */
for (i = 0; i < 4; i++) { #ifdef LIBNUMA_VER_SUFFICIENT
for (int i = 0; i < 4; i++) {
unsigned long nodemask; unsigned long nodemask;
int ret; int ret;
@ -231,15 +229,16 @@ int main(int argc, char *argv[])
ret = futex2_wake(futex_ptr, 0, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA | FUTEX2_MPOL); ret = futex2_wake(futex_ptr, 0, FUTEX2_SIZE_U32 | FUTEX_PRIVATE_FLAG | FUTEX2_NUMA | FUTEX2_MPOL);
if (ret < 0) if (ret < 0)
ksft_test_result_fail("Failed to wake 0 with MPOL: %m\n"); ksft_test_result_fail("Failed to wake 0 with MPOL: %m\n");
if (0)
test_futex_mpol(futex_numa, 0);
if (futex_numa->numa != i) { if (futex_numa->numa != i) {
ksft_exit_fail_msg("Returned NUMA node is %d expected %d\n", ksft_exit_fail_msg("Returned NUMA node is %d expected %d\n",
futex_numa->numa, i); futex_numa->numa, i);
} }
} }
} }
ksft_test_result_pass("NUMA MPOL tests passed\n"); ksft_test_result_pass("futex2 MPOL hints test passed\n");
#else
ksft_test_result_skip("futex2 MPOL hints test requires libnuma 2.0.16+\n");
#endif
ksft_finished(); ksft_finished();
return 0; return 0;
} }