From: Yuwen Chen <ywen.chen@foxmail.com>
To: ywen.chen@foxmail.com
Cc: akpm@linux-foundation.org, andrealmeid@igalia.com,
bigeasy@linutronix.de, colin.i.king@gmail.com, dave@stgolabs.net,
dvhart@infradead.org, edliaw@google.com, justinstitt@google.com,
kernel-team@android.com, licayy@foxmail.com,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
luto@mit.edu, mingo@redhat.com, morbo@google.com,
nathan@kernel.org, ndesaulniers@google.com, peterz@infradead.org,
shuah@kernel.org, tglx@kernel.org, usama.anjum@collabora.com,
wakel@google.com
Subject: [PATCH v5 2/2] selftests/futex: fix the failed futex_requeue test issue
Date: Thu, 5 Feb 2026 10:09:05 +0800 [thread overview]
Message-ID: <tencent_7F45D13FB7CF789CEBCCF945DEF897481706@qq.com> (raw)
In-Reply-To: <tencent_35CFB8AE9D4BE7917D95763D15B972638C0A@qq.com>
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.
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>
---
.../futex/functional/futex_requeue.c | 38 +++++++++++--------
1 file changed, 22 insertions(+), 16 deletions(-)
diff --git a/tools/testing/selftests/futex/functional/futex_requeue.c b/tools/testing/selftests/futex/functional/futex_requeue.c
index dcf0d5f2f3122..ab87bfc4edae0 100644
--- a/tools/testing/selftests/futex/functional/futex_requeue.c
+++ b/tools/testing/selftests/futex/functional/futex_requeue.c
@@ -9,51 +9,53 @@
#include <limits.h>
#include "futextest.h"
+#include "futex_thread.h"
#include "kselftest_harness.h"
-#define timeout_ns 30000000
-#define WAKE_WAIT_US 10000
+#define FUTEX_WAIT_TIMEOUT_SECS 3
volatile futex_t *f1;
-void *waiterfn(void *arg)
+static int waiterfn(void *arg)
{
struct timespec to;
- to.tv_sec = 0;
- to.tv_nsec = timeout_ns;
+ to.tv_sec = FUTEX_WAIT_TIMEOUT_SECS;
+ to.tv_nsec = 0;
- if (futex_wait(f1, *f1, &to, 0))
+ if (futex_wait(f1, *f1, &to, 0)) {
printf("waiter failed errno %d\n", errno);
+ return -errno;
+ }
- return NULL;
+ return 0;
}
TEST(requeue_single)
{
+ struct futex_thread waiter;
volatile futex_t _f1 = 0;
volatile futex_t f2 = 0;
- pthread_t waiter[10];
f1 = &_f1;
/*
* Requeue a waiter from f1 to f2, and wake f2.
*/
- ASSERT_EQ(0, pthread_create(&waiter[0], NULL, waiterfn, NULL));
-
- usleep(WAKE_WAIT_US);
+ ASSERT_EQ(0, futex_thread_create(&waiter, waiterfn, NULL));
+ futex_wait_for_thread(&waiter);
EXPECT_EQ(1, futex_cmp_requeue(f1, 0, &f2, 0, 1, 0));
EXPECT_EQ(1, futex_wake(&f2, 1, 0));
+
+ EXPECT_EQ(0, futex_thread_destroy(&waiter));
}
TEST(requeue_multiple)
{
+ struct futex_thread waiter[10];
volatile futex_t _f1 = 0;
volatile futex_t f2 = 0;
- pthread_t waiter[10];
- int i;
f1 = &_f1;
@@ -61,13 +63,17 @@ 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++)
- ASSERT_EQ(0, pthread_create(&waiter[i], NULL, waiterfn, NULL));
+ for (int i = 0; i < 10; i++)
+ ASSERT_EQ(0, futex_thread_create(&waiter[i], waiterfn, NULL));
- usleep(WAKE_WAIT_US);
+ for (int i = 0; i < 10; i++)
+ futex_wait_for_thread(&waiter[i]);
EXPECT_EQ(10, futex_cmp_requeue(f1, 0, &f2, 3, 7, 0));
EXPECT_EQ(7, futex_wake(&f2, INT_MAX, 0));
+
+ for (int i = 0; i < 10; i++)
+ EXPECT_EQ(0, futex_thread_destroy(&waiter[i]));
}
TEST_HARNESS_MAIN
--
2.34.1
next prev parent reply other threads:[~2026-02-05 2:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-05 2:00 [PATCH v5 0/2] selftests/futex: fix the failed futex_requeue test Yuwen Chen
2026-02-05 2:08 ` [PATCH v5 1/2] selftests/futex: implement the interfaces related to threads Yuwen Chen
2026-02-13 8:23 ` Thomas Gleixner
2026-02-27 8:53 ` Yuwen Chen
2026-02-05 2:09 ` Yuwen Chen [this message]
2026-02-13 8:25 ` [PATCH v5 2/2] selftests/futex: fix the failed futex_requeue test issue Thomas Gleixner
-- strict thread matches above, loose matches on Subject: below --
2026-02-05 2:05 Yuwen Chen
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=tencent_7F45D13FB7CF789CEBCCF945DEF897481706@qq.com \
--to=ywen.chen@foxmail.com \
--cc=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=kernel-team@android.com \
--cc=licayy@foxmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=luto@mit.edu \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=peterz@infradead.org \
--cc=shuah@kernel.org \
--cc=tglx@kernel.org \
--cc=usama.anjum@collabora.com \
--cc=wakel@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox