Module Name: src
Committed By: riastradh
Date: Sat Jan 18 06:22:35 UTC 2025
Modified Files:
src/tests/lib/libc/sys: t_futex_ops.c
Log Message:
tests/lib/libc/sys/t_futex_ops: Test FUTEX_CMP_REQUEUE edge case.
It must always compare the futex value and fail with EAGAIN on
mismatch, even if there are no waiters.
PR kern/56828: futex calls in Linux emulation sometimes hang
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libc/sys/t_futex_ops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/libc/sys/t_futex_ops.c
diff -u src/tests/lib/libc/sys/t_futex_ops.c:1.5 src/tests/lib/libc/sys/t_futex_ops.c:1.6
--- src/tests/lib/libc/sys/t_futex_ops.c:1.5 Wed May 6 05:14:27 2020
+++ src/tests/lib/libc/sys/t_futex_ops.c Sat Jan 18 06:22:35 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: t_futex_ops.c,v 1.5 2020/05/06 05:14:27 thorpej Exp $ */
+/* $NetBSD: t_futex_ops.c,v 1.6 2025/01/18 06:22:35 riastradh Exp $ */
/*-
* Copyright (c) 2019, 2020 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2019, 2020\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_futex_ops.c,v 1.5 2020/05/06 05:14:27 thorpej Exp $");
+__RCSID("$NetBSD: t_futex_ops.c,v 1.6 2025/01/18 06:22:35 riastradh Exp $");
#include <sys/fcntl.h>
#include <sys/mman.h>
@@ -909,6 +909,33 @@ ATF_TC_CLEANUP(futex_cmp_requeue, tc)
do_cleanup();
}
+ATF_TC(futex_cmp_requeue_trivial);
+ATF_TC_HEAD(futex_cmp_requeue_trivial, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "tests trivial cases of futex CMP_REQUEUE operations");
+}
+ATF_TC_BODY(futex_cmp_requeue_trivial, tc)
+{
+ int nwoken;
+
+ futex_word = 123;
+ futex_word1 = 456; /* should be ignored */
+ atf_tc_expect_fail("PR kern/56828:"
+ " futex calls in Linux emulation sometimes hang");
+ ATF_CHECK_ERRNO(EAGAIN, __futex(&futex_word, FUTEX_CMP_REQUEUE,
+ /*nwake*/1, NULL, &futex_word1, /*nrequeue*/1, 0) == -1);
+ ATF_CHECK_ERRNO(EAGAIN, __futex(&futex_word, FUTEX_CMP_REQUEUE,
+ /*nwake*/1, NULL, &futex_word1, /*nrequeue*/1, 122) == -1);
+ atf_tc_expect_pass();
+ nwoken = __futex(&futex_word, FUTEX_CMP_REQUEUE,
+ /*nwake*/1, NULL, &futex_word1, /*nrequeue*/1, 123);
+ ATF_CHECK_MSG(nwoken != -1, "errno=%d (%s)", errno, strerror(errno));
+ ATF_CHECK_EQ_MSG(nwoken, 0, "nwoken=%d", nwoken);
+ ATF_CHECK_EQ_MSG(futex_word, 123, "futex_word=%d", futex_word);
+ ATF_CHECK_EQ_MSG(futex_word1, 456, "futex_word1=%d", futex_word1);
+}
+
/*****************************************************************************/
static void
@@ -1507,6 +1534,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, futex_requeue);
ATF_TP_ADD_TC(tp, futex_cmp_requeue);
+ ATF_TP_ADD_TC(tp, futex_cmp_requeue_trivial);
ATF_TP_ADD_TC(tp, futex_wake_op_op);
ATF_TP_ADD_TC(tp, futex_wake_op_cmp);