From: sashiko-bot@kernel.org
To: "Ankur Arora" <ankur.a.arora@oracle.com>, bpf@vger.kernel.org
Subject: Re: [PATCH v16 07/16] atomic: Add atomic_cond_read_*_timeout()
Date: Fri, 16 Oct 2026 07:25:39 +0000 [thread overview]
Message-ID: <sashiko-outbox-173924@kernel.org> (raw)
In-Reply-To: <20261016070837.440748-8-ankur.a.arora@oracle.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] atomic: torn reads in atomic64_cond_read_*_timeout on 32-bit
- [Low] docs: incorrect categorization of atomic_t operations
--
commit 9e35fd2167c99d05e59317145e35667a8118c80e
Author: Ankur Arora <ankur.a.arora@oracle.com>
atomic: Add atomic_cond_read_*_timeout()
Add atomic load wrappers, atomic_cond_read_*_timeout() and
atomic64_cond_read_*_timeout() for the cond-load timeout interfaces.
> diff --git a/Documentation/atomic_t.txt b/Documentation/atomic_t.txt
> index bee3b1bca9a7b..0e53f6ccb5580 100644
> --- a/Documentation/atomic_t.txt
> +++ b/Documentation/atomic_t.txt
> @@ -16,6 +16,10 @@ Non-RMW ops:
> atomic_read(), atomic_set()
> atomic_read_acquire(), atomic_set_release()
>
> +Non-RMW, non-atomic_t ops:
> +
> + atomic_cond_read_{relaxed,acquire}()
> + atomic_cond_read_{relaxed,acquire}_timeout()
[Severity: Low]
Does this section header miscategorize these operations?
These macros explicitly take an atomic_t pointer as their primary argument and
operate on atomic types. Was the intention to denote them as conditional wait
operations instead of non-atomic_t operations?
[ ... ]
> diff --git a/include/linux/atomic.h b/include/linux/atomic.h
> index 8dd57c3a99e9b..5bcb86e077845 100644
> --- a/include/linux/atomic.h
> +++ b/include/linux/atomic.h
> @@ -31,6 +31,16 @@
> #define atomic64_cond_read_acquire(v, c) smp_cond_load_acquire(&(v)->counter, (c))
> #define atomic64_cond_read_relaxed(v, c) smp_cond_load_relaxed(&(v)->counter, (c))
>
> +#define atomic_cond_read_acquire_timeout(v, c, e, t) \
> + smp_cond_load_acquire_timeout(&(v)->counter, (c), (e), (t))
> +#define atomic_cond_read_relaxed_timeout(v, c, e, t) \
> + smp_cond_load_relaxed_timeout(&(v)->counter, (c), (e), (t))
> +
> +#define atomic64_cond_read_acquire_timeout(v, c, e, t) \
> + smp_cond_load_acquire_timeout(&(v)->counter, (c), (e), (t))
> +#define atomic64_cond_read_relaxed_timeout(v, c, e, t) \
> + smp_cond_load_relaxed_timeout(&(v)->counter, (c), (e), (t))
[Severity: High]
Could passing the address of the 64-bit counter directly to the unlocked
polling macro lead to torn reads on 32-bit architectures?
The generic atomic64_t implementation for 32-bit architectures (used when
lacking native 64-bit atomic instructions) updates the counter via two 32-bit
stores protected by a hashed array of spinlocks in lib/atomic64.c.
Because smp_cond_load_acquire_timeout polls the variable using an unlocked
READ_ONCE(), concurrent updates to the counter will bypass the spinlock.
On 32-bit architectures, READ_ONCE() on an 8-byte value evaluates successfully
but compiles into two independent 32-bit reads, which can result in data
corruption.
Additionally, smp_cond_load_acquire_timeout relies on smp_load_acquire() when
timeout_ns < 0. Can this cause a build failure on 32-bit architectures due to
compiletime_assert_atomic_type() preventing 8-byte acquire loads?
The pre-existing atomic64_cond_read_acquire and atomic64_cond_read_relaxed
macros share this identical architectural flaw, and it looks like the new
API macros propagate the same vulnerability.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016070837.440748-1-ankur.a.arora@oracle.com?part=7
next prev parent reply other threads:[~2026-10-16 7:25 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 7:08 [PATCH v16 00/16] barrier: Add smp_cond_load_{relaxed,acquire}_timeout() Ankur Arora
2026-10-16 7:08 ` [PATCH v16 01/16] asm-generic: barrier: Add smp_cond_load_relaxed_timeout() Ankur Arora
2026-10-16 7:21 ` sashiko-bot
2026-10-16 7:55 ` bot+bpf-ci
2026-10-16 7:08 ` [PATCH v16 02/16] arm64: barrier: Support smp_cond_load_relaxed_timeout() Ankur Arora
2026-10-16 7:24 ` sashiko-bot
2026-10-16 7:08 ` [PATCH v16 03/16] arm64/delay: move, fixup usecs_to_cycles() Ankur Arora
2026-10-16 7:16 ` sashiko-bot
2026-10-16 7:55 ` bot+bpf-ci
2026-10-16 12:22 ` Catalin Marinas
2026-10-16 7:08 ` [PATCH v16 04/16] arm64: support WFET in smp_cond_load_relaxed_timeout() Ankur Arora
2026-10-16 7:27 ` sashiko-bot
2026-10-16 7:55 ` bot+bpf-ci
2026-10-16 7:08 ` [PATCH v16 05/16] arm64: rqspinlock: Remove private copy of smp_cond_load_acquire_timewait() Ankur Arora
2026-10-16 7:08 ` [PATCH v16 06/16] asm-generic: barrier: Add smp_cond_load_acquire_timeout() Ankur Arora
2026-10-16 7:21 ` sashiko-bot
2026-10-16 7:08 ` [PATCH v16 07/16] atomic: Add atomic_cond_read_*_timeout() Ankur Arora
2026-10-16 7:25 ` sashiko-bot [this message]
2026-10-16 7:08 ` [PATCH v16 08/16] locking/atomic: scripts: build atomic_long_cond_read_*_timeout() Ankur Arora
2026-10-16 7:08 ` [PATCH v16 09/16] bpf/rqspinlock: switch check_timeout() to a clock interface Ankur Arora
2026-10-16 7:08 ` [PATCH v16 10/16] bpf/rqspinlock: Use smp_cond_load_acquire_timeout() Ankur Arora
2026-10-16 7:08 ` [PATCH v16 11/16] sched: add need-resched timed wait interface Ankur Arora
2026-10-16 7:08 ` [PATCH v16 12/16] cpuidle/poll_state: Wait for need-resched via tif_need_resched_relaxed_wait() Ankur Arora
2026-10-16 7:08 ` [PATCH v16 13/16] arm64/delay: enable testing smp_cond_load_relaxed_timeout() Ankur Arora
2026-10-16 7:20 ` sashiko-bot
2026-10-16 7:08 ` [PATCH v16 14/16] barrier: add tests for smp_cond_load_*_timeout() Ankur Arora
2026-10-16 7:55 ` bot+bpf-ci
2026-10-16 7:08 ` [PATCH v16 15/16] barrier: timeout validity checks for smp_cond_load_relaxed_timeout() Ankur Arora
2026-10-16 7:19 ` sashiko-bot
2026-10-16 7:55 ` bot+bpf-ci
2026-10-16 7:08 ` [PATCH v16 16/16] barrier: timeout validity checks for smp_cond_load_acquire_timeout() Ankur Arora
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=sashiko-outbox-173924@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=ankur.a.arora@oracle.com \
--cc=bpf@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.