* [PATCH] um/asm: Replace "REP; NOP" with PAUSE mnemonic @ 2025-04-14 14:55 Uros Bizjak 2025-04-15 17:55 ` David Laight 0 siblings, 1 reply; 4+ messages in thread From: Uros Bizjak @ 2025-04-14 14:55 UTC (permalink / raw) To: linux-um, x86, linux-kernel Cc: Uros Bizjak, Richard Weinberger, Anton Ivanov, Johannes Berg, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin Current minimum required version of binutils is 2.25, which supports PAUSE instruction mnemonic. Replace "REP; NOP" with this proper mnemonic. No functional change intended. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Cc: Richard Weinberger <richard@nod.at> Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> Cc: Johannes Berg <johannes@sipsolutions.net> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: "H. Peter Anvin" <hpa@zytor.com> --- arch/x86/um/asm/processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h index 478710384b34..233a7a0d29c9 100644 --- a/arch/x86/um/asm/processor.h +++ b/arch/x86/um/asm/processor.h @@ -24,7 +24,7 @@ /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ static __always_inline void rep_nop(void) { - __asm__ __volatile__("rep;nop": : :"memory"); + __asm__ __volatile__("pause": : :"memory"); } static __always_inline void cpu_relax(void) -- 2.42.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] um/asm: Replace "REP; NOP" with PAUSE mnemonic 2025-04-14 14:55 [PATCH] um/asm: Replace "REP; NOP" with PAUSE mnemonic Uros Bizjak @ 2025-04-15 17:55 ` David Laight 2025-04-16 5:53 ` Uros Bizjak 0 siblings, 1 reply; 4+ messages in thread From: David Laight @ 2025-04-15 17:55 UTC (permalink / raw) To: Uros Bizjak Cc: linux-um, x86, linux-kernel, Richard Weinberger, Anton Ivanov, Johannes Berg, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin On Mon, 14 Apr 2025 16:55:57 +0200 Uros Bizjak <ubizjak@gmail.com> wrote: > Current minimum required version of binutils is 2.25, > which supports PAUSE instruction mnemonic. > > Replace "REP; NOP" with this proper mnemonic. > > No functional change intended. > > Signed-off-by: Uros Bizjak <ubizjak@gmail.com> > Cc: Richard Weinberger <richard@nod.at> > Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> > Cc: Johannes Berg <johannes@sipsolutions.net> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Ingo Molnar <mingo@kernel.org> > Cc: Borislav Petkov <bp@alien8.de> > Cc: Dave Hansen <dave.hansen@linux.intel.com> > Cc: "H. Peter Anvin" <hpa@zytor.com> > --- > arch/x86/um/asm/processor.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h > index 478710384b34..233a7a0d29c9 100644 > --- a/arch/x86/um/asm/processor.h > +++ b/arch/x86/um/asm/processor.h > @@ -24,7 +24,7 @@ > /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ > static __always_inline void rep_nop(void) > { > - __asm__ __volatile__("rep;nop": : :"memory"); > + __asm__ __volatile__("pause": : :"memory"); > } > That only makes sense if you also change the function name. David > static __always_inline void cpu_relax(void) ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] um/asm: Replace "REP; NOP" with PAUSE mnemonic 2025-04-15 17:55 ` David Laight @ 2025-04-16 5:53 ` Uros Bizjak 2025-04-16 6:57 ` Uros Bizjak 0 siblings, 1 reply; 4+ messages in thread From: Uros Bizjak @ 2025-04-16 5:53 UTC (permalink / raw) To: David Laight Cc: linux-um, x86, linux-kernel, Richard Weinberger, Anton Ivanov, Johannes Berg, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin On Tue, Apr 15, 2025 at 7:56 PM David Laight <david.laight.linux@gmail.com> wrote: > > On Mon, 14 Apr 2025 16:55:57 +0200 > Uros Bizjak <ubizjak@gmail.com> wrote: > > > Current minimum required version of binutils is 2.25, > > which supports PAUSE instruction mnemonic. > > > > Replace "REP; NOP" with this proper mnemonic. > > > > No functional change intended. > > > > Signed-off-by: Uros Bizjak <ubizjak@gmail.com> > > Cc: Richard Weinberger <richard@nod.at> > > Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> > > Cc: Johannes Berg <johannes@sipsolutions.net> > > Cc: Thomas Gleixner <tglx@linutronix.de> > > Cc: Ingo Molnar <mingo@kernel.org> > > Cc: Borislav Petkov <bp@alien8.de> > > Cc: Dave Hansen <dave.hansen@linux.intel.com> > > Cc: "H. Peter Anvin" <hpa@zytor.com> > > --- > > arch/x86/um/asm/processor.h | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h > > index 478710384b34..233a7a0d29c9 100644 > > --- a/arch/x86/um/asm/processor.h > > +++ b/arch/x86/um/asm/processor.h > > @@ -24,7 +24,7 @@ > > /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ > > static __always_inline void rep_nop(void) > > { > > - __asm__ __volatile__("rep;nop": : :"memory"); > > + __asm__ __volatile__("pause": : :"memory"); > > } > > > > That only makes sense if you also change the function name. This function is used in several places, and is also defined for x86 in arch/x86/include/asm/vdso/processor.h. The renaming should be coordinated with x86 and should definitely be a separate patch. Uros. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] um/asm: Replace "REP; NOP" with PAUSE mnemonic 2025-04-16 5:53 ` Uros Bizjak @ 2025-04-16 6:57 ` Uros Bizjak 0 siblings, 0 replies; 4+ messages in thread From: Uros Bizjak @ 2025-04-16 6:57 UTC (permalink / raw) To: David Laight Cc: linux-um, x86, linux-kernel, Richard Weinberger, Anton Ivanov, Johannes Berg, Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, H. Peter Anvin [-- Attachment #1: Type: text/plain, Size: 1939 bytes --] On Wed, Apr 16, 2025 at 7:53 AM Uros Bizjak <ubizjak@gmail.com> wrote: > > On Tue, Apr 15, 2025 at 7:56 PM David Laight > <david.laight.linux@gmail.com> wrote: > > > > On Mon, 14 Apr 2025 16:55:57 +0200 > > Uros Bizjak <ubizjak@gmail.com> wrote: > > > > > Current minimum required version of binutils is 2.25, > > > which supports PAUSE instruction mnemonic. > > > > > > Replace "REP; NOP" with this proper mnemonic. > > > > > > No functional change intended. > > > > > > Signed-off-by: Uros Bizjak <ubizjak@gmail.com> > > > Cc: Richard Weinberger <richard@nod.at> > > > Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> > > > Cc: Johannes Berg <johannes@sipsolutions.net> > > > Cc: Thomas Gleixner <tglx@linutronix.de> > > > Cc: Ingo Molnar <mingo@kernel.org> > > > Cc: Borislav Petkov <bp@alien8.de> > > > Cc: Dave Hansen <dave.hansen@linux.intel.com> > > > Cc: "H. Peter Anvin" <hpa@zytor.com> > > > --- > > > arch/x86/um/asm/processor.h | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h > > > index 478710384b34..233a7a0d29c9 100644 > > > --- a/arch/x86/um/asm/processor.h > > > +++ b/arch/x86/um/asm/processor.h > > > @@ -24,7 +24,7 @@ > > > /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ > > > static __always_inline void rep_nop(void) > > > { > > > - __asm__ __volatile__("rep;nop": : :"memory"); > > > + __asm__ __volatile__("pause": : :"memory"); > > > } > > > > > > > That only makes sense if you also change the function name. > > This function is used in several places, and is also defined for x86 > in arch/x86/include/asm/vdso/processor.h. The renaming should be > coordinated with x86 and should definitely be a separate patch. Something like the attached patch that also moves (duplicated) function definition to a shared place. Uros. [-- Attachment #2: pause.diff.txt --] [-- Type: text/plain, Size: 2646 bytes --] diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h index 6266d6b9e0b8..59bd25ac7292 100644 --- a/arch/x86/include/asm/special_insns.h +++ b/arch/x86/include/asm/special_insns.h @@ -115,6 +115,12 @@ static inline void wrpkru(u32 pkru) } #endif +/* PAUSE is a good thing to insert into busy-wait loops. */ +static __always_inline void native_pause(void) +{ + asm volatile("pause": : :"memory"); +} + static __always_inline void wbinvd(void) { asm volatile("wbinvd": : :"memory"); diff --git a/arch/x86/include/asm/vdso/processor.h b/arch/x86/include/asm/vdso/processor.h index c9b2ba7a9ec4..169219864d61 100644 --- a/arch/x86/include/asm/vdso/processor.h +++ b/arch/x86/include/asm/vdso/processor.h @@ -7,15 +7,11 @@ #ifndef __ASSEMBLER__ -/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ -static __always_inline void rep_nop(void) -{ - asm volatile("rep; nop" ::: "memory"); -} +#include <asm/special_insns.h> static __always_inline void cpu_relax(void) { - rep_nop(); + native_pause(); } struct getcpu_cache; diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index eebc360ed1bb..ba5a4ccda37a 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -1486,7 +1486,7 @@ static void __init delay_with_tsc(void) * 1 GHz == 40 jiffies */ do { - rep_nop(); + native_pause(); now = rdtsc(); } while ((now - start) < 40000000000ULL / HZ && time_before_eq(jiffies, end)); } diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index e86eda2c0b04..eb2d2e1cbddd 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c @@ -75,7 +75,7 @@ static void delay_tsc(u64 cycles) /* Allow RT tasks to run */ preempt_enable(); - rep_nop(); + native_pause(); preempt_disable(); /* diff --git a/arch/x86/um/asm/processor.h b/arch/x86/um/asm/processor.h index 478710384b34..31d71198778e 100644 --- a/arch/x86/um/asm/processor.h +++ b/arch/x86/um/asm/processor.h @@ -19,21 +19,16 @@ #define ARCH_IS_STACKGROW(address) \ (address + 65536 + 32 * sizeof(unsigned long) >= UPT_SP(¤t->thread.regs.regs)) +#include <asm/special_insns.h> #include <asm/user.h> -/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ -static __always_inline void rep_nop(void) -{ - __asm__ __volatile__("rep;nop": : :"memory"); -} - static __always_inline void cpu_relax(void) { if (time_travel_mode == TT_MODE_INFCPU || time_travel_mode == TT_MODE_EXTERNAL) time_travel_ndelay(1); else - rep_nop(); + native_pause(); } #define task_pt_regs(t) (&(t)->thread.regs) ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-04-16 6:59 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-04-14 14:55 [PATCH] um/asm: Replace "REP; NOP" with PAUSE mnemonic Uros Bizjak 2025-04-15 17:55 ` David Laight 2025-04-16 5:53 ` Uros Bizjak 2025-04-16 6:57 ` Uros Bizjak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).