Re: [RFC PATCH 07/13] arm64: percpu: Implement preemptible read/write ops
From: David Laight
Date: Tue Jul 28 2026 - 17:55:51 EST
On Tue, 28 Jul 2026 13:38:53 +0100
Mark Rutland <mark.rutland@xxxxxxx> wrote:
> Use the PCPU GPR infrastructure to implement preemptible this_cpu_read()
> and this_cpu_write().
...
> #define this_cpu_write_1(pcp, val) \
> - _pcp_protect(__percpu_write_8, pcp, (unsigned long)val)
> + _pcp_wrap(__percpu_write_8, pcp, (unsigned long)val)
Not new, but does that end up sign extending 'val' which is likely
to be more expensive than zero extending it?
Using '(val) + 0u + 0ul' might generate better code in some cases.
Just noticed it should be (unsigned long)(val) as well.
Otherwise this_cpu_write_n(pcp, -7 / 4) isn't going to DTRT.
David
> #define this_cpu_write_2(pcp, val) \
> - _pcp_protect(__percpu_write_16, pcp, (unsigned long)val)
> + _pcp_wrap(__percpu_write_16, pcp, (unsigned long)val)
> #define this_cpu_write_4(pcp, val) \
> - _pcp_protect(__percpu_write_32, pcp, (unsigned long)val)
> + _pcp_wrap(__percpu_write_32, pcp, (unsigned long)val)
> #define this_cpu_write_8(pcp, val) \
> - _pcp_protect(__percpu_write_64, pcp, (unsigned long)val)
> + _pcp_wrap(__percpu_write_64, pcp, (unsigned long)val)
>
> #define this_cpu_add_1(pcp, val) \
> _pcp_protect(__percpu_add_case_8, pcp, val)