From: Andrew Morton <akpm@linux-foundation.org>
To: mm-commits@vger.kernel.org,usama.anjum@collabora.com,tglx@linutronix.de,shuah@kernel.org,peterz@infradead.org,ndesaulniers@google.com,nathan@kernel.org,morbo@google.com,mingo@redhat.com,justinstitt@google.com,edliaw@google.com,dvhart@infradead.org,dave@stgolabs.net,colin.i.king@gmail.com,bigeasy@linutronix.de,andrealmeid@igalia.com,ywen.chen@foxmail.com,akpm@linux-foundation.org
Subject: + selftests-futex-fix-the-failed-futex_requeue-test-issue.patch added to mm-nonmm-unstable branch
Date: Mon, 26 Jan 2026 11:50:16 -0800 [thread overview]
Message-ID: <20260126195016.AE9B7C116C6@smtp.kernel.org> (raw)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 6236 bytes --]
The patch titled
Subject: selftests/futex: fix the failed futex_requeue test issue
has been added to the -mm mm-nonmm-unstable branch. Its filename is
selftests-futex-fix-the-failed-futex_requeue-test-issue.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/selftests-futex-fix-the-failed-futex_requeue-test-issue.patch
This patch will later appear in the mm-nonmm-unstable branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: Yuwen Chen <ywen.chen@foxmail.com>
Subject: selftests/futex: fix the failed futex_requeue test issue
Date: Mon, 26 Jan 2026 17:33:30 +0800
This test item has extremely high requirements for timing and can only
pass the test under specific conditions. The following situations will
lead to test failure:
MainThread Thread1
│
pthread_create-------------------┐
│ │
futex_cmp_requeue │
│ futex_wait
│ │
If the child thread is not waiting in the futex_wait function when the
main thread reaches the futex_cmp_requeue function, the test will fail.
This patch avoids this problem by checking whether the child thread is in
a sleeping state in the main thread.
Link: https://lkml.kernel.org/r/tencent_B9DBF2ECBE56BAB68BDAB949C6935D01CE09@qq.com
Fixes: 7cb5dd8e2c8c ("selftests: futex: Add futex compare requeue test")
Signed-off-by: Yuwen Chen <ywen.chen@foxmail.com>
Co-developed-by: Edward Liaw <edliaw@google.com>
Signed-off-by: Edward Liaw <edliaw@google.com>
Cc: Andre Almeida <andrealmeid@igalia.com>
Cc: Bill Wendling <morbo@google.com>
Cc: Colin Ian King <colin.i.king@gmail.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Justin Stitt <justinstitt@google.com>
Cc: Muhammad Usama Anjum <usama.anjum@collabora.com>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: ndesaulniers@google.com <ndesaulniers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
tools/testing/selftests/futex/functional/futex_requeue.c | 70 ++++++++--
1 file changed, 59 insertions(+), 11 deletions(-)
--- a/tools/testing/selftests/futex/functional/futex_requeue.c~selftests-futex-fix-the-failed-futex_requeue-test-issue
+++ a/tools/testing/selftests/futex/functional/futex_requeue.c
@@ -7,21 +7,27 @@
#include <pthread.h>
#include <limits.h>
+#include <stdatomic.h>
#include "futextest.h"
#include "kselftest_harness.h"
-#define timeout_ns 30000000
-#define WAKE_WAIT_US 10000
+#define timeout_s 3 /* 3s */
+#define WAKE_WAIT_US (10000 * 100) /* 1s */
volatile futex_t *f1;
+static pthread_barrier_t barrier;
void *waiterfn(void *arg)
{
struct timespec to;
+ atomic_int *tid = (atomic_int *)arg;
- to.tv_sec = 0;
- to.tv_nsec = timeout_ns;
+ to.tv_sec = timeout_s;
+ to.tv_nsec = 0;
+
+ atomic_store(tid, gettid());
+ pthread_barrier_wait(&barrier);
if (futex_wait(f1, *f1, &to, 0))
printf("waiter failed errno %d\n", errno);
@@ -29,22 +35,52 @@ void *waiterfn(void *arg)
return NULL;
}
+static int get_thread_state(pid_t pid)
+{
+ FILE *fp;
+ char buf[80], tag[80];
+ char val = 0;
+
+ snprintf(buf, sizeof(buf), "/proc/%d/status", pid);
+ fp = fopen(buf, "r");
+ if (!fp)
+ return -1;
+
+ while (fgets(buf, sizeof(buf), fp))
+ if (sscanf(buf, "%s %c", tag, &val) == 2 && !strcmp(tag, "State:")) {
+ fclose(fp);
+ return val;
+ }
+
+ fclose(fp);
+ return -1;
+}
+
TEST(requeue_single)
{
volatile futex_t _f1 = 0;
volatile futex_t f2 = 0;
pthread_t waiter[10];
- int res;
+ atomic_int tid = 0;
+ int res, state, retry = 100;
f1 = &_f1;
+ pthread_barrier_init(&barrier, NULL, 2);
/*
* Requeue a waiter from f1 to f2, and wake f2.
*/
- if (pthread_create(&waiter[0], NULL, waiterfn, NULL))
+ if (pthread_create(&waiter[0], NULL, waiterfn, &tid))
ksft_exit_fail_msg("pthread_create failed\n");
- usleep(WAKE_WAIT_US);
+ pthread_barrier_wait(&barrier);
+ pthread_barrier_destroy(&barrier);
+ while ((state = get_thread_state(atomic_load(&tid))) != 'S') {
+ usleep(WAKE_WAIT_US / 100);
+
+ if (state < 0 || retry-- <= 0)
+ break;
+ }
ksft_print_dbg_msg("Requeuing 1 futex from f1 to f2\n");
res = futex_cmp_requeue(f1, 0, &f2, 0, 1, 0);
@@ -69,7 +105,8 @@ TEST(requeue_multiple)
volatile futex_t _f1 = 0;
volatile futex_t f2 = 0;
pthread_t waiter[10];
- int res, i;
+ atomic_int tids[10] = {0};
+ int res, i, state, retry = 0;
f1 = &_f1;
@@ -78,11 +115,22 @@ TEST(requeue_multiple)
* At futex_wake, wake INT_MAX (should be exactly 7).
*/
for (i = 0; i < 10; i++) {
- if (pthread_create(&waiter[i], NULL, waiterfn, NULL))
+ pthread_barrier_init(&barrier, NULL, 2);
+
+ if (pthread_create(&waiter[i], NULL, waiterfn, &tids[i]))
ksft_exit_fail_msg("pthread_create failed\n");
- }
- usleep(WAKE_WAIT_US);
+ pthread_barrier_wait(&barrier);
+ pthread_barrier_destroy(&barrier);
+
+ retry += 10;
+ while ((state = get_thread_state(atomic_load(&tids[i]))) != 'S') {
+ usleep(WAKE_WAIT_US / 100);
+
+ if (state < 0 || retry-- <= 0)
+ break;
+ }
+ }
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);
_
Patches currently in -mm which might be from ywen.chen@foxmail.com are
selftests-futex-fix-the-failed-futex_requeue-test-issue.patch
next reply other threads:[~2026-01-26 19:50 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-26 19:50 Andrew Morton [this message]
2026-01-27 7:07 ` + selftests-futex-fix-the-failed-futex_requeue-test-issue.patch added to mm-nonmm-unstable branch Sebastian Andrzej Siewior
2026-01-27 18:33 ` Thomas Gleixner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260126195016.AE9B7C116C6@smtp.kernel.org \
--to=akpm@linux-foundation.org \
--cc=andrealmeid@igalia.com \
--cc=bigeasy@linutronix.de \
--cc=colin.i.king@gmail.com \
--cc=dave@stgolabs.net \
--cc=dvhart@infradead.org \
--cc=edliaw@google.com \
--cc=justinstitt@google.com \
--cc=mingo@redhat.com \
--cc=mm-commits@vger.kernel.org \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=peterz@infradead.org \
--cc=shuah@kernel.org \
--cc=tglx@linutronix.de \
--cc=usama.anjum@collabora.com \
--cc=ywen.chen@foxmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.