— Correct the version guard for the futex_numa_mpol test to require

libnuma 2.0.18 instead of 2.0.16, which is the version that actually
   introduced numa_set_mempolicy_home_node() used by the test
 
 — Allow the futex_numa_mpol selftest to build and run on systems without
   libnuma installed with affected test gracefully being skipped instead of
   failing to compile
 
 - Use the proper assertion macros so that individual sub-test failures are
   correctly propagated and the test suite reports failure when something goes
   wrong
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmnfpRgACgkQEsHwGGHe
 VUp4jRAAjcfKMRy2ms6PYQJUwPgFXkmGg1Ij0zQ7D6VxujMUmrmNcCt9pQiR9tmm
 ZuCWtZRvJ4L+GIl0iNnetl13Um3MtXlQQ+SZgnNhC8InATs0hCJia1sPXztmp1VC
 36JDiHbzpNO/InxhBu3WJ+DZodN7RHuNCbnj11Leot2cmAz9njtANcudxDTG3r/o
 Bqs65KRFbx7WU3zPMujEPOzdyYn8KL3L2bxYKWIAd9n4hfoLcbMB4QaShyh1sGoW
 ymRMf8yV9vac1tjwOCugkkdDleV5S5LW/eItuNEppV/rBw35GGFTs2yUjaU5U2NN
 UaQVKDE6UEgJsrX0wBPLPdf10CJia4SA2oYN7PFkNogVGqM/cSzl2B/CqJbcKnur
 Gj2KUNK2VVrlln1pfhnu8NJYOIgkjGpSarH9XNGM+2CIsXergh23cKhhZVLVE4Wy
 YirLkW3BNIGmnvF9idvjcktVHibHkvHjRzn2bUhP1K4SMf6kRxsRbTE8Cg12Nlpe
 cGOt3/6VNyonbXFw3nXdlHNDKjmT/aUrNXRhxEIPTToD+DBfhp7Lce9ylba5/fPv
 jrqAC0kMkSdBVNmabMQ+n/WzteXLLeFbocPWmba7fDSGvmMSlj5AU9qOURhyquaK
 nPjxqE5lhbcFY0nZ9zRTP7PG9NwOhVCsCZppTyGirvw+Q/eRxHU=
 =LIxt
 -----END PGP SIGNATURE-----

Merge tag 'locking_futex_for_v7.1_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull futex selftest updates from Borislav Petkov:

 - Correct the version guard for the futex_numa_mpol test to require
   libnuma 2.0.18 instead of 2.0.16, which is the version that actually
   introduced numa_set_mempolicy_home_node() used by the test

 - Allow the futex_numa_mpol selftest to build and run on systems
   without libnuma installed with affected test gracefully being skipped
   instead of failing to compile

 - Use the proper assertion macros so that individual sub-test failures
   are correctly propagated and the test suite reports failure when
   something goes wrong

* tag 'locking_futex_for_v7.1_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  selftests/futex: Bump up libnuma version check
  selftests/futex: Conditionally include libnuma support
  selftests/futex: Fix incorrect result reporting of futex_requeue test item
This commit is contained in:
Linus Torvalds 2026-04-15 13:39:23 -07:00
commit f82b61de0f
3 changed files with 16 additions and 44 deletions

View File

@ -1,10 +1,13 @@
# 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")
LIBNUMA_TEST = $(shell sh -c "$(PKG_CONFIG) numa --atleast-version 2.0.18 > /dev/null 2>&1 && echo SUFFICIENT || echo NO")
INCLUDES := -I../include -I../../ $(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
ifeq ($(LIBNUMA_TEST),SUFFICIENT)
LDLIBS += -lnuma
endif
LOCAL_HDRS := \
../include/futextest.h \

View File

@ -10,8 +10,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#ifdef LIBNUMA_VER_SUFFICIENT
#include <numa.h>
#include <numaif.h>
#endif
#include <linux/futex.h>
#include <sys/mman.h>
@ -206,7 +208,7 @@ TEST(futex_numa_mpol)
}
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");
ksft_test_result_skip("futex2 MPOL hints test requires libnuma 2.0.18+\n");
#endif
munmap(futex_ptr, mem_size * 2);
}

View File

@ -34,34 +34,18 @@ TEST(requeue_single)
volatile futex_t _f1 = 0;
volatile futex_t f2 = 0;
pthread_t waiter[10];
int res;
f1 = &_f1;
/*
* Requeue a waiter from f1 to f2, and wake f2.
*/
if (pthread_create(&waiter[0], NULL, waiterfn, NULL))
ksft_exit_fail_msg("pthread_create failed\n");
ASSERT_EQ(0, pthread_create(&waiter[0], NULL, waiterfn, NULL));
usleep(WAKE_WAIT_US);
ksft_print_dbg_msg("Requeuing 1 futex from f1 to f2\n");
res = futex_cmp_requeue(f1, 0, &f2, 0, 1, 0);
if (res != 1)
ksft_test_result_fail("futex_requeue simple returned: %d %s\n",
res ? errno : res,
res ? strerror(errno) : "");
ksft_print_dbg_msg("Waking 1 futex at f2\n");
res = futex_wake(&f2, 1, 0);
if (res != 1) {
ksft_test_result_fail("futex_requeue simple returned: %d %s\n",
res ? errno : res,
res ? strerror(errno) : "");
} else {
ksft_test_result_pass("futex_requeue simple succeeds\n");
}
EXPECT_EQ(1, futex_cmp_requeue(f1, 0, &f2, 0, 1, 0));
EXPECT_EQ(1, futex_wake(&f2, 1, 0));
}
TEST(requeue_multiple)
@ -69,7 +53,7 @@ TEST(requeue_multiple)
volatile futex_t _f1 = 0;
volatile futex_t f2 = 0;
pthread_t waiter[10];
int res, i;
int i;
f1 = &_f1;
@ -77,30 +61,13 @@ TEST(requeue_multiple)
* Create 10 waiters at f1. At futex_requeue, wake 3 and requeue 7.
* At futex_wake, wake INT_MAX (should be exactly 7).
*/
for (i = 0; i < 10; i++) {
if (pthread_create(&waiter[i], NULL, waiterfn, NULL))
ksft_exit_fail_msg("pthread_create failed\n");
}
for (i = 0; i < 10; i++)
ASSERT_EQ(0, pthread_create(&waiter[i], NULL, waiterfn, NULL));
usleep(WAKE_WAIT_US);
ksft_print_dbg_msg("Waking 3 futexes at f1 and requeuing 7 futexes from f1 to f2\n");
res = futex_cmp_requeue(f1, 0, &f2, 3, 7, 0);
if (res != 10) {
ksft_test_result_fail("futex_requeue many returned: %d %s\n",
res ? errno : res,
res ? strerror(errno) : "");
}
ksft_print_dbg_msg("Waking INT_MAX futexes at f2\n");
res = futex_wake(&f2, INT_MAX, 0);
if (res != 7) {
ksft_test_result_fail("futex_requeue many returned: %d %s\n",
res ? errno : res,
res ? strerror(errno) : "");
} else {
ksft_test_result_pass("futex_requeue many succeeds\n");
}
EXPECT_EQ(10, futex_cmp_requeue(f1, 0, &f2, 3, 7, 0));
EXPECT_EQ(7, futex_wake(&f2, INT_MAX, 0));
}
TEST_HARNESS_MAIN