From: "André Almeida" <andrealmeid@igalia.com>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
"Carlos O'Donell" <carlos@redhat.com>,
"Peter Zijlstra" <peterz@infradead.org>,
"Florian Weimer" <fweimer@redhat.com>,
"Rich Felker" <dalias@aerifal.cx>,
"Torvald Riegel" <triegel@redhat.com>,
"Darren Hart" <dvhart@infradead.org>,
"Ingo Molnar" <mingo@kernel.org>,
"Davidlohr Bueso" <dave@stgolabs.net>,
"Arnd Bergmann" <arnd@arndb.de>,
"Liam R . Howlett" <Liam.Howlett@oracle.com>,
"Thomas Gleixner" <tglx@kernel.org>,
"Uros Bizjak" <ubizjak@gmail.com>,
"Thomas Weißschuh" <linux@weissschuh.net>,
kernel-dev@igalia.com
Subject: Re: [PATCH 15/14] selftests: futex: Add tests for robust unlock within the critical section.
Date: Wed, 27 May 2026 23:55:10 -0300 [thread overview]
Message-ID: <a11c5dbf-48d9-4014-8daf-b8afbdec32d4@igalia.com> (raw)
In-Reply-To: <20260404093939.7XgeW_54@linutronix.de>
Em 04/04/2026 06:39, Sebastian Andrzej Siewior escreveu:
> From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
>
> I took Thomas’ initial test case from the cover letter and reworked it
> so that it uses ptrace() to single‑step through the VDSO unlock
> operation. The test expects the lock to remain locked, with
> `list_op_pending' pointing somewhere, when entering the VDSO unlock
> path. Once execution steps into the critical section, it expects the
> kernel to perform the fixup that is, to unlock the lock and clear
> `list_op_pending'.
>
> The test requires VDSO debug symbols, typically provided by
> vdso64.so.dbg or vdso32.so.dbg. It attempts to locate the appropriate
> file automatically, but the user may override this by setting the
> VDSO_DBG environment variable. If neither method succeeds, libelf falls
> back to its usual lookup mechanism under /usr/lib/debug/.build-id/
>
> Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
[...]
> +
> + } else if (state == STATE_IN_CS) {
> + /*
> + * If the critical section has been entered then
> + * the kernel has to unlock and clean list_op_pending.
> + * On 32bit the pointer is just 32bit wide, the
> + * upper 32bit are cleaned on 64bit.
> + */
> + if (is_32bit)
> + rhead_val &= 0xffffffff;
> +
> + ASSERT_EQ(rhead_val, 0);
> + ASSERT_EQ(lock_val, 0);
> + }
It turns out that the test success I saw with my aarch64 implementation
was a false positive :/ There's no logic to verify if the code really
enters the critical section. If the code just jump over it, the test
never checks if lock_val and rhead_val are actually zeroed.
> +
> + if (ptrace(PTRACE_SINGLESTEP, child, 0, 0))
> + err(1, "PTRACE_SINGLESTEP");
After I fixed my code, the selftest got to an infinity loop (maybe we
should add max steps?). The single steps doesn't work for LL/SC locks,
like this one:
retry:
ldxr %w[val], %[lock]
cmp %w[tid], %w[val]
bne end
stlxr %w[result], wzr, %[lock]
cbnz %w[result], retry
end:
The single step with ptrace() causes a context switch that clear the
exclusive monitor[1], so store fails and the code branches to retry. We
need to jump straight to `cbnz %w[result], retry`. I tested to single
step with GDB, and it turns outs that it is smart enough to run the code
from ldxr to stlxr "atomically", to avoid messing with the exclusive
monitor and then it worked as expected.
[1]
https://developer.arm.com/documentation/dht0008/a/arm-synchronization-primitives/exclusive-accesses/exclusive-monitors
[2]
https://github.com/gnutools/binutils-gdb/blob/aa5685c0fa9f299ae0f94e537a1f55991c972e9c/gdb/aarch64-tdep.c#L3514
next prev parent reply other threads:[~2026-05-28 2:55 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-02 15:21 [patch V4 00/14] futex: Address the robust futex unlock race for real Thomas Gleixner
2026-04-02 15:21 ` [patch V4 01/14] futex: Move futex task related data into a struct Thomas Gleixner
2026-04-02 15:21 ` [patch V4 02/14] futex: Make futex_mm_init() void Thomas Gleixner
2026-04-02 15:21 ` [patch V4 03/14] futex: Move futex related mm_struct data into a struct Thomas Gleixner
2026-04-09 11:11 ` Nam Cao
2026-04-10 14:20 ` Thomas Gleixner
2026-04-02 15:21 ` [patch V4 04/14] futex: Provide UABI defines for robust list entry modifiers Thomas Gleixner
2026-04-02 15:21 ` [patch V4 05/14] uaccess: Provide unsafe_atomic_store_release_user() Thomas Gleixner
2026-04-02 15:21 ` [patch V4 06/14] x86: Select ARCH_MEMORY_ORDER_TSO Thomas Gleixner
2026-04-02 15:21 ` [patch V4 07/14] futex: Cleanup UAPI defines Thomas Gleixner
2026-04-02 15:21 ` [patch V4 08/14] futex: Add support for unlocking robust futexes Thomas Gleixner
2026-04-02 15:21 ` [patch V4 09/14] futex: Add robust futex unlock IP range Thomas Gleixner
2026-05-28 1:02 ` André Almeida
2026-05-29 21:30 ` Thomas Gleixner
2026-04-02 15:21 ` [patch V4 10/14] futex: Provide infrastructure to plug the non contended robust futex unlock race Thomas Gleixner
2026-05-28 1:08 ` André Almeida
2026-05-29 21:14 ` Thomas Gleixner
2026-04-02 15:21 ` [patch V4 11/14] x86/vdso: Prepare for robust futex unlock support Thomas Gleixner
2026-05-28 1:14 ` André Almeida
2026-04-02 15:22 ` [patch V4 12/14] x86/vdso: Implement __vdso_futex_robust_try_unlock() Thomas Gleixner
2026-04-29 8:44 ` Thomas Weißschuh
2026-05-07 9:29 ` Thomas Gleixner
2026-05-07 9:48 ` Thomas Weißschuh
2026-05-07 16:51 ` Thomas Gleixner
2026-05-29 15:36 ` André Almeida
2026-04-02 15:22 ` [patch V4 13/14] Documentation: futex: Add a note about robust list race condition Thomas Gleixner
2026-04-02 15:22 ` [patch V4 14/14] selftests: futex: Add tests for robust release operations Thomas Gleixner
2026-04-04 9:39 ` [PATCH 15/14] selftests: futex: Add tests for robust unlock within the critical section Sebastian Andrzej Siewior
2026-04-04 20:13 ` Thomas Gleixner
2026-05-22 22:16 ` André Almeida
2026-05-28 2:55 ` André Almeida [this message]
2026-05-29 21:27 ` 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=a11c5dbf-48d9-4014-8daf-b8afbdec32d4@igalia.com \
--to=andrealmeid@igalia.com \
--cc=Liam.Howlett@oracle.com \
--cc=arnd@arndb.de \
--cc=bigeasy@linutronix.de \
--cc=carlos@redhat.com \
--cc=dalias@aerifal.cx \
--cc=dave@stgolabs.net \
--cc=dvhart@infradead.org \
--cc=fweimer@redhat.com \
--cc=kernel-dev@igalia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@weissschuh.net \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@kernel.org \
--cc=triegel@redhat.com \
--cc=ubizjak@gmail.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
all inboxes | Powered by JetHome®