aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2026-07-07 22:52:56 +0000
committerMark Johnston <markj@FreeBSD.org>2026-07-07 23:28:55 +0000
commit407c7c339adb429efcb6658accd16399031c34ca (patch)
treee65c209af96885a9355302ca677d96464a496295
parent23e94b040b9b99f097c113fc8576576ffec0486f (diff)
linux/futex: Don't load a timeout when try-locking a mutex
linux_sys_futex() does not copyin a timespec for the timeout if the operation is LINUX_FUTEX_TRYLOCK_PI, presumably because it doesn't make sense to specify a timeout for a try-lock operation. However, this means that we pass a userspace timespec pointer to linux_umtx_abs_timeout_init(). Modify linux_futex_lock_pi() to not initialize the timeout if we're try-locking. Reviewed by: kib, dchagin Reported by: Yuxiang Yang, Yizhou Zhao, Ao Wang, Xuewei Feng, Qi Li, and Ke Xu from Tsinghua University using GLM-5.2 from Z.ai MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D58061
-rw-r--r--sys/compat/linux/linux_futex.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c
index 0586eb55a8f3..2e26fb6458a3 100644
--- a/sys/compat/linux/linux_futex.c
+++ b/sys/compat/linux/linux_futex.c
@@ -356,7 +356,7 @@ linux_futex(struct thread *td, struct linux_futex_args *args)
static int
linux_futex_lock_pi(struct thread *td, bool try, struct linux_futex_args *args)
{
- struct umtx_abs_timeout timo;
+ struct umtx_abs_timeout timo, *timop;
struct linux_emuldata *em;
struct umtx_pi *pi, *new_pi;
struct thread *td1;
@@ -370,8 +370,12 @@ linux_futex_lock_pi(struct thread *td, bool try, struct linux_futex_args *args)
&uq->uq_key);
if (error != 0)
return (error);
- if (args->ts != NULL)
- linux_umtx_abs_timeout_init(&timo, args);
+ if (!try && args->ts != NULL) {
+ timop = &timo;
+ linux_umtx_abs_timeout_init(timop, args);
+ } else {
+ timop = NULL;
+ }
umtxq_lock(&uq->uq_key);
pi = umtx_pi_lookup(&uq->uq_key);
@@ -546,8 +550,7 @@ linux_futex_lock_pi(struct thread *td, bool try, struct linux_futex_args *args)
/* We set the contested bit, sleep. */
error = umtxq_sleep_pi(uq, pi, owner, "futexp",
- args->ts == NULL ? NULL : &timo,
- (args->flags & FUTEX_SHARED) != 0);
+ timop, (args->flags & FUTEX_SHARED) != 0);
if (error != 0)
continue;