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.
An attempt is made to avoid this problem by checking whether the child
thread is in a sleeping state in the main thread.
v1->v2:
1. Fix the issue of abnormal use of fscanf in the get_thread_state function
2. Add timeout logic
v2->v3:
https://lore.kernel.org/all/[email protected]/
1. Use /proc/[pid]/wchan instead of /proc/[pid]/stat to check if a process
has entered the sleep state
2. Refactor part of the logic to facilitate code reuse.
v3->v4:
https://lore.kernel.org/all/[email protected]/
1. Add a new futex_thread.h file.
2. Add a new function named futex_thread_destroy.
3. Fix the issue that threads are not reclaimed in futex_requeue.
v4->v5:
https://lore.kernel.org/all/[email protected]/
1. Split the patch into two.
2. Modify the thread interface to support returning error codes.
3. In the test cases, check the return values of the threads.
4. Modify the macro definitions to more understandable names.
5. When failing to open the /proc/%d/wchan file, delay for 100 ms.
6. Modify the parameter description of the interface.
v5->v6:
https://lore.kernel.org/all/[email protected]/
1. Add parameters to the futex_wait_for_thread function to support custom
timeout periods.
2. Even when the proc file system is not mounted, the test case can still
pass.
3. Add timeout time comments to the usleep function.
4. Reduce the time of FUTEX_WAIT_TIMEOUT_SECS to 1 second.
5. Add the necessary header files to futex_thread.h.
v6->v7:
https://lore.kernel.org/all/[email protected]/
1. Changed `static` to `static inline` for all functions in futex_thread.h.
2. Added `sleep_time_us` variable with zero-guard in __wait_for_thread() to
prevent
tight loop when timeout_us < WAIT_THREAD_RETRIES.
3. Removed fallback usleep(100ms) from futex_wait_for_thread(); moved error
handling to callers.
4. Added return value check for pthread_barrier_init() in
futex_thread_create().
5. Added pthread_barrier_destroy() cleanup on pthread_create() failure path.
6. Unified error checking to `if (ret < 0)` in both requeue_single and
requeue_multiple.
7. Added comment for the break logic in requeue_multiple when /proc is not
available.
Yuwen Chen (2):
selftests/futex: implement the interfaces related to threads
selftests/futex: fix the failed futex_requeue test issue
.../selftests/futex/functional/Makefile | 3 +-
.../futex/functional/futex_requeue.c | 46 ++++---
.../selftests/futex/include/futex_thread.h | 114 ++++++++++++++++++
3 files changed, 148 insertions(+), 15 deletions(-)
create mode 100644 tools/testing/selftests/futex/include/futex_thread.h
--
2.34.1