Thread (23 messages) 23 messages, 4 authors, 2025-09-22

Re: [PATCH v5 0/5] barrier: Add smp_cond_load_*_timeout()

From: Catalin Marinas <catalin.marinas@arm.com>
Date: 2025-09-15 11:12:56
Also in: bpf, linux-arch, lkml

On Thu, Sep 11, 2025 at 02:57:52PM -0700, Ankur Arora wrote:
Catalin Marinas [off-list ref] writes:
quoted
On Wed, Sep 10, 2025 at 08:46:50PM -0700, Ankur Arora wrote:
quoted
This series adds waited variants of the smp_cond_load() primitives:
smp_cond_load_relaxed_timeout(), and smp_cond_load_acquire_timeout().

As the name suggests, the new interfaces are meant for contexts where
you want to wait on a condition variable for a finite duration. This
is easy enough to do with a loop around cpu_relax() and a periodic
timeout check (pretty much what we do in poll_idle(). However, some
architectures (ex. arm64) also allow waiting on a cacheline. So,

  smp_cond_load_relaxed_timeout(ptr, cond_expr, time_check_expr)
  smp_cond_load_acquire_timeout(ptr, cond_expr, time_check_expr)

do a mixture of spin/wait with a smp_cond_load() thrown in.

The added parameter, time_check_expr, determines the bail out condition.

There are two current users for these interfaces. poll_idle() with
the change:

  poll_idle() {
      ...
      time_end = local_clock_noinstr() + cpuidle_poll_time(drv, dev);

      raw_local_irq_enable();
      if (!current_set_polling_and_test())
      	 flags = smp_cond_load_relaxed_timeout(&current_thread_info()->flags,
      					(VAL & _TIF_NEED_RESCHED),
      					((local_clock_noinstr() >= time_end)));
      dev->poll_time_limit = !(flags & _TIF_NEED_RESCHED);
      raw_local_irq_disable();
      ...
  }
You should have added this as a patch in the series than include the
implementation in the cover letter.
This was probably an overkill but I wanted to not add another subsystem
to this series.
If you include it, it's easier to poke the cpuidle maintainers and ask
if they are ok with the proposed API as I want to avoid changing it
afterwards. It doesn't mean they'll have to be merged together, they can
go upstream via separate routes.
Will take care of the cpuidle changes in the arm64 polling in idle series.
Thanks. We also need Will, Peter Z and Arnd to ack the API and the
generic changes (probably once you added the linux/atomic.h changes).

-- 
Catalin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help