Re: [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
ieu.desnoy...@efficios.com>, Frederic Weisbecker , Len Brown , linux-xte...@linux-xtensa.org, Sascha Hauer , Vasily Gorbik , linux-arm-msm , linux-al...@vger.kernel.org, linux-m68k , Stafford Horne , Linux ARM , Chris Zankel , Stephen Boyd , dingu...@kernel.org, Daniel Bristot de Oliveira , Alexander Shishkin , Lorenzo Pieralisi , Rasmus Villemoes , Joel Fernandes , Will Deacon , Boris Ostrovsky , Kevin Hilman , linux-c...@vger.kernel.org, pv-driv...@vmware.com, linux-snps-...@lists.infradead.org, Mel Gorman , Jacob Pan , Arnd Bergmann , ulli.kr...@googlemail.com, vgu...@kernel.org, linux-clk , Josh Triplett , Steven Rostedt , r...@vger.kernel.org, Borislav Petkov , bc...@quicinc.com, Thomas Bogendoerfer , Parisc List , Sudeep Holla , Shawn Guo , David Miller , Rich Felker , Tony Lindgren , amakha...@vmware.com, Bjorn Andersson , "H. Peter Anvin" , sparcli...@vger.kernel.org, linux-hexa...@vger.kernel.org, linux-riscv , anton.iva...@cambridgegreys.com, jo...@southpole.se, Yury Norov , Richard Weinberger , the arch/x86 maintainers , Russell King - ARM Linux , Ingo Molnar , Al bert Ou , "Paul E. McKenney" < paul...@kernel.org>, Heiko Carstens , stefan.kristians...@saunalahti.fi, openr...@lists.librecores.org, Paul Walmsley , linux-tegra , namhy...@kernel.org, Andy Shevchenko , jpoim...@kernel.org, Juergen Gross , Michal Simek , "open list:BROADCOM NVRAM DRIVER" , Palmer Dabbelt , Anup Patel , i...@jurassic.park.msu.ru, Johannes Berg , linuxppc-dev Errors-To: linuxppc-dev-bounces+archive=mail-archive@lists.ozlabs.org Sender: "Linuxppc-dev" On Wed, Jun 8, 2022 at 4:46 PM Peter Zijlstra wrote: > > Current arch_cpu_idle() is called with IRQs disabled, but will return > with IRQs enabled. > > However, the very first thing the generic code does after calling > arch_cpu_idle() is raw_local_irq_disable(). This means that > architectures that can idle with IRQs disabled end up doing a > pointless 'enable-disable' dance. > > Therefore, push this IRQ disabling into the idle function, meaning > that those architectures can avoid the pointless IRQ state flipping. > > Signed-off-by: Peter Zijlstra (Intel) Acked-by: Rafael J. Wysocki > --- > arch/alpha/kernel/process.c |1 - > arch/arc/kernel/process.c|3 +++ > arch/arm/kernel/process.c|1 - > arch/arm/mach-gemini/board-dt.c |3 ++- > arch/arm64/kernel/idle.c |1 - > arch/csky/kernel/process.c |1 - > arch/csky/kernel/smp.c |2 +- > arch/hexagon/kernel/process.c|1 - > arch/ia64/kernel/process.c |1 + > arch/microblaze/kernel/process.c |1 - > arch/mips/kernel/idle.c |8 +++- > arch/nios2/kernel/process.c |1 - > arch/openrisc/kernel/process.c |1 + > arch/parisc/kernel/process.c |2 -- > arch/powerpc/kernel/idle.c |5 ++--- > arch/riscv/kernel/process.c |1 - > arch/s390/kernel/idle.c |1 - > arch/sh/kernel/idle.c|1 + > arch/sparc/kernel/leon_pmc.c |4 > arch/sparc/kernel/process_32.c |1 - > arch/sparc/kernel/process_64.c |3 ++- > arch/um/kernel/process.c |1 - > arch/x86/coco/tdx/tdx.c |3 +++ > arch/x86/kernel/process.c| 15 --- > arch/xtensa/kernel/process.c |1 + > kernel/sched/idle.c |2 -- > 26 files changed, 28 insertions(+), 37 deletions(-) > > --- a/arch/alpha/kernel/process.c > +++ b/arch/alpha/kernel/process.c > @@ -57,7 +57,6 @@ EXPORT_SYMBOL(pm_power_off); > void arch_cpu_idle(void) > { > wtint(0); > - raw_local_irq_enable(); > } > > void arch_cpu_idle_dead(void) > --- a/arch/arc/kernel/process.c > +++ b/arch/arc/kernel/process.c > @@ -114,6 +114,8 @@ void arch_cpu_idle(void) > "sleep %0 \n" > : > :"I"(arg)); /* can't be "r" has to be embedded const */ > + > + raw_local_irq_disable(); > } > > #else /* ARC700 */ > @@ -122,6 +124,7 @@ void arch_cpu_idle(void) > { > /* sleep, but enable both set E1/E2 (levels of interrupts) before > committing */ > __asm__ __volatile__("sleep 0x3 \n"); > + raw_local_irq_disable(); > } > > #endif > --- a/arch/arm/kernel/process.c > +++ b/arch/arm/kernel/process.c > @@ -78,7 +78,6 @@ void arch_cpu_idle(void) > arm_pm_idle(); > else > cpu_do_idle(); > - raw_local_irq_enable(); > } > > void arch_cpu_idle_prepare(void) > --- a/arch/arm/mach-gemini/board-dt.c > +++ b/arch/arm/mach-gemini/board-dt.c > @@ -42,8 +42,9 @@ static void gemini_idle(void) > */ > > /* FIXME: Enabling interrupts here is racy! */ > - local_irq_enable(); > + raw_local_irq_enable(); > cpu_do_idle(); > + raw_local_irq_disable(); > } > > static void __init gemini_init_machine(void) > --- a/arch/arm64/kernel/idle.c > +++
Re: [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
arndb.de>, ulli.kr...@googlemail.com, vgu...@kernel.org, linux-...@vger.kernel.org, j...@joshtriplett.org, rost...@goodmis.org, r...@vger.kernel.org, b...@alien8.de, bc...@quicinc.com, tsbog...@alpha.franken.de, linux-par...@vger.kernel.org, sudeep.ho...@arm.com, shawn...@kernel.org, da...@davemloft.net, dal...@libc.org, t...@atomide.com, amakha...@vmware.com, bjorn.anders...@linaro.org, h...@zytor.com, sparcli...@vger.kernel.org, linux-hexa...@vger.kernel.org, linux-ri...@lists.infradead.org, anton.iva...@cambridgegreys.com, jo...@southpole.se, yury.no...@gmail.com, rich...@nod.at, x...@kernel.org, li...@armlinux.org.uk, mi...@redhat.com, a...@eecs.berkeley.edu, paul...@kernel.org, h...@linux.ibm.com, stefan.kristians...@saunalahti.fi, openr...@lists.librecores.org, paul.walms...@sifive.com, linux-te...@vger.kernel.org, namhy...@kernel.org, andriy.shevche...@linux.intel.com, jpoim...@kernel.org, jgr...@suse.com, mon...@monstr.eu, linux-m...@vger.kernel.org, pal...@dabbelt.com, anup@brainfa ult.org, i...@jurassic.park.msu.ru, johan...@sipsolutions.net, linuxppc-dev@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+archive=mail-archive@lists.ozlabs.org Sender: "Linuxppc-dev" On Wed, Jun 08, 2022 at 04:27:43PM +0200, Peter Zijlstra wrote: > Current arch_cpu_idle() is called with IRQs disabled, but will return > with IRQs enabled. > > However, the very first thing the generic code does after calling > arch_cpu_idle() is raw_local_irq_disable(). This means that > architectures that can idle with IRQs disabled end up doing a > pointless 'enable-disable' dance. > > Therefore, push this IRQ disabling into the idle function, meaning > that those architectures can avoid the pointless IRQ state flipping. > > Signed-off-by: Peter Zijlstra (Intel) Nice! Acked-by: Mark Rutland [arm64] Mark. > --- > arch/alpha/kernel/process.c |1 - > arch/arc/kernel/process.c|3 +++ > arch/arm/kernel/process.c|1 - > arch/arm/mach-gemini/board-dt.c |3 ++- > arch/arm64/kernel/idle.c |1 - > arch/csky/kernel/process.c |1 - > arch/csky/kernel/smp.c |2 +- > arch/hexagon/kernel/process.c|1 - > arch/ia64/kernel/process.c |1 + > arch/microblaze/kernel/process.c |1 - > arch/mips/kernel/idle.c |8 +++- > arch/nios2/kernel/process.c |1 - > arch/openrisc/kernel/process.c |1 + > arch/parisc/kernel/process.c |2 -- > arch/powerpc/kernel/idle.c |5 ++--- > arch/riscv/kernel/process.c |1 - > arch/s390/kernel/idle.c |1 - > arch/sh/kernel/idle.c|1 + > arch/sparc/kernel/leon_pmc.c |4 > arch/sparc/kernel/process_32.c |1 - > arch/sparc/kernel/process_64.c |3 ++- > arch/um/kernel/process.c |1 - > arch/x86/coco/tdx/tdx.c |3 +++ > arch/x86/kernel/process.c| 15 --- > arch/xtensa/kernel/process.c |1 + > kernel/sched/idle.c |2 -- > 26 files changed, 28 insertions(+), 37 deletions(-) > > --- a/arch/alpha/kernel/process.c > +++ b/arch/alpha/kernel/process.c > @@ -57,7 +57,6 @@ EXPORT_SYMBOL(pm_power_off); > void arch_cpu_idle(void) > { > wtint(0); > - raw_local_irq_enable(); > } > > void arch_cpu_idle_dead(void) > --- a/arch/arc/kernel/process.c > +++ b/arch/arc/kernel/process.c > @@ -114,6 +114,8 @@ void arch_cpu_idle(void) > "sleep %0 \n" > : > :"I"(arg)); /* can't be "r" has to be embedded const */ > + > + raw_local_irq_disable(); > } > > #else/* ARC700 */ > @@ -122,6 +124,7 @@ void arch_cpu_idle(void) > { > /* sleep, but enable both set E1/E2 (levels of interrupts) before > committing */ > __asm__ __volatile__("sleep 0x3 \n"); > + raw_local_irq_disable(); > } > > #endif > --- a/arch/arm/kernel/process.c > +++ b/arch/arm/kernel/process.c > @@ -78,7 +78,6 @@ void arch_cpu_idle(void) > arm_pm_idle(); > else > cpu_do_idle(); > - raw_local_irq_enable(); > } > > void arch_cpu_idle_prepare(void) > --- a/arch/arm/mach-gemini/board-dt.c > +++ b/arch/arm/mach-gemini/board-dt.c > @@ -42,8 +42,9 @@ static void gemini_idle(void) >*/ > > /* FIXME: Enabling interrupts here is racy! */ > - local_irq_enable(); > + raw_local_irq_enable(); > cpu_do_idle(); > + raw_local_irq_disable(); > } > > static void __init gemini_init_machine(void) > --- a/arch/arm64/kernel/idle.c > +++ b/arch/arm64/kernel/idle.c > @@ -42,5 +42,4 @@ void noinstr arch_cpu_idle(void) >* tricks >*/ > cpu_do_idle(); > - raw_local_irq_enable(); > } > --- a/arch/csky/kernel/process.c > +++ b/arch/csky/kernel/process.c > @@ -101,6 +101,5 @@ void arch_cpu_idle(void) > #ifdef CONFIG_CPU_PM_STOP > asm volatile("stop\n"); > #endif > - raw_local_irq_enable(); > } >
Re: [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
o...@users.sourceforge.jp>, Linux-sh list , Fabio Estevam , Helge Deller , Daniel Lezcano , Jonathan Hunter , Mathieu Desnoyers , Frederic Weisbecker , Len Brown , "open list:TENSILICA XTENSA PORT \(xtensa\)" , Sascha Hauer , Vasily Gorbik , linux-arm-msm , alpha , linux-m68k , Stafford Horne , Linux ARM , Chris Zankel , Stephen Boyd , Dinh Nguyen , Daniel Bristot de Oliveira , Alexander Shishkin , lpieral...@kernel.org, Rasmus Villemoes , Joel Fernandes < j...@joelfernandes.org>, Will Deacon , Boris Ostrovsky , Kevin Hilman , linux-c...@vger.kernel.org, Pv-drivers , "open list:SYNOPSYS ARC ARCHITECTURE" , Mel Gorman , jacob.jun@linux.intel.com, Arnd Bergmann , Hans Ulli Kroll , Vineet Gupta , linux-clk , Josh Triplett , Steven Rostedt , r...@vger.kernel.org, Borislav Petkov , bc...@quicinc.com, Thomas Bogendoerfer , Parisc List , Sudeep Holla , Shawn Guo , David Miller , Rich Felker , Tony Lindgren , amakha...@vmware.com, Bjorn Andersson , "H. Peter Anvin" , sparclinux , "open l ist:QUALCOMM HEXAGON..." , linux-riscv , Anton Ivanov , Jonas Bonn , Yury Norov , Richard Weinberger , the arch/x86 maintainers , Russell King - ARM Linux , Ingo Molnar , Albert Ou , "Paul E. McKenney" , Heiko Carstens , Stefan Kristiansson , Openrisc , Paul Walmsley , "open list:TEGRA ARCHITECTURE SUPPORT" , Namhyung Kim , Andy Shevchenko , jpoim...@kernel.org, Juergen Gross , Michal Simek , "open list:BROADCOM NVRAM DRIVER" , Palmer Dabbelt , Anup Patel , Ivan Kokshaysky , Johannes Berg , linuxppc-dev Errors-To: linuxppc-dev-bounces+archive=mail-archive@lists.ozlabs.org Sender: "Linuxppc-dev" On Wed, Jun 8, 2022 at 4:27 PM Peter Zijlstra wrote: > > Current arch_cpu_idle() is called with IRQs disabled, but will return > with IRQs enabled. > > However, the very first thing the generic code does after calling > arch_cpu_idle() is raw_local_irq_disable(). This means that > architectures that can idle with IRQs disabled end up doing a > pointless 'enable-disable' dance. > > Therefore, push this IRQ disabling into the idle function, meaning > that those architectures can avoid the pointless IRQ state flipping. > > Signed-off-by: Peter Zijlstra (Intel) I think you now need to add the a raw_local_irq_disable(); in loongarch as well. Arnd
[PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
, Arnd Bergmann , ulli.kr...@googlemail.com, vgu...@kernel.org, linux-...@vger.kernel.org, j...@joshtriplett.org, rost...@goodmis.org, r...@vger.kernel.org, b...@alien8.de, bc...@quicinc.com, tsbog...@alpha.franken.de, linux-par...@vger.kernel.org, sudeep.ho...@arm.com, shawn...@kernel.org, da...@davemloft.net, dal...@libc.org, t...@atomide.com, amakha...@vmware.com, bjorn.anders...@linaro.org, h...@zytor.com, sparcli...@vger.kernel.org, linux-hexa...@vger.kernel.org, linux-ri...@lists.infradead.org, anton.iva...@cambridgegreys.com, jo...@southpole.se, yury.no...@gmail.com, rich...@nod.at, x...@kernel.org, li...@armlinux.org.uk, mi...@redhat.com, a...@eecs.berkeley.edu, paul...@kernel.org, h...@linux.ibm.com, stefan.kristians...@saunalahti.fi, openr...@lists.librecores.org, paul.walms...@sifive.com, linux-te...@vger.kernel.org, namhy...@kernel.org, andriy.shevche...@linux.intel.com, jpoim...@kernel.org, jgr...@suse.com, mon...@monstr.eu, linux-m...@vger.kernel.org, palmer@dab belt.com, a...@brainfault.org, i...@jurassic.park.msu.ru, johan...@sipsolutions.net, linuxppc-dev@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+archive=mail-archive@lists.ozlabs.org Sender: "Linuxppc-dev" Current arch_cpu_idle() is called with IRQs disabled, but will return with IRQs enabled. However, the very first thing the generic code does after calling arch_cpu_idle() is raw_local_irq_disable(). This means that architectures that can idle with IRQs disabled end up doing a pointless 'enable-disable' dance. Therefore, push this IRQ disabling into the idle function, meaning that those architectures can avoid the pointless IRQ state flipping. Signed-off-by: Peter Zijlstra (Intel) --- arch/alpha/kernel/process.c |1 - arch/arc/kernel/process.c|3 +++ arch/arm/kernel/process.c|1 - arch/arm/mach-gemini/board-dt.c |3 ++- arch/arm64/kernel/idle.c |1 - arch/csky/kernel/process.c |1 - arch/csky/kernel/smp.c |2 +- arch/hexagon/kernel/process.c|1 - arch/ia64/kernel/process.c |1 + arch/microblaze/kernel/process.c |1 - arch/mips/kernel/idle.c |8 +++- arch/nios2/kernel/process.c |1 - arch/openrisc/kernel/process.c |1 + arch/parisc/kernel/process.c |2 -- arch/powerpc/kernel/idle.c |5 ++--- arch/riscv/kernel/process.c |1 - arch/s390/kernel/idle.c |1 - arch/sh/kernel/idle.c|1 + arch/sparc/kernel/leon_pmc.c |4 arch/sparc/kernel/process_32.c |1 - arch/sparc/kernel/process_64.c |3 ++- arch/um/kernel/process.c |1 - arch/x86/coco/tdx/tdx.c |3 +++ arch/x86/kernel/process.c| 15 --- arch/xtensa/kernel/process.c |1 + kernel/sched/idle.c |2 -- 26 files changed, 28 insertions(+), 37 deletions(-) --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c @@ -57,7 +57,6 @@ EXPORT_SYMBOL(pm_power_off); void arch_cpu_idle(void) { wtint(0); - raw_local_irq_enable(); } void arch_cpu_idle_dead(void) --- a/arch/arc/kernel/process.c +++ b/arch/arc/kernel/process.c @@ -114,6 +114,8 @@ void arch_cpu_idle(void) "sleep %0 \n" : :"I"(arg)); /* can't be "r" has to be embedded const */ + + raw_local_irq_disable(); } #else /* ARC700 */ @@ -122,6 +124,7 @@ void arch_cpu_idle(void) { /* sleep, but enable both set E1/E2 (levels of interrupts) before committing */ __asm__ __volatile__("sleep 0x3 \n"); + raw_local_irq_disable(); } #endif --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -78,7 +78,6 @@ void arch_cpu_idle(void) arm_pm_idle(); else cpu_do_idle(); - raw_local_irq_enable(); } void arch_cpu_idle_prepare(void) --- a/arch/arm/mach-gemini/board-dt.c +++ b/arch/arm/mach-gemini/board-dt.c @@ -42,8 +42,9 @@ static void gemini_idle(void) */ /* FIXME: Enabling interrupts here is racy! */ - local_irq_enable(); + raw_local_irq_enable(); cpu_do_idle(); + raw_local_irq_disable(); } static void __init gemini_init_machine(void) --- a/arch/arm64/kernel/idle.c +++ b/arch/arm64/kernel/idle.c @@ -42,5 +42,4 @@ void noinstr arch_cpu_idle(void) * tricks */ cpu_do_idle(); - raw_local_irq_enable(); } --- a/arch/csky/kernel/process.c +++ b/arch/csky/kernel/process.c @@ -101,6 +101,5 @@ void arch_cpu_idle(void) #ifdef CONFIG_CPU_PM_STOP asm volatile("stop\n"); #endif - raw_local_irq_enable(); } #endif --- a/arch/csky/kernel/smp.c +++ b/arch/csky/kernel/smp.c @@ -314,7 +314,7 @@ void arch_cpu_idle_dead(void) while (!secondary_stack) arch_cpu_idle(); - local_irq_disable(); + raw_local_irq_disable(); asm volatile( "mov