virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/36] cpuidle,rcu: Cleanup the mess
@ 2022-06-08 14:27 Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 01/36] x86/perf/amd: Remove tracing from perf_lopwr_cb() Peter Zijlstra
                   ` (36 more replies)
  0 siblings, 37 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Hi All! (omg so many)

These here few patches mostly clear out the utter mess that is cpuidle vs rcuidle.

At the end of the ride there's only 2 real RCU_NONIDLE() users left

  arch/arm64/kernel/suspend.c:            RCU_NONIDLE(__cpu_suspend_exit());
  drivers/perf/arm_pmu.c:                 RCU_NONIDLE(armpmu_start(event, PERF_EF_RELOAD));
  kernel/cfi.c:   RCU_NONIDLE({

(the CFI one is likely dead in the kCFI rewrite) and there's only a hand full
of trace_.*_rcuidle() left:

  kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
  kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
  kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
  kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
  kernel/trace/trace_preemptirq.c:                trace_preempt_enable_rcuidle(a0, a1);
  kernel/trace/trace_preemptirq.c:                trace_preempt_disable_rcuidle(a0, a1);

All of them are in 'deprecated' code that is unused for GENERIC_ENTRY.

I've touched a _lot_ of code that I can't test and likely broken some of it :/
In particular, the whole ARM cpuidle stuff was quite involved with OMAP being
the absolute 'winner'.

I'm hoping Mark can help me sort the remaining ARM64 bits as he moves that to
GENERIC_ENTRY. I've also got a note that says ARM64 can probably do a WFE based
idle state and employ TIF_POLLING_NRFLAG to avoid some IPIs.

---
 arch/alpha/kernel/process.c          |    1 
 arch/alpha/kernel/vmlinux.lds.S      |    1 
 arch/arc/kernel/process.c            |    3 +
 arch/arc/kernel/vmlinux.lds.S        |    1 
 arch/arm/include/asm/vmlinux.lds.h   |    1 
 arch/arm/kernel/process.c            |    1 
 arch/arm/kernel/smp.c                |    6 +--
 arch/arm/mach-gemini/board-dt.c      |    3 +
 arch/arm/mach-imx/cpuidle-imx6q.c    |    4 +-
 arch/arm/mach-imx/cpuidle-imx6sx.c   |    5 ++
 arch/arm/mach-omap2/cpuidle34xx.c    |   16 ++++++++
 arch/arm/mach-omap2/cpuidle44xx.c    |   29 +++++++++------
 arch/arm/mach-omap2/pm.h             |    2 -
 arch/arm/mach-omap2/pm34xx.c         |   14 +++++--
 arch/arm/mach-omap2/powerdomain.c    |   10 ++---
 arch/arm64/kernel/idle.c             |    1 
 arch/arm64/kernel/smp.c              |    4 +-
 arch/arm64/kernel/vmlinux.lds.S      |    1 
 arch/csky/kernel/process.c           |    1 
 arch/csky/kernel/smp.c               |    2 -
 arch/csky/kernel/vmlinux.lds.S       |    1 
 arch/hexagon/kernel/process.c        |    1 
 arch/hexagon/kernel/vmlinux.lds.S    |    1 
 arch/ia64/kernel/process.c           |    1 
 arch/ia64/kernel/vmlinux.lds.S       |    1 
 arch/loongarch/kernel/vmlinux.lds.S  |    1 
 arch/m68k/kernel/vmlinux-nommu.lds   |    1 
 arch/m68k/kernel/vmlinux-std.lds     |    1 
 arch/m68k/kernel/vmlinux-sun3.lds    |    1 
 arch/microblaze/kernel/process.c     |    1 
 arch/microblaze/kernel/vmlinux.lds.S |    1 
 arch/mips/kernel/idle.c              |    8 +---
 arch/mips/kernel/vmlinux.lds.S       |    1 
 arch/nios2/kernel/process.c          |    1 
 arch/nios2/kernel/vmlinux.lds.S      |    1 
 arch/openrisc/kernel/process.c       |    1 
 arch/openrisc/kernel/vmlinux.lds.S   |    1 
 arch/parisc/kernel/process.c         |    2 -
 arch/parisc/kernel/vmlinux.lds.S     |    1 
 arch/powerpc/kernel/idle.c           |    5 +-
 arch/powerpc/kernel/vmlinux.lds.S    |    1 
 arch/riscv/kernel/process.c          |    1 
 arch/riscv/kernel/vmlinux-xip.lds.S  |    1 
 arch/riscv/kernel/vmlinux.lds.S      |    1 
 arch/s390/kernel/idle.c              |    1 
 arch/s390/kernel/vmlinux.lds.S       |    1 
 arch/sh/kernel/idle.c                |    1 
 arch/sh/kernel/vmlinux.lds.S         |    1 
 arch/sparc/kernel/leon_pmc.c         |    4 ++
 arch/sparc/kernel/process_32.c       |    1 
 arch/sparc/kernel/process_64.c       |    3 +
 arch/sparc/kernel/vmlinux.lds.S      |    1 
 arch/um/kernel/dyn.lds.S             |    1 
 arch/um/kernel/process.c             |    1 
 arch/um/kernel/uml.lds.S             |    1 
 arch/x86/coco/tdx/tdcall.S           |   15 +-------
 arch/x86/coco/tdx/tdx.c              |   25 +++----------
 arch/x86/events/amd/brs.c            |   13 ++-----
 arch/x86/include/asm/irqflags.h      |   11 ++---
 arch/x86/include/asm/mwait.h         |   14 +++----
 arch/x86/include/asm/nospec-branch.h |    2 -
 arch/x86/include/asm/paravirt.h      |    6 ++-
 arch/x86/include/asm/perf_event.h    |    2 -
 arch/x86/include/asm/shared/io.h     |    4 +-
 arch/x86/include/asm/shared/tdx.h    |    1 
 arch/x86/include/asm/special_insns.h |    6 +--
 arch/x86/include/asm/xen/hypercall.h |    2 -
 arch/x86/kernel/paravirt.c           |   14 ++++++-
 arch/x86/kernel/process.c            |   65 +++++++++++++++++------------------
 arch/x86/kernel/vmlinux.lds.S        |    1 
 arch/x86/xen/enlighten_pv.c          |    2 -
 arch/x86/xen/irq.c                   |    2 -
 arch/xtensa/kernel/process.c         |    1 
 arch/xtensa/kernel/vmlinux.lds.S     |    1 
 drivers/acpi/processor_idle.c        |   46 ++++++++++++++----------
 drivers/base/power/runtime.c         |   24 ++++++------
 drivers/clk/clk.c                    |    8 ++--
 drivers/cpuidle/cpuidle-arm.c        |    1 
 drivers/cpuidle/cpuidle-big_little.c |    8 +++-
 drivers/cpuidle/cpuidle-mvebu-v7.c   |    7 +++
 drivers/cpuidle/cpuidle-psci.c       |   10 +++--
 drivers/cpuidle/cpuidle-qcom-spm.c   |    1 
 drivers/cpuidle/cpuidle-riscv-sbi.c  |   10 +++--
 drivers/cpuidle/cpuidle-tegra.c      |   21 ++++++++---
 drivers/cpuidle/cpuidle.c            |   21 +++++------
 drivers/cpuidle/dt_idle_states.c     |    2 -
 drivers/cpuidle/poll_state.c         |   10 ++++-
 drivers/idle/intel_idle.c            |   29 ++++++++++++---
 include/asm-generic/vmlinux.lds.h    |    9 +---
 include/linux/compiler_types.h       |    8 +++-
 include/linux/cpu.h                  |    3 -
 include/linux/cpuidle.h              |   33 +++++++++++++++++
 include/linux/cpumask.h              |    4 +-
 include/linux/sched/idle.h           |   40 ++++++++++++++++-----
 include/linux/thread_info.h          |   18 +++++++++
 include/linux/tracepoint.h           |   13 ++++++-
 kernel/cpu_pm.c                      |    9 ----
 kernel/printk/printk.c               |    2 -
 kernel/rcu/tree.c                    |    9 +---
 kernel/sched/idle.c                  |   47 +++++++------------------
 kernel/time/tick-broadcast-hrtimer.c |   29 ++++++---------
 kernel/time/tick-broadcast.c         |    6 ++-
 kernel/trace/trace.c                 |    3 +
 tools/objtool/check.c                |   15 +++++++-
 104 files changed, 449 insertions(+), 342 deletions(-)

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 01/36] x86/perf/amd: Remove tracing from perf_lopwr_cb()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 02/36] x86/idle: Replace x86_idle with a static_call Peter Zijlstra
                   ` (35 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

The perf_lopwr_cb() is called from the idle routines; there is no RCU
there, we must not enter tracing.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/events/amd/brs.c         |   13 +++++--------
 arch/x86/include/asm/perf_event.h |    2 +-
 2 files changed, 6 insertions(+), 9 deletions(-)

--- a/arch/x86/events/amd/brs.c
+++ b/arch/x86/events/amd/brs.c
@@ -41,18 +41,15 @@ static inline unsigned int brs_to(int id
 	return MSR_AMD_SAMP_BR_FROM + 2 * idx + 1;
 }
 
-static inline void set_debug_extn_cfg(u64 val)
+static __always_inline void set_debug_extn_cfg(u64 val)
 {
 	/* bits[4:3] must always be set to 11b */
-	wrmsrl(MSR_AMD_DBG_EXTN_CFG, val | 3ULL << 3);
+	__wrmsr(MSR_AMD_DBG_EXTN_CFG, val | 3ULL << 3, val >> 32);
 }
 
-static inline u64 get_debug_extn_cfg(void)
+static __always_inline u64 get_debug_extn_cfg(void)
 {
-	u64 val;
-
-	rdmsrl(MSR_AMD_DBG_EXTN_CFG, val);
-	return val;
+	return __rdmsr(MSR_AMD_DBG_EXTN_CFG);
 }
 
 static bool __init amd_brs_detect(void)
@@ -338,7 +335,7 @@ void amd_pmu_brs_sched_task(struct perf_
  * called from ACPI processor_idle.c or acpi_pad.c
  * with interrupts disabled
  */
-void perf_amd_brs_lopwr_cb(bool lopwr_in)
+void noinstr perf_amd_brs_lopwr_cb(bool lopwr_in)
 {
 	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 	union amd_debug_extn_cfg cfg;
--- a/arch/x86/include/asm/perf_event.h
+++ b/arch/x86/include/asm/perf_event.h
@@ -554,7 +554,7 @@ extern void perf_amd_brs_lopwr_cb(bool l
 
 DECLARE_STATIC_CALL(perf_lopwr_cb, perf_amd_brs_lopwr_cb);
 
-static inline void perf_lopwr_cb(bool lopwr_in)
+static __always_inline void perf_lopwr_cb(bool lopwr_in)
 {
 	static_call_mod(perf_lopwr_cb)(lopwr_in);
 }


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 02/36] x86/idle: Replace x86_idle with a static_call
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 01/36] x86/perf/amd: Remove tracing from perf_lopwr_cb() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 18:13   ` Rafael J. Wysocki
  2022-06-08 14:27 ` [PATCH 03/36] cpuidle/poll: Ensure IRQ state is invariant Peter Zijlstra
                   ` (34 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Typical boot time setup; no need to suffer an indirect call for that.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
---
 arch/x86/kernel/process.c |   50 +++++++++++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 22 deletions(-)

--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -24,6 +24,7 @@
 #include <linux/cpuidle.h>
 #include <linux/acpi.h>
 #include <linux/elf-randomize.h>
+#include <linux/static_call.h>
 #include <trace/events/power.h>
 #include <linux/hw_breakpoint.h>
 #include <asm/cpu.h>
@@ -692,7 +693,23 @@ void __switch_to_xtra(struct task_struct
 unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
 EXPORT_SYMBOL(boot_option_idle_override);
 
-static void (*x86_idle)(void);
+/*
+ * We use this if we don't have any better idle routine..
+ */
+void __cpuidle default_idle(void)
+{
+	raw_safe_halt();
+}
+#if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
+EXPORT_SYMBOL(default_idle);
+#endif
+
+DEFINE_STATIC_CALL_NULL(x86_idle, default_idle);
+
+static bool x86_idle_set(void)
+{
+	return !!static_call_query(x86_idle);
+}
 
 #ifndef CONFIG_SMP
 static inline void play_dead(void)
@@ -715,28 +732,17 @@ void arch_cpu_idle_dead(void)
 /*
  * Called from the generic idle code.
  */
-void arch_cpu_idle(void)
-{
-	x86_idle();
-}
-
-/*
- * We use this if we don't have any better idle routine..
- */
-void __cpuidle default_idle(void)
+void __cpuidle arch_cpu_idle(void)
 {
-	raw_safe_halt();
+	static_call(x86_idle)();
 }
-#if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
-EXPORT_SYMBOL(default_idle);
-#endif
 
 #ifdef CONFIG_XEN
 bool xen_set_default_idle(void)
 {
-	bool ret = !!x86_idle;
+	bool ret = x86_idle_set();
 
-	x86_idle = default_idle;
+	static_call_update(x86_idle, default_idle);
 
 	return ret;
 }
@@ -859,20 +865,20 @@ void select_idle_routine(const struct cp
 	if (boot_option_idle_override == IDLE_POLL && smp_num_siblings > 1)
 		pr_warn_once("WARNING: polling idle and HT enabled, performance may degrade\n");
 #endif
-	if (x86_idle || boot_option_idle_override == IDLE_POLL)
+	if (x86_idle_set() || boot_option_idle_override == IDLE_POLL)
 		return;
 
 	if (boot_cpu_has_bug(X86_BUG_AMD_E400)) {
 		pr_info("using AMD E400 aware idle routine\n");
-		x86_idle = amd_e400_idle;
+		static_call_update(x86_idle, amd_e400_idle);
 	} else if (prefer_mwait_c1_over_halt(c)) {
 		pr_info("using mwait in idle threads\n");
-		x86_idle = mwait_idle;
+		static_call_update(x86_idle, mwait_idle);
 	} else if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST)) {
 		pr_info("using TDX aware idle routine\n");
-		x86_idle = tdx_safe_halt;
+		static_call_update(x86_idle, tdx_safe_halt);
 	} else
-		x86_idle = default_idle;
+		static_call_update(x86_idle, default_idle);
 }
 
 void amd_e400_c1e_apic_setup(void)
@@ -925,7 +931,7 @@ static int __init idle_setup(char *str)
 		 * To continue to load the CPU idle driver, don't touch
 		 * the boot_option_idle_override.
 		 */
-		x86_idle = default_idle;
+		static_call_update(x86_idle, default_idle);
 		boot_option_idle_override = IDLE_HALT;
 	} else if (!strcmp(str, "nomwait")) {
 		/*


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 03/36] cpuidle/poll: Ensure IRQ state is invariant
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 01/36] x86/perf/amd: Remove tracing from perf_lopwr_cb() Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 02/36] x86/idle: Replace x86_idle with a static_call Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-07-06 13:51   ` Rafael J. Wysocki
  2022-06-08 14:27 ` [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE Peter Zijlstra
                   ` (33 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

cpuidle_state::enter() methods should be IRQ invariant

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/poll_state.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

--- a/drivers/cpuidle/poll_state.c
+++ b/drivers/cpuidle/poll_state.c
@@ -17,7 +17,7 @@ static int __cpuidle poll_idle(struct cp
 
 	dev->poll_time_limit = false;
 
-	local_irq_enable();
+	raw_local_irq_enable();
 	if (!current_set_polling_and_test()) {
 		unsigned int loop_count = 0;
 		u64 limit;
@@ -36,6 +36,8 @@ static int __cpuidle poll_idle(struct cp
 			}
 		}
 	}
+	raw_local_irq_disable();
+
 	current_clr_polling();
 
 	return index;


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (2 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 03/36] cpuidle/poll: Ensure IRQ state is invariant Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 15:01   ` Rafael J. Wysocki
                     ` (2 more replies)
  2022-06-08 14:27 ` [PATCH 05/36] cpuidle: Move IRQ state validation Peter Zijlstra
                   ` (32 subsequent siblings)
  36 siblings, 3 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
Xeons") wrecked intel_idle in two ways:

 - must not have tracing in idle functions
 - must return with IRQs disabled

Additionally, it added a branch for no good reason.

Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/idle/intel_idle.c |   48 +++++++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 11 deletions(-)

--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -129,21 +137,37 @@ static unsigned int mwait_substates __in
  *
  * Must be called under local_irq_disable().
  */
+
-static __cpuidle int intel_idle(struct cpuidle_device *dev,
-				struct cpuidle_driver *drv, int index)
+static __always_inline int __intel_idle(struct cpuidle_device *dev,
+					struct cpuidle_driver *drv, int index)
 {
 	struct cpuidle_state *state = &drv->states[index];
 	unsigned long eax = flg2MWAIT(state->flags);
 	unsigned long ecx = 1; /* break on interrupt flag */
 
-	if (state->flags & CPUIDLE_FLAG_IRQ_ENABLE)
-		local_irq_enable();
-
 	mwait_idle_with_hints(eax, ecx);
 
 	return index;
 }
 
+static __cpuidle int intel_idle(struct cpuidle_device *dev,
+				struct cpuidle_driver *drv, int index)
+{
+	return __intel_idle(dev, drv, index);
+}
+
+static __cpuidle int intel_idle_irq(struct cpuidle_device *dev,
+				    struct cpuidle_driver *drv, int index)
+{
+	int ret;
+
+	raw_local_irq_enable();
+	ret = __intel_idle(dev, drv, index);
+	raw_local_irq_disable();
+
+	return ret;
+}
+
 /**
  * intel_idle_s2idle - Ask the processor to enter the given idle state.
  * @dev: cpuidle device of the target CPU.
@@ -1801,6 +1824,9 @@ static void __init intel_idle_init_cstat
 		/* Structure copy. */
 		drv->states[drv->state_count] = cpuidle_state_table[cstate];
 
+		if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_IRQ_ENABLE)
+			drv->states[drv->state_count].enter = intel_idle_irq;
+
 		if ((disabled_states_mask & BIT(drv->state_count)) ||
 		    ((icpu->use_acpi || force_use_acpi) &&
 		     intel_idle_off_by_default(mwait_hint) &&


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 05/36] cpuidle: Move IRQ state validation
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (3 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-07-06 13:54   ` Rafael J. Wysocki
  2022-06-08 14:27 ` [PATCH 06/36] cpuidle,riscv: Push RCU-idle into driver Peter Zijlstra
                   ` (31 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Make cpuidle_enter_state() consistent with the s2idle variant and
verify ->enter() always returns with interrupts disabled.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/cpuidle.c |   10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -234,7 +234,11 @@ int cpuidle_enter_state(struct cpuidle_d
 	stop_critical_timings();
 	if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
 		rcu_idle_enter();
+
 	entered_state = target_state->enter(dev, drv, index);
+	if (WARN_ONCE(!irqs_disabled(), "%ps leaked IRQ state", target_state->enter))
+		raw_local_irq_disable();
+
 	if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
 		rcu_idle_exit();
 	start_critical_timings();
@@ -246,12 +250,8 @@ int cpuidle_enter_state(struct cpuidle_d
 	/* The cpu is no longer idle or about to enter idle. */
 	sched_idle_set_state(NULL);
 
-	if (broadcast) {
-		if (WARN_ON_ONCE(!irqs_disabled()))
-			local_irq_disable();
-
+	if (broadcast)
 		tick_broadcast_exit();
-	}
 
 	if (!cpuidle_state_is_coupled(drv, index))
 		local_irq_enable();


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 06/36] cpuidle,riscv: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (4 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 05/36] cpuidle: Move IRQ state validation Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 07/36] cpuidle,tegra: " Peter Zijlstra
                   ` (30 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again, at least twice, before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/cpuidle-riscv-sbi.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

--- a/drivers/cpuidle/cpuidle-riscv-sbi.c
+++ b/drivers/cpuidle/cpuidle-riscv-sbi.c
@@ -116,12 +116,12 @@ static int __sbi_enter_domain_idle_state
 		return -1;
 
 	/* Do runtime PM to manage a hierarchical CPU toplogy. */
-	rcu_irq_enter_irqson();
 	if (s2idle)
 		dev_pm_genpd_suspend(pd_dev);
 	else
 		pm_runtime_put_sync_suspend(pd_dev);
-	rcu_irq_exit_irqson();
+
+	rcu_idle_enter();
 
 	if (sbi_is_domain_state_available())
 		state = sbi_get_domain_state();
@@ -130,12 +130,12 @@ static int __sbi_enter_domain_idle_state
 
 	ret = sbi_suspend(state) ? -1 : idx;
 
-	rcu_irq_enter_irqson();
+	rcu_idle_exit();
+
 	if (s2idle)
 		dev_pm_genpd_resume(pd_dev);
 	else
 		pm_runtime_get_sync(pd_dev);
-	rcu_irq_exit_irqson();
 
 	cpu_pm_exit();
 
@@ -246,6 +246,7 @@ static int sbi_dt_cpu_init_topology(stru
 	 * of a shared state for the domain, assumes the domain states are all
 	 * deeper states.
 	 */
+	drv->states[state_count - 1].flags |= CPUIDLE_FLAG_RCU_IDLE;
 	drv->states[state_count - 1].enter = sbi_enter_domain_idle_state;
 	drv->states[state_count - 1].enter_s2idle =
 					sbi_enter_s2idle_domain_idle_state;


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 07/36] cpuidle,tegra: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (5 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 06/36] cpuidle,riscv: Push RCU-idle into driver Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 08/36] cpuidle,psci: " Peter Zijlstra
                   ` (29 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again, at least twice, before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/cpuidle-tegra.c |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

--- a/drivers/cpuidle/cpuidle-tegra.c
+++ b/drivers/cpuidle/cpuidle-tegra.c
@@ -180,9 +180,11 @@ static int tegra_cpuidle_state_enter(str
 	}
 
 	local_fiq_disable();
-	RCU_NONIDLE(tegra_pm_set_cpu_in_lp2());
+	tegra_pm_set_cpu_in_lp2();
 	cpu_pm_enter();
 
+	rcu_idle_enter();
+
 	switch (index) {
 	case TEGRA_C7:
 		err = tegra_cpuidle_c7_enter();
@@ -197,8 +199,10 @@ static int tegra_cpuidle_state_enter(str
 		break;
 	}
 
+	rcu_idle_exit();
+
 	cpu_pm_exit();
-	RCU_NONIDLE(tegra_pm_clear_cpu_in_lp2());
+	tegra_pm_clear_cpu_in_lp2();
 	local_fiq_enable();
 
 	return err ?: index;
@@ -226,6 +230,7 @@ static int tegra_cpuidle_enter(struct cp
 			       struct cpuidle_driver *drv,
 			       int index)
 {
+	bool do_rcu = drv->states[index].flags & CPUIDLE_FLAG_RCU_IDLE;
 	unsigned int cpu = cpu_logical_map(dev->cpu);
 	int ret;
 
@@ -233,9 +238,13 @@ static int tegra_cpuidle_enter(struct cp
 	if (dev->states_usage[index].disable)
 		return -1;
 
-	if (index == TEGRA_C1)
+	if (index == TEGRA_C1) {
+		if (do_rcu)
+			rcu_idle_enter();
 		ret = arm_cpuidle_simple_enter(dev, drv, index);
-	else
+		if (do_rcu)
+			rcu_idle_exit();
+	} else
 		ret = tegra_cpuidle_state_enter(dev, index, cpu);
 
 	if (ret < 0) {
@@ -285,7 +294,8 @@ static struct cpuidle_driver tegra_idle_
 			.exit_latency		= 2000,
 			.target_residency	= 2200,
 			.power_usage		= 100,
-			.flags			= CPUIDLE_FLAG_TIMER_STOP,
+			.flags			= CPUIDLE_FLAG_TIMER_STOP |
+						  CPUIDLE_FLAG_RCU_IDLE,
 			.name			= "C7",
 			.desc			= "CPU core powered off",
 		},
@@ -295,6 +305,7 @@ static struct cpuidle_driver tegra_idle_
 			.target_residency	= 10000,
 			.power_usage		= 0,
 			.flags			= CPUIDLE_FLAG_TIMER_STOP |
+						  CPUIDLE_FLAG_RCU_IDLE   |
 						  CPUIDLE_FLAG_COUPLED,
 			.name			= "CC6",
 			.desc			= "CPU cluster powered off",


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 08/36] cpuidle,psci: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (6 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 07/36] cpuidle,tegra: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 09/36] cpuidle,imx6: " Peter Zijlstra
                   ` (28 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again, at least twice, before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/cpuidle-psci.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

--- a/drivers/cpuidle/cpuidle-psci.c
+++ b/drivers/cpuidle/cpuidle-psci.c
@@ -69,12 +69,12 @@ static int __psci_enter_domain_idle_stat
 		return -1;
 
 	/* Do runtime PM to manage a hierarchical CPU toplogy. */
-	rcu_irq_enter_irqson();
 	if (s2idle)
 		dev_pm_genpd_suspend(pd_dev);
 	else
 		pm_runtime_put_sync_suspend(pd_dev);
-	rcu_irq_exit_irqson();
+
+	rcu_idle_enter();
 
 	state = psci_get_domain_state();
 	if (!state)
@@ -82,12 +82,12 @@ static int __psci_enter_domain_idle_stat
 
 	ret = psci_cpu_suspend_enter(state) ? -1 : idx;
 
-	rcu_irq_enter_irqson();
+	rcu_idle_exit();
+
 	if (s2idle)
 		dev_pm_genpd_resume(pd_dev);
 	else
 		pm_runtime_get_sync(pd_dev);
-	rcu_irq_exit_irqson();
 
 	cpu_pm_exit();
 
@@ -240,6 +240,7 @@ static int psci_dt_cpu_init_topology(str
 	 * of a shared state for the domain, assumes the domain states are all
 	 * deeper states.
 	 */
+	drv->states[state_count - 1].flags |= CPUIDLE_FLAG_RCU_IDLE;
 	drv->states[state_count - 1].enter = psci_enter_domain_idle_state;
 	drv->states[state_count - 1].enter_s2idle = psci_enter_s2idle_domain_idle_state;
 	psci_cpuidle_use_cpuhp = true;


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 09/36] cpuidle,imx6: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (7 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 08/36] cpuidle,psci: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 10/36] cpuidle,omap3: " Peter Zijlstra
                   ` (27 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again, at least twice, before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-imx/cpuidle-imx6sx.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

--- a/arch/arm/mach-imx/cpuidle-imx6sx.c
+++ b/arch/arm/mach-imx/cpuidle-imx6sx.c
@@ -47,7 +47,9 @@ static int imx6sx_enter_wait(struct cpui
 		cpu_pm_enter();
 		cpu_cluster_pm_enter();
 
+		rcu_idle_enter();
 		cpu_suspend(0, imx6sx_idle_finish);
+		rcu_idle_exit();
 
 		cpu_cluster_pm_exit();
 		cpu_pm_exit();
@@ -87,7 +89,8 @@ static struct cpuidle_driver imx6sx_cpui
 			 */
 			.exit_latency = 300,
 			.target_residency = 500,
-			.flags = CPUIDLE_FLAG_TIMER_STOP,
+			.flags = CPUIDLE_FLAG_TIMER_STOP |
+				 CPUIDLE_FLAG_RCU_IDLE,
 			.enter = imx6sx_enter_wait,
 			.name = "LOW-POWER-IDLE",
 			.desc = "ARM power off",


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 10/36] cpuidle,omap3: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (8 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 09/36] cpuidle,imx6: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 11/36] cpuidle,armada: " Peter Zijlstra
                   ` (26 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then teporarily enable it
again before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-omap2/cpuidle34xx.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -133,7 +133,9 @@ static int omap3_enter_idle(struct cpuid
 	}
 
 	/* Execute ARM wfi */
+	rcu_idle_enter();
 	omap_sram_idle();
+	rcu_idle_exit();
 
 	/*
 	 * Call idle CPU PM enter notifier chain to restore
@@ -265,6 +267,7 @@ static struct cpuidle_driver omap3_idle_
 	.owner            = THIS_MODULE,
 	.states = {
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 2 + 2,
 			.target_residency = 5,
@@ -272,6 +275,7 @@ static struct cpuidle_driver omap3_idle_
 			.desc		  = "MPU ON + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 10 + 10,
 			.target_residency = 30,
@@ -279,6 +283,7 @@ static struct cpuidle_driver omap3_idle_
 			.desc		  = "MPU ON + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 50 + 50,
 			.target_residency = 300,
@@ -286,6 +291,7 @@ static struct cpuidle_driver omap3_idle_
 			.desc		  = "MPU RET + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 1500 + 1800,
 			.target_residency = 4000,
@@ -293,6 +299,7 @@ static struct cpuidle_driver omap3_idle_
 			.desc		  = "MPU OFF + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 2500 + 7500,
 			.target_residency = 12000,
@@ -300,6 +307,7 @@ static struct cpuidle_driver omap3_idle_
 			.desc		  = "MPU RET + CORE RET",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 3000 + 8500,
 			.target_residency = 15000,
@@ -307,6 +315,7 @@ static struct cpuidle_driver omap3_idle_
 			.desc		  = "MPU OFF + CORE RET",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 10000 + 30000,
 			.target_residency = 30000,
@@ -328,6 +337,7 @@ static struct cpuidle_driver omap3430_id
 	.owner            = THIS_MODULE,
 	.states = {
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 110 + 162,
 			.target_residency = 5,
@@ -335,6 +345,7 @@ static struct cpuidle_driver omap3430_id
 			.desc		  = "MPU ON + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 106 + 180,
 			.target_residency = 309,
@@ -342,6 +353,7 @@ static struct cpuidle_driver omap3430_id
 			.desc		  = "MPU ON + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 107 + 410,
 			.target_residency = 46057,
@@ -349,6 +361,7 @@ static struct cpuidle_driver omap3430_id
 			.desc		  = "MPU RET + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 121 + 3374,
 			.target_residency = 46057,
@@ -356,6 +369,7 @@ static struct cpuidle_driver omap3430_id
 			.desc		  = "MPU OFF + CORE ON",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 855 + 1146,
 			.target_residency = 46057,
@@ -363,6 +377,7 @@ static struct cpuidle_driver omap3430_id
 			.desc		  = "MPU RET + CORE RET",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 7580 + 4134,
 			.target_residency = 484329,
@@ -370,6 +385,7 @@ static struct cpuidle_driver omap3430_id
 			.desc		  = "MPU OFF + CORE RET",
 		},
 		{
+			.flags		  = CPUIDLE_FLAG_RCU_IDLE,
 			.enter		  = omap3_enter_idle_bm,
 			.exit_latency	  = 7505 + 15274,
 			.target_residency = 484329,


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 11/36] cpuidle,armada: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (9 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 10/36] cpuidle,omap3: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 12/36] cpuidle,omap2: " Peter Zijlstra
                   ` (25 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/cpuidle-mvebu-v7.c |    7 +++++++
 1 file changed, 7 insertions(+)

--- a/drivers/cpuidle/cpuidle-mvebu-v7.c
+++ b/drivers/cpuidle/cpuidle-mvebu-v7.c
@@ -36,7 +36,10 @@ static int mvebu_v7_enter_idle(struct cp
 	if (drv->states[index].flags & MVEBU_V7_FLAG_DEEP_IDLE)
 		deepidle = true;
 
+	rcu_idle_enter();
 	ret = mvebu_v7_cpu_suspend(deepidle);
+	rcu_idle_exit();
+
 	cpu_pm_exit();
 
 	if (ret)
@@ -49,6 +52,7 @@ static struct cpuidle_driver armadaxp_id
 	.name			= "armada_xp_idle",
 	.states[0]		= ARM_CPUIDLE_WFI_STATE,
 	.states[1]		= {
+		.flags			= CPUIDLE_FLAG_RCU_IDLE,
 		.enter			= mvebu_v7_enter_idle,
 		.exit_latency		= 100,
 		.power_usage		= 50,
@@ -57,6 +61,7 @@ static struct cpuidle_driver armadaxp_id
 		.desc			= "CPU power down",
 	},
 	.states[2]		= {
+		.flags			= CPUIDLE_FLAG_RCU_IDLE,
 		.enter			= mvebu_v7_enter_idle,
 		.exit_latency		= 1000,
 		.power_usage		= 5,
@@ -72,6 +77,7 @@ static struct cpuidle_driver armada370_i
 	.name			= "armada_370_idle",
 	.states[0]		= ARM_CPUIDLE_WFI_STATE,
 	.states[1]		= {
+		.flags			= CPUIDLE_FLAG_RCU_IDLE,
 		.enter			= mvebu_v7_enter_idle,
 		.exit_latency		= 100,
 		.power_usage		= 5,
@@ -87,6 +93,7 @@ static struct cpuidle_driver armada38x_i
 	.name			= "armada_38x_idle",
 	.states[0]		= ARM_CPUIDLE_WFI_STATE,
 	.states[1]		= {
+		.flags			= CPUIDLE_FLAG_RCU_IDLE,
 		.enter			= mvebu_v7_enter_idle,
 		.exit_latency		= 10,
 		.power_usage		= 5,


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 12/36] cpuidle,omap2: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (10 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 11/36] cpuidle,armada: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 13/36] cpuidle,dt: " Peter Zijlstra
                   ` (24 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again, some *four* times, before going idle is daft.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-omap2/cpuidle44xx.c |   29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

--- a/arch/arm/mach-omap2/cpuidle44xx.c
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
@@ -105,7 +105,9 @@ static int omap_enter_idle_smp(struct cp
 	}
 	raw_spin_unlock_irqrestore(&mpu_lock, flag);
 
+	rcu_idle_enter();
 	omap4_enter_lowpower(dev->cpu, cx->cpu_state);
+	rcu_idle_exit();
 
 	raw_spin_lock_irqsave(&mpu_lock, flag);
 	if (cx->mpu_state_vote == num_online_cpus())
@@ -151,10 +153,10 @@ static int omap_enter_idle_coupled(struc
 				 (cx->mpu_logic_state == PWRDM_POWER_OFF);
 
 	/* Enter broadcast mode for periodic timers */
-	RCU_NONIDLE(tick_broadcast_enable());
+	tick_broadcast_enable();
 
 	/* Enter broadcast mode for one-shot timers */
-	RCU_NONIDLE(tick_broadcast_enter());
+	tick_broadcast_enter();
 
 	/*
 	 * Call idle CPU PM enter notifier chain so that
@@ -166,7 +168,7 @@ static int omap_enter_idle_coupled(struc
 
 	if (dev->cpu == 0) {
 		pwrdm_set_logic_retst(mpu_pd, cx->mpu_logic_state);
-		RCU_NONIDLE(omap_set_pwrdm_state(mpu_pd, cx->mpu_state));
+		omap_set_pwrdm_state(mpu_pd, cx->mpu_state);
 
 		/*
 		 * Call idle CPU cluster PM enter notifier chain
@@ -178,14 +180,16 @@ static int omap_enter_idle_coupled(struc
 				index = 0;
 				cx = state_ptr + index;
 				pwrdm_set_logic_retst(mpu_pd, cx->mpu_logic_state);
-				RCU_NONIDLE(omap_set_pwrdm_state(mpu_pd, cx->mpu_state));
+				omap_set_pwrdm_state(mpu_pd, cx->mpu_state);
 				mpuss_can_lose_context = 0;
 			}
 		}
 	}
 
+	rcu_idle_enter();
 	omap4_enter_lowpower(dev->cpu, cx->cpu_state);
 	cpu_done[dev->cpu] = true;
+	rcu_idle_exit();
 
 	/* Wakeup CPU1 only if it is not offlined */
 	if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {
@@ -194,9 +198,9 @@ static int omap_enter_idle_coupled(struc
 		    mpuss_can_lose_context)
 			gic_dist_disable();
 
-		RCU_NONIDLE(clkdm_deny_idle(cpu_clkdm[1]));
-		RCU_NONIDLE(omap_set_pwrdm_state(cpu_pd[1], PWRDM_POWER_ON));
-		RCU_NONIDLE(clkdm_allow_idle(cpu_clkdm[1]));
+		clkdm_deny_idle(cpu_clkdm[1]);
+		omap_set_pwrdm_state(cpu_pd[1], PWRDM_POWER_ON);
+		clkdm_allow_idle(cpu_clkdm[1]);
 
 		if (IS_PM44XX_ERRATUM(PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD) &&
 		    mpuss_can_lose_context) {
@@ -222,7 +226,7 @@ static int omap_enter_idle_coupled(struc
 	cpu_pm_exit();
 
 cpu_pm_out:
-	RCU_NONIDLE(tick_broadcast_exit());
+	tick_broadcast_exit();
 
 fail:
 	cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
@@ -247,7 +251,8 @@ static struct cpuidle_driver omap4_idle_
 			/* C2 - CPU0 OFF + CPU1 OFF + MPU CSWR */
 			.exit_latency = 328 + 440,
 			.target_residency = 960,
-			.flags = CPUIDLE_FLAG_COUPLED,
+			.flags = CPUIDLE_FLAG_COUPLED |
+				 CPUIDLE_FLAG_RCU_IDLE,
 			.enter = omap_enter_idle_coupled,
 			.name = "C2",
 			.desc = "CPUx OFF, MPUSS CSWR",
@@ -256,7 +261,8 @@ static struct cpuidle_driver omap4_idle_
 			/* C3 - CPU0 OFF + CPU1 OFF + MPU OSWR */
 			.exit_latency = 460 + 518,
 			.target_residency = 1100,
-			.flags = CPUIDLE_FLAG_COUPLED,
+			.flags = CPUIDLE_FLAG_COUPLED |
+				 CPUIDLE_FLAG_RCU_IDLE,
 			.enter = omap_enter_idle_coupled,
 			.name = "C3",
 			.desc = "CPUx OFF, MPUSS OSWR",
@@ -282,7 +288,8 @@ static struct cpuidle_driver omap5_idle_
 			/* C2 - CPU0 RET + CPU1 RET + MPU CSWR */
 			.exit_latency = 48 + 60,
 			.target_residency = 100,
-			.flags = CPUIDLE_FLAG_TIMER_STOP,
+			.flags = CPUIDLE_FLAG_TIMER_STOP |
+				 CPUIDLE_FLAG_RCU_IDLE,
 			.enter = omap_enter_idle_smp,
 			.name = "C2",
 			.desc = "CPUx CSWR, MPUSS CSWR",


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 13/36] cpuidle,dt: Push RCU-idle into driver
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (11 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 12/36] cpuidle,omap2: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage Peter Zijlstra
                   ` (23 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Doing RCU-idle outside the driver, only to then temporarily enable it
again before going idle is daft.

Notably: this converts all dt_init_idle_driver() and
__CPU_PM_CPU_IDLE_ENTER() users for they are inextrably intertwined.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-omap2/cpuidle34xx.c    |    4 ++--
 drivers/acpi/processor_idle.c        |    2 ++
 drivers/cpuidle/cpuidle-arm.c        |    1 +
 drivers/cpuidle/cpuidle-big_little.c |    8 ++++++--
 drivers/cpuidle/cpuidle-psci.c       |    1 +
 drivers/cpuidle/cpuidle-qcom-spm.c   |    1 +
 drivers/cpuidle/cpuidle-riscv-sbi.c  |    1 +
 drivers/cpuidle/dt_idle_states.c     |    2 +-
 include/linux/cpuidle.h              |    4 ++++
 9 files changed, 19 insertions(+), 5 deletions(-)

--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -1200,6 +1200,8 @@ static int acpi_processor_setup_lpi_stat
 		state->target_residency = lpi->min_residency;
 		if (lpi->arch_flags)
 			state->flags |= CPUIDLE_FLAG_TIMER_STOP;
+		if (lpi->entry_method == ACPI_CSTATE_FFH)
+			state->flags |= CPUIDLE_FLAG_RCU_IDLE;
 		state->enter = acpi_idle_lpi_enter;
 		drv->safe_state_index = i;
 	}
--- a/drivers/cpuidle/cpuidle-arm.c
+++ b/drivers/cpuidle/cpuidle-arm.c
@@ -53,6 +53,7 @@ static struct cpuidle_driver arm_idle_dr
 	 * handler for idle state index 0.
 	 */
 	.states[0] = {
+		.flags			= CPUIDLE_FLAG_RCU_IDLE,
 		.enter                  = arm_enter_idle_state,
 		.exit_latency           = 1,
 		.target_residency       = 1,
--- a/drivers/cpuidle/cpuidle-big_little.c
+++ b/drivers/cpuidle/cpuidle-big_little.c
@@ -64,7 +64,8 @@ static struct cpuidle_driver bl_idle_lit
 		.enter			= bl_enter_powerdown,
 		.exit_latency		= 700,
 		.target_residency	= 2500,
-		.flags			= CPUIDLE_FLAG_TIMER_STOP,
+		.flags			= CPUIDLE_FLAG_TIMER_STOP |
+					  CPUIDLE_FLAG_RCU_IDLE,
 		.name			= "C1",
 		.desc			= "ARM little-cluster power down",
 	},
@@ -85,7 +86,8 @@ static struct cpuidle_driver bl_idle_big
 		.enter			= bl_enter_powerdown,
 		.exit_latency		= 500,
 		.target_residency	= 2000,
-		.flags			= CPUIDLE_FLAG_TIMER_STOP,
+		.flags			= CPUIDLE_FLAG_TIMER_STOP |
+					  CPUIDLE_FLAG_RCU_IDLE,
 		.name			= "C1",
 		.desc			= "ARM big-cluster power down",
 	},
@@ -124,11 +126,13 @@ static int bl_enter_powerdown(struct cpu
 				struct cpuidle_driver *drv, int idx)
 {
 	cpu_pm_enter();
+	rcu_idle_enter();
 
 	cpu_suspend(0, bl_powerdown_finisher);
 
 	/* signals the MCPM core that CPU is out of low power state */
 	mcpm_cpu_powered_up();
+	rcu_idle_exit();
 
 	cpu_pm_exit();
 
--- a/drivers/cpuidle/cpuidle-psci.c
+++ b/drivers/cpuidle/cpuidle-psci.c
@@ -357,6 +357,7 @@ static int psci_idle_init_cpu(struct dev
 	 * PSCI idle states relies on architectural WFI to be represented as
 	 * state index 0.
 	 */
+	drv->states[0].flags = CPUIDLE_FLAG_RCU_IDLE;
 	drv->states[0].enter = psci_enter_idle_state;
 	drv->states[0].exit_latency = 1;
 	drv->states[0].target_residency = 1;
--- a/drivers/cpuidle/cpuidle-qcom-spm.c
+++ b/drivers/cpuidle/cpuidle-qcom-spm.c
@@ -72,6 +72,7 @@ static struct cpuidle_driver qcom_spm_id
 	.owner = THIS_MODULE,
 	.states[0] = {
 		.enter			= spm_enter_idle_state,
+		.flags			= CPUIDLE_FLAG_RCU_IDLE,
 		.exit_latency		= 1,
 		.target_residency	= 1,
 		.power_usage		= UINT_MAX,
--- a/drivers/cpuidle/cpuidle-riscv-sbi.c
+++ b/drivers/cpuidle/cpuidle-riscv-sbi.c
@@ -332,6 +332,7 @@ static int sbi_cpuidle_init_cpu(struct d
 	drv->cpumask = (struct cpumask *)cpumask_of(cpu);
 
 	/* RISC-V architectural WFI to be represented as state index 0. */
+	drv->states[0].flags = CPUIDLE_FLAG_RCU_IDLE;
 	drv->states[0].enter = sbi_cpuidle_enter_state;
 	drv->states[0].exit_latency = 1;
 	drv->states[0].target_residency = 1;
--- a/drivers/cpuidle/dt_idle_states.c
+++ b/drivers/cpuidle/dt_idle_states.c
@@ -77,7 +77,7 @@ static int init_state_node(struct cpuidl
 	if (err)
 		desc = state_node->name;
 
-	idle_state->flags = 0;
+	idle_state->flags = CPUIDLE_FLAG_RCU_IDLE;
 	if (of_property_read_bool(state_node, "local-timer-stop"))
 		idle_state->flags |= CPUIDLE_FLAG_TIMER_STOP;
 	/*
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -282,14 +282,18 @@ extern s64 cpuidle_governor_latency_req(
 	int __ret = 0;							\
 									\
 	if (!idx) {							\
+		rcu_idle_enter();					\
 		cpu_do_idle();						\
+		rcu_idle_exit();					\
 		return idx;						\
 	}								\
 									\
 	if (!is_retention)						\
 		__ret =  cpu_pm_enter();				\
 	if (!__ret) {							\
+		rcu_idle_enter();					\
 		__ret = low_level_idle_enter(state);			\
+		rcu_idle_exit();					\
 		if (!is_retention)					\
 			cpu_pm_exit();					\
 	}								\


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (12 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 13/36] cpuidle,dt: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-14 12:41   ` Mark Rutland
  2022-06-08 14:27 ` [PATCH 15/36] cpuidle, cpu_pm: Remove RCU fiddling from cpu_pm_{enter, exit}() Peter Zijlstra
                   ` (22 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

The whole disable-RCU, enable-IRQS dance is very intricate since
changing IRQ state is traced, which depends on RCU.

Add two helpers for the cpuidle case that mirror the entry code.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-imx/cpuidle-imx6q.c    |    4 +--
 arch/arm/mach-imx/cpuidle-imx6sx.c   |    4 +--
 arch/arm/mach-omap2/cpuidle34xx.c    |    4 +--
 arch/arm/mach-omap2/cpuidle44xx.c    |    8 +++---
 drivers/acpi/processor_idle.c        |   18 ++++++++------
 drivers/cpuidle/cpuidle-big_little.c |    4 +--
 drivers/cpuidle/cpuidle-mvebu-v7.c   |    4 +--
 drivers/cpuidle/cpuidle-psci.c       |    4 +--
 drivers/cpuidle/cpuidle-riscv-sbi.c  |    4 +--
 drivers/cpuidle/cpuidle-tegra.c      |    8 +++---
 drivers/cpuidle/cpuidle.c            |   11 ++++----
 include/linux/cpuidle.h              |   37 +++++++++++++++++++++++++---
 kernel/sched/idle.c                  |   45 ++++++++++-------------------------
 kernel/time/tick-broadcast.c         |    6 +++-
 14 files changed, 90 insertions(+), 71 deletions(-)

--- a/arch/arm/mach-imx/cpuidle-imx6q.c
+++ b/arch/arm/mach-imx/cpuidle-imx6q.c
@@ -24,9 +24,9 @@ static int imx6q_enter_wait(struct cpuid
 		imx6_set_lpm(WAIT_UNCLOCKED);
 	raw_spin_unlock(&cpuidle_lock);
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 	cpu_do_idle();
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	raw_spin_lock(&cpuidle_lock);
 	if (num_idle_cpus-- == num_online_cpus())
--- a/arch/arm/mach-imx/cpuidle-imx6sx.c
+++ b/arch/arm/mach-imx/cpuidle-imx6sx.c
@@ -47,9 +47,9 @@ static int imx6sx_enter_wait(struct cpui
 		cpu_pm_enter();
 		cpu_cluster_pm_enter();
 
-		rcu_idle_enter();
+		cpuidle_rcu_enter();
 		cpu_suspend(0, imx6sx_idle_finish);
-		rcu_idle_exit();
+		cpuidle_rcu_exit();
 
 		cpu_cluster_pm_exit();
 		cpu_pm_exit();
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -133,9 +133,9 @@ static int omap3_enter_idle(struct cpuid
 	}
 
 	/* Execute ARM wfi */
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 	omap_sram_idle();
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	/*
 	 * Call idle CPU PM enter notifier chain to restore
--- a/arch/arm/mach-omap2/cpuidle44xx.c
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
@@ -105,9 +105,9 @@ static int omap_enter_idle_smp(struct cp
 	}
 	raw_spin_unlock_irqrestore(&mpu_lock, flag);
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 	omap4_enter_lowpower(dev->cpu, cx->cpu_state);
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	raw_spin_lock_irqsave(&mpu_lock, flag);
 	if (cx->mpu_state_vote == num_online_cpus())
@@ -186,10 +186,10 @@ static int omap_enter_idle_coupled(struc
 		}
 	}
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 	omap4_enter_lowpower(dev->cpu, cx->cpu_state);
 	cpu_done[dev->cpu] = true;
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	/* Wakeup CPU1 only if it is not offlined */
 	if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -607,7 +607,7 @@ static DEFINE_RAW_SPINLOCK(c3_lock);
  * @cx: Target state context
  * @index: index of target state
  */
-static int acpi_idle_enter_bm(struct cpuidle_driver *drv,
+static noinstr int acpi_idle_enter_bm(struct cpuidle_driver *drv,
 			       struct acpi_processor *pr,
 			       struct acpi_processor_cx *cx,
 			       int index)
@@ -626,6 +626,8 @@ static int acpi_idle_enter_bm(struct cpu
 	 */
 	bool dis_bm = pr->flags.bm_control;
 
+	instrumentation_begin();
+
 	/* If we can skip BM, demote to a safe state. */
 	if (!cx->bm_sts_skip && acpi_idle_bm_check()) {
 		dis_bm = false;
@@ -647,11 +649,11 @@ static int acpi_idle_enter_bm(struct cpu
 		raw_spin_unlock(&c3_lock);
 	}
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 
 	acpi_idle_do_entry(cx);
 
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	/* Re-enable bus master arbitration */
 	if (dis_bm) {
@@ -661,11 +663,13 @@ static int acpi_idle_enter_bm(struct cpu
 		raw_spin_unlock(&c3_lock);
 	}
 
+	instrumentation_end();
+
 	return index;
 }
 
-static int acpi_idle_enter(struct cpuidle_device *dev,
-			   struct cpuidle_driver *drv, int index)
+static noinstr int acpi_idle_enter(struct cpuidle_device *dev,
+				   struct cpuidle_driver *drv, int index)
 {
 	struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu);
 	struct acpi_processor *pr;
@@ -693,8 +697,8 @@ static int acpi_idle_enter(struct cpuidl
 	return index;
 }
 
-static int acpi_idle_enter_s2idle(struct cpuidle_device *dev,
-				  struct cpuidle_driver *drv, int index)
+static noinstr int acpi_idle_enter_s2idle(struct cpuidle_device *dev,
+					  struct cpuidle_driver *drv, int index)
 {
 	struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu);
 
--- a/drivers/cpuidle/cpuidle-big_little.c
+++ b/drivers/cpuidle/cpuidle-big_little.c
@@ -126,13 +126,13 @@ static int bl_enter_powerdown(struct cpu
 				struct cpuidle_driver *drv, int idx)
 {
 	cpu_pm_enter();
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 
 	cpu_suspend(0, bl_powerdown_finisher);
 
 	/* signals the MCPM core that CPU is out of low power state */
 	mcpm_cpu_powered_up();
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	cpu_pm_exit();
 
--- a/drivers/cpuidle/cpuidle-mvebu-v7.c
+++ b/drivers/cpuidle/cpuidle-mvebu-v7.c
@@ -36,9 +36,9 @@ static int mvebu_v7_enter_idle(struct cp
 	if (drv->states[index].flags & MVEBU_V7_FLAG_DEEP_IDLE)
 		deepidle = true;
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 	ret = mvebu_v7_cpu_suspend(deepidle);
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	cpu_pm_exit();
 
--- a/drivers/cpuidle/cpuidle-psci.c
+++ b/drivers/cpuidle/cpuidle-psci.c
@@ -74,7 +74,7 @@ static int __psci_enter_domain_idle_stat
 	else
 		pm_runtime_put_sync_suspend(pd_dev);
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 
 	state = psci_get_domain_state();
 	if (!state)
@@ -82,7 +82,7 @@ static int __psci_enter_domain_idle_stat
 
 	ret = psci_cpu_suspend_enter(state) ? -1 : idx;
 
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	if (s2idle)
 		dev_pm_genpd_resume(pd_dev);
--- a/drivers/cpuidle/cpuidle-riscv-sbi.c
+++ b/drivers/cpuidle/cpuidle-riscv-sbi.c
@@ -121,7 +121,7 @@ static int __sbi_enter_domain_idle_state
 	else
 		pm_runtime_put_sync_suspend(pd_dev);
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 
 	if (sbi_is_domain_state_available())
 		state = sbi_get_domain_state();
@@ -130,7 +130,7 @@ static int __sbi_enter_domain_idle_state
 
 	ret = sbi_suspend(state) ? -1 : idx;
 
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	if (s2idle)
 		dev_pm_genpd_resume(pd_dev);
--- a/drivers/cpuidle/cpuidle-tegra.c
+++ b/drivers/cpuidle/cpuidle-tegra.c
@@ -183,7 +183,7 @@ static int tegra_cpuidle_state_enter(str
 	tegra_pm_set_cpu_in_lp2();
 	cpu_pm_enter();
 
-	rcu_idle_enter();
+	cpuidle_rcu_enter();
 
 	switch (index) {
 	case TEGRA_C7:
@@ -199,7 +199,7 @@ static int tegra_cpuidle_state_enter(str
 		break;
 	}
 
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 
 	cpu_pm_exit();
 	tegra_pm_clear_cpu_in_lp2();
@@ -240,10 +240,10 @@ static int tegra_cpuidle_enter(struct cp
 
 	if (index == TEGRA_C1) {
 		if (do_rcu)
-			rcu_idle_enter();
+			cpuidle_rcu_enter();
 		ret = arm_cpuidle_simple_enter(dev, drv, index);
 		if (do_rcu)
-			rcu_idle_exit();
+			cpuidle_rcu_exit();
 	} else
 		ret = tegra_cpuidle_state_enter(dev, index, cpu);
 
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -13,6 +13,7 @@
 #include <linux/mutex.h>
 #include <linux/sched.h>
 #include <linux/sched/clock.h>
+#include <linux/sched/idle.h>
 #include <linux/notifier.h>
 #include <linux/pm_qos.h>
 #include <linux/cpu.h>
@@ -150,12 +151,12 @@ static void enter_s2idle_proper(struct c
 	 */
 	stop_critical_timings();
 	if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
-		rcu_idle_enter();
+		cpuidle_rcu_enter();
 	target_state->enter_s2idle(dev, drv, index);
 	if (WARN_ON_ONCE(!irqs_disabled()))
-		local_irq_disable();
+		raw_local_irq_disable();
 	if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
-		rcu_idle_exit();
+		cpuidle_rcu_exit();
 	tick_unfreeze();
 	start_critical_timings();
 
@@ -233,14 +234,14 @@ int cpuidle_enter_state(struct cpuidle_d
 
 	stop_critical_timings();
 	if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
-		rcu_idle_enter();
+		cpuidle_rcu_enter();
 
 	entered_state = target_state->enter(dev, drv, index);
 	if (WARN_ONCE(!irqs_disabled(), "%ps leaked IRQ state", target_state->enter))
 		raw_local_irq_disable();
 
 	if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
-		rcu_idle_exit();
+		cpuidle_rcu_exit();
 	start_critical_timings();
 
 	sched_clock_idle_wakeup_event();
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -115,6 +115,35 @@ struct cpuidle_device {
 DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
 DECLARE_PER_CPU(struct cpuidle_device, cpuidle_dev);
 
+static __always_inline void cpuidle_rcu_enter(void)
+{
+	lockdep_assert_irqs_disabled();
+	/*
+	 * Idle is allowed to (temporary) enable IRQs. It
+	 * will return with IRQs disabled.
+	 *
+	 * Trace IRQs enable here, then switch off RCU, and have
+	 * arch_cpu_idle() use raw_local_irq_enable(). Note that
+	 * rcu_idle_enter() relies on lockdep IRQ state, so switch that
+	 * last -- this is very similar to the entry code.
+	 */
+	trace_hardirqs_on_prepare();
+	lockdep_hardirqs_on_prepare();
+	instrumentation_end();
+	rcu_idle_enter();
+	lockdep_hardirqs_on(_THIS_IP_);
+}
+
+static __always_inline void cpuidle_rcu_exit(void)
+{
+	/*
+	 * Carefully undo the above.
+	 */
+	lockdep_hardirqs_off(_THIS_IP_);
+	rcu_idle_exit();
+	instrumentation_begin();
+}
+
 /****************************
  * CPUIDLE DRIVER INTERFACE *
  ****************************/
@@ -282,18 +311,18 @@ extern s64 cpuidle_governor_latency_req(
 	int __ret = 0;							\
 									\
 	if (!idx) {							\
-		rcu_idle_enter();					\
+		cpuidle_rcu_enter();					\
 		cpu_do_idle();						\
-		rcu_idle_exit();					\
+		cpuidle_rcu_exit();					\
 		return idx;						\
 	}								\
 									\
 	if (!is_retention)						\
 		__ret =  cpu_pm_enter();				\
 	if (!__ret) {							\
-		rcu_idle_enter();					\
+		cpuidle_rcu_enter();					\
 		__ret = low_level_idle_enter(state);			\
-		rcu_idle_exit();					\
+		cpuidle_rcu_exit();					\
 		if (!is_retention)					\
 			cpu_pm_exit();					\
 	}								\
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -51,18 +51,22 @@ __setup("hlt", cpu_idle_nopoll_setup);
 
 static noinline int __cpuidle cpu_idle_poll(void)
 {
+	instrumentation_begin();
 	trace_cpu_idle(0, smp_processor_id());
 	stop_critical_timings();
-	rcu_idle_enter();
-	local_irq_enable();
+	cpuidle_rcu_enter();
 
+	raw_local_irq_enable();
 	while (!tif_need_resched() &&
 	       (cpu_idle_force_poll || tick_check_broadcast_expired()))
 		cpu_relax();
+	raw_local_irq_disable();
 
-	rcu_idle_exit();
+	cpuidle_rcu_exit();
 	start_critical_timings();
 	trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
+	local_irq_enable();
+	instrumentation_end();
 
 	return 1;
 }
@@ -85,44 +89,21 @@ void __weak arch_cpu_idle(void)
  */
 void __cpuidle default_idle_call(void)
 {
-	if (current_clr_polling_and_test()) {
-		local_irq_enable();
-	} else {
-
+	instrumentation_begin();
+	if (!current_clr_polling_and_test()) {
 		trace_cpu_idle(1, smp_processor_id());
 		stop_critical_timings();
 
-		/*
-		 * arch_cpu_idle() is supposed to enable IRQs, however
-		 * we can't do that because of RCU and tracing.
-		 *
-		 * Trace IRQs enable here, then switch off RCU, and have
-		 * arch_cpu_idle() use raw_local_irq_enable(). Note that
-		 * rcu_idle_enter() relies on lockdep IRQ state, so switch that
-		 * last -- this is very similar to the entry code.
-		 */
-		trace_hardirqs_on_prepare();
-		lockdep_hardirqs_on_prepare();
-		rcu_idle_enter();
-		lockdep_hardirqs_on(_THIS_IP_);
-
+		cpuidle_rcu_enter();
 		arch_cpu_idle();
-
-		/*
-		 * OK, so IRQs are enabled here, but RCU needs them disabled to
-		 * turn itself back on.. funny thing is that disabling IRQs
-		 * will cause tracing, which needs RCU. Jump through hoops to
-		 * make it 'work'.
-		 */
 		raw_local_irq_disable();
-		lockdep_hardirqs_off(_THIS_IP_);
-		rcu_idle_exit();
-		lockdep_hardirqs_on(_THIS_IP_);
-		raw_local_irq_enable();
+		cpuidle_rcu_exit();
 
 		start_critical_timings();
 		trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id());
 	}
+	local_irq_enable();
+	instrumentation_end();
 }
 
 static int call_cpuidle_s2idle(struct cpuidle_driver *drv,
--- a/kernel/time/tick-broadcast.c
+++ b/kernel/time/tick-broadcast.c
@@ -622,9 +622,13 @@ struct cpumask *tick_get_broadcast_onesh
  * to avoid a deep idle transition as we are about to get the
  * broadcast IPI right away.
  */
-int tick_check_broadcast_expired(void)
+noinstr int tick_check_broadcast_expired(void)
 {
+#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H
+	return arch_test_bit(smp_processor_id(), cpumask_bits(tick_broadcast_force_mask));
+#else
 	return cpumask_test_cpu(smp_processor_id(), tick_broadcast_force_mask);
+#endif
 }
 
 /*


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 15/36] cpuidle, cpu_pm: Remove RCU fiddling from cpu_pm_{enter, exit}()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (13 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-14 16:13   ` [PATCH 15/36] cpuidle,cpu_pm: Remove RCU fiddling from cpu_pm_{enter,exit}() Mark Rutland
  2022-06-08 14:27 ` [PATCH 16/36] rcu: Fix rcu_idle_exit() Peter Zijlstra
                   ` (21 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

All callers should still have RCU enabled.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 kernel/cpu_pm.c |    9 ---------
 1 file changed, 9 deletions(-)

--- a/kernel/cpu_pm.c
+++ b/kernel/cpu_pm.c
@@ -30,16 +30,9 @@ static int cpu_pm_notify(enum cpu_pm_eve
 {
 	int ret;
 
-	/*
-	 * This introduces a RCU read critical section, which could be
-	 * disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know
-	 * this.
-	 */
-	rcu_irq_enter_irqson();
 	rcu_read_lock();
 	ret = raw_notifier_call_chain(&cpu_pm_notifier.chain, event, NULL);
 	rcu_read_unlock();
-	rcu_irq_exit_irqson();
 
 	return notifier_to_errno(ret);
 }
@@ -49,11 +42,9 @@ static int cpu_pm_notify_robust(enum cpu
 	unsigned long flags;
 	int ret;
 
-	rcu_irq_enter_irqson();
 	raw_spin_lock_irqsave(&cpu_pm_notifier.lock, flags);
 	ret = raw_notifier_call_chain_robust(&cpu_pm_notifier.chain, event_up, event_down, NULL);
 	raw_spin_unlock_irqrestore(&cpu_pm_notifier.lock, flags);
-	rcu_irq_exit_irqson();
 
 	return notifier_to_errno(ret);
 }


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 16/36] rcu: Fix rcu_idle_exit()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (14 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 15/36] cpuidle, cpu_pm: Remove RCU fiddling from cpu_pm_{enter, exit}() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-14 16:14   ` Mark Rutland
  2022-06-08 14:27 ` [PATCH 17/36] acpi_idle: Remove tracing Peter Zijlstra
                   ` (20 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Current rcu_idle_exit() is terminally broken because it uses
local_irq_{save,restore}(), which are traced which uses RCU.

However, now that all the callers are sure to have IRQs disabled, we
can remove these calls.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/tree.c |    9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -659,7 +659,7 @@ static noinstr void rcu_eqs_enter(bool u
  * If you add or remove a call to rcu_idle_enter(), be sure to test with
  * CONFIG_RCU_EQS_DEBUG=y.
  */
-void rcu_idle_enter(void)
+void noinstr rcu_idle_enter(void)
 {
 	lockdep_assert_irqs_disabled();
 	rcu_eqs_enter(false);
@@ -896,13 +896,10 @@ static void noinstr rcu_eqs_exit(bool us
  * If you add or remove a call to rcu_idle_exit(), be sure to test with
  * CONFIG_RCU_EQS_DEBUG=y.
  */
-void rcu_idle_exit(void)
+void noinstr rcu_idle_exit(void)
 {
-	unsigned long flags;
-
-	local_irq_save(flags);
+	lockdep_assert_irqs_disabled();
 	rcu_eqs_exit(false);
-	local_irq_restore(flags);
 }
 EXPORT_SYMBOL_GPL(rcu_idle_exit);
 


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 17/36] acpi_idle: Remove tracing
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (15 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 16/36] rcu: Fix rcu_idle_exit() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-07-06 13:59   ` Rafael J. Wysocki
  2022-06-08 14:27 ` [PATCH 18/36] cpuidle: Annotate poll_idle() Peter Zijlstra
                   ` (19 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

All the idle routines are called with RCU disabled, as such there must
not be any tracing inside.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/acpi/processor_idle.c |   24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -108,8 +108,8 @@ static const struct dmi_system_id proces
 static void __cpuidle acpi_safe_halt(void)
 {
 	if (!tif_need_resched()) {
-		safe_halt();
-		local_irq_disable();
+		raw_safe_halt();
+		raw_local_irq_disable();
 	}
 }
 
@@ -524,16 +524,21 @@ static int acpi_idle_bm_check(void)
 	return bm_status;
 }
 
-static void wait_for_freeze(void)
+static __cpuidle void io_idle(unsigned long addr)
 {
+	/* IO port based C-state */
+	inb(addr);
+
 #ifdef	CONFIG_X86
 	/* No delay is needed if we are in guest */
 	if (boot_cpu_has(X86_FEATURE_HYPERVISOR))
 		return;
 #endif
-	/* Dummy wait op - must do something useless after P_LVL2 read
-	   because chipsets cannot guarantee that STPCLK# signal
-	   gets asserted in time to freeze execution properly. */
+	/*
+	 * Dummy wait op - must do something useless after P_LVL2 read
+	 * because chipsets cannot guarantee that STPCLK# signal
+	 * gets asserted in time to freeze execution properly.
+	 */
 	inl(acpi_gbl_FADT.xpm_timer_block.address);
 }
 
@@ -553,9 +558,7 @@ static void __cpuidle acpi_idle_do_entry
 	} else if (cx->entry_method == ACPI_CSTATE_HALT) {
 		acpi_safe_halt();
 	} else {
-		/* IO port based C-state */
-		inb(cx->address);
-		wait_for_freeze();
+		io_idle(cx->address);
 	}
 
 	perf_lopwr_cb(false);
@@ -577,8 +580,7 @@ static int acpi_idle_play_dead(struct cp
 		if (cx->entry_method == ACPI_CSTATE_HALT)
 			safe_halt();
 		else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) {
-			inb(cx->address);
-			wait_for_freeze();
+			io_idle(cx->address);
 		} else
 			return -ENODEV;
 


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 18/36] cpuidle: Annotate poll_idle()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (16 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 17/36] acpi_idle: Remove tracing Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-07-06 14:00   ` Rafael J. Wysocki
  2022-06-08 14:27 ` [PATCH 19/36] objtool/idle: Validate __cpuidle code as noinstr Peter Zijlstra
                   ` (18 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

The __cpuidle functions will become a noinstr class, as such they need
explicit annotations.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/cpuidle/poll_state.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

--- a/drivers/cpuidle/poll_state.c
+++ b/drivers/cpuidle/poll_state.c
@@ -13,7 +13,10 @@
 static int __cpuidle poll_idle(struct cpuidle_device *dev,
 			       struct cpuidle_driver *drv, int index)
 {
-	u64 time_start = local_clock();
+	u64 time_start;
+
+	instrumentation_begin();
+	time_start = local_clock();
 
 	dev->poll_time_limit = false;
 
@@ -39,6 +42,7 @@ static int __cpuidle poll_idle(struct cp
 	raw_local_irq_disable();
 
 	current_clr_polling();
+	instrumentation_end();
 
 	return index;
 }


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 19/36] objtool/idle: Validate __cpuidle code as noinstr
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (17 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 18/36] cpuidle: Annotate poll_idle() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-07-06  9:46   ` Geert Uytterhoeven
  2022-06-08 14:27 ` [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour Peter Zijlstra
                   ` (17 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Idle code is very like entry code in that RCU isn't available. As
such, add a little validation.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/alpha/kernel/vmlinux.lds.S      |    1 -
 arch/arc/kernel/vmlinux.lds.S        |    1 -
 arch/arm/include/asm/vmlinux.lds.h   |    1 -
 arch/arm64/kernel/vmlinux.lds.S      |    1 -
 arch/csky/kernel/vmlinux.lds.S       |    1 -
 arch/hexagon/kernel/vmlinux.lds.S    |    1 -
 arch/ia64/kernel/vmlinux.lds.S       |    1 -
 arch/loongarch/kernel/vmlinux.lds.S  |    1 -
 arch/m68k/kernel/vmlinux-nommu.lds   |    1 -
 arch/m68k/kernel/vmlinux-std.lds     |    1 -
 arch/m68k/kernel/vmlinux-sun3.lds    |    1 -
 arch/microblaze/kernel/vmlinux.lds.S |    1 -
 arch/mips/kernel/vmlinux.lds.S       |    1 -
 arch/nios2/kernel/vmlinux.lds.S      |    1 -
 arch/openrisc/kernel/vmlinux.lds.S   |    1 -
 arch/parisc/kernel/vmlinux.lds.S     |    1 -
 arch/powerpc/kernel/vmlinux.lds.S    |    1 -
 arch/riscv/kernel/vmlinux-xip.lds.S  |    1 -
 arch/riscv/kernel/vmlinux.lds.S      |    1 -
 arch/s390/kernel/vmlinux.lds.S       |    1 -
 arch/sh/kernel/vmlinux.lds.S         |    1 -
 arch/sparc/kernel/vmlinux.lds.S      |    1 -
 arch/um/kernel/dyn.lds.S             |    1 -
 arch/um/kernel/uml.lds.S             |    1 -
 arch/x86/include/asm/irqflags.h      |   11 ++++-------
 arch/x86/include/asm/mwait.h         |    2 +-
 arch/x86/kernel/vmlinux.lds.S        |    1 -
 arch/xtensa/kernel/vmlinux.lds.S     |    1 -
 include/asm-generic/vmlinux.lds.h    |    9 +++------
 include/linux/compiler_types.h       |    8 ++++++--
 include/linux/cpu.h                  |    3 ---
 kernel/module/main.c                 |    2 ++
 kernel/sched/idle.c                  |   15 +++++++++++++--
 tools/objtool/check.c                |   15 ++++++++++++++-
 34 files changed, 43 insertions(+), 48 deletions(-)

--- a/arch/alpha/kernel/vmlinux.lds.S
+++ b/arch/alpha/kernel/vmlinux.lds.S
@@ -27,7 +27,6 @@ SECTIONS
 		HEAD_TEXT
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		*(.fixup)
 		*(.gnu.warning)
--- a/arch/arc/kernel/vmlinux.lds.S
+++ b/arch/arc/kernel/vmlinux.lds.S
@@ -85,7 +85,6 @@ SECTIONS
 		_stext = .;
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/arm/include/asm/vmlinux.lds.h
+++ b/arch/arm/include/asm/vmlinux.lds.h
@@ -96,7 +96,6 @@
 		SOFTIRQENTRY_TEXT					\
 		TEXT_TEXT						\
 		SCHED_TEXT						\
-		CPUIDLE_TEXT						\
 		LOCK_TEXT						\
 		KPROBES_TEXT						\
 		ARM_STUBS_TEXT						\
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -163,7 +163,6 @@ SECTIONS
 			ENTRY_TEXT
 			TEXT_TEXT
 			SCHED_TEXT
-			CPUIDLE_TEXT
 			LOCK_TEXT
 			KPROBES_TEXT
 			HYPERVISOR_TEXT
--- a/arch/csky/kernel/vmlinux.lds.S
+++ b/arch/csky/kernel/vmlinux.lds.S
@@ -38,7 +38,6 @@ SECTIONS
 		SOFTIRQENTRY_TEXT
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		*(.fixup)
--- a/arch/hexagon/kernel/vmlinux.lds.S
+++ b/arch/hexagon/kernel/vmlinux.lds.S
@@ -41,7 +41,6 @@ SECTIONS
 		IRQENTRY_TEXT
 		SOFTIRQENTRY_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		*(.fixup)
--- a/arch/ia64/kernel/vmlinux.lds.S
+++ b/arch/ia64/kernel/vmlinux.lds.S
@@ -51,7 +51,6 @@ SECTIONS {
 		__end_ivt_text = .;
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/loongarch/kernel/vmlinux.lds.S
+++ b/arch/loongarch/kernel/vmlinux.lds.S
@@ -40,7 +40,6 @@ SECTIONS
 	.text : {
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/m68k/kernel/vmlinux-nommu.lds
+++ b/arch/m68k/kernel/vmlinux-nommu.lds
@@ -48,7 +48,6 @@ SECTIONS {
 		IRQENTRY_TEXT
 		SOFTIRQENTRY_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		*(.fixup)
 		. = ALIGN(16);
--- a/arch/m68k/kernel/vmlinux-std.lds
+++ b/arch/m68k/kernel/vmlinux-std.lds
@@ -19,7 +19,6 @@ SECTIONS
 	IRQENTRY_TEXT
 	SOFTIRQENTRY_TEXT
 	SCHED_TEXT
-	CPUIDLE_TEXT
 	LOCK_TEXT
 	*(.fixup)
 	*(.gnu.warning)
--- a/arch/m68k/kernel/vmlinux-sun3.lds
+++ b/arch/m68k/kernel/vmlinux-sun3.lds
@@ -19,7 +19,6 @@ SECTIONS
 	IRQENTRY_TEXT
 	SOFTIRQENTRY_TEXT
 	SCHED_TEXT
-	CPUIDLE_TEXT
 	LOCK_TEXT
 	*(.fixup)
 	*(.gnu.warning)
--- a/arch/microblaze/kernel/vmlinux.lds.S
+++ b/arch/microblaze/kernel/vmlinux.lds.S
@@ -36,7 +36,6 @@ SECTIONS {
 		EXIT_TEXT
 		EXIT_CALL
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -61,7 +61,6 @@ SECTIONS
 	.text : {
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/nios2/kernel/vmlinux.lds.S
+++ b/arch/nios2/kernel/vmlinux.lds.S
@@ -24,7 +24,6 @@ SECTIONS
 	.text : {
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		IRQENTRY_TEXT
 		SOFTIRQENTRY_TEXT
--- a/arch/openrisc/kernel/vmlinux.lds.S
+++ b/arch/openrisc/kernel/vmlinux.lds.S
@@ -52,7 +52,6 @@ SECTIONS
           _stext = .;
 	  TEXT_TEXT
 	  SCHED_TEXT
-	  CPUIDLE_TEXT
 	  LOCK_TEXT
 	  KPROBES_TEXT
 	  IRQENTRY_TEXT
--- a/arch/parisc/kernel/vmlinux.lds.S
+++ b/arch/parisc/kernel/vmlinux.lds.S
@@ -86,7 +86,6 @@ SECTIONS
 		TEXT_TEXT
 		LOCK_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
 		SOFTIRQENTRY_TEXT
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -107,7 +107,6 @@ SECTIONS
 #endif
 		NOINSTR_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/riscv/kernel/vmlinux-xip.lds.S
+++ b/arch/riscv/kernel/vmlinux-xip.lds.S
@@ -39,7 +39,6 @@ SECTIONS
 		_stext = .;
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		ENTRY_TEXT
--- a/arch/riscv/kernel/vmlinux.lds.S
+++ b/arch/riscv/kernel/vmlinux.lds.S
@@ -42,7 +42,6 @@ SECTIONS
 		_stext = .;
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		ENTRY_TEXT
--- a/arch/s390/kernel/vmlinux.lds.S
+++ b/arch/s390/kernel/vmlinux.lds.S
@@ -42,7 +42,6 @@ SECTIONS
 		HEAD_TEXT
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/sh/kernel/vmlinux.lds.S
+++ b/arch/sh/kernel/vmlinux.lds.S
@@ -29,7 +29,6 @@ SECTIONS
 		HEAD_TEXT
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/sparc/kernel/vmlinux.lds.S
+++ b/arch/sparc/kernel/vmlinux.lds.S
@@ -50,7 +50,6 @@ SECTIONS
 		HEAD_TEXT
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		IRQENTRY_TEXT
--- a/arch/um/kernel/dyn.lds.S
+++ b/arch/um/kernel/dyn.lds.S
@@ -74,7 +74,6 @@ SECTIONS
     _stext = .;
     TEXT_TEXT
     SCHED_TEXT
-    CPUIDLE_TEXT
     LOCK_TEXT
     IRQENTRY_TEXT
     SOFTIRQENTRY_TEXT
--- a/arch/um/kernel/uml.lds.S
+++ b/arch/um/kernel/uml.lds.S
@@ -35,7 +35,6 @@ SECTIONS
     _stext = .;
     TEXT_TEXT
     SCHED_TEXT
-    CPUIDLE_TEXT
     LOCK_TEXT
     IRQENTRY_TEXT
     SOFTIRQENTRY_TEXT
--- a/arch/x86/include/asm/irqflags.h
+++ b/arch/x86/include/asm/irqflags.h
@@ -8,9 +8,6 @@
 
 #include <asm/nospec-branch.h>
 
-/* Provide __cpuidle; we can't safely include <linux/cpu.h> */
-#define __cpuidle __section(".cpuidle.text")
-
 /*
  * Interrupt control:
  */
@@ -45,13 +42,13 @@ static __always_inline void native_irq_e
 	asm volatile("sti": : :"memory");
 }
 
-static inline __cpuidle void native_safe_halt(void)
+static __always_inline void native_safe_halt(void)
 {
 	mds_idle_clear_cpu_buffers();
 	asm volatile("sti; hlt": : :"memory");
 }
 
-static inline __cpuidle void native_halt(void)
+static __always_inline void native_halt(void)
 {
 	mds_idle_clear_cpu_buffers();
 	asm volatile("hlt": : :"memory");
@@ -84,7 +81,7 @@ static __always_inline void arch_local_i
  * Used in the idle loop; sti takes one instruction cycle
  * to complete:
  */
-static inline __cpuidle void arch_safe_halt(void)
+static __always_inline void arch_safe_halt(void)
 {
 	native_safe_halt();
 }
@@ -93,7 +90,7 @@ static inline __cpuidle void arch_safe_h
  * Used when interrupts are already enabled or to
  * shutdown the processor:
  */
-static inline __cpuidle void halt(void)
+static __always_inline void halt(void)
 {
 	native_halt();
 }
--- a/arch/x86/include/asm/mwait.h
+++ b/arch/x86/include/asm/mwait.h
@@ -104,7 +104,7 @@ static inline void __sti_mwait(unsigned
  * New with Core Duo processors, MWAIT can take some hints based on CPU
  * capability.
  */
-static inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx)
+static __always_inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx)
 {
 	if (static_cpu_has_bug(X86_BUG_MONITOR) || !current_set_polling_and_test()) {
 		if (static_cpu_has_bug(X86_BUG_CLFLUSH_MONITOR)) {
--- a/arch/x86/kernel/vmlinux.lds.S
+++ b/arch/x86/kernel/vmlinux.lds.S
@@ -129,7 +129,6 @@ SECTIONS
 		HEAD_TEXT
 		TEXT_TEXT
 		SCHED_TEXT
-		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
 		ALIGN_ENTRY_TEXT_BEGIN
--- a/arch/xtensa/kernel/vmlinux.lds.S
+++ b/arch/xtensa/kernel/vmlinux.lds.S
@@ -125,7 +125,6 @@ SECTIONS
     ENTRY_TEXT
     TEXT_TEXT
     SCHED_TEXT
-    CPUIDLE_TEXT
     LOCK_TEXT
     *(.fixup)
   }
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -559,6 +559,9 @@
 		ALIGN_FUNCTION();					\
 		__noinstr_text_start = .;				\
 		*(.noinstr.text)					\
+		__cpuidle_text_start = .;				\
+		*(.cpuidle.text)					\
+		__cpuidle_text_end = .;					\
 		__noinstr_text_end = .;
 
 /*
@@ -600,12 +603,6 @@
 		*(.spinlock.text)					\
 		__lock_text_end = .;
 
-#define CPUIDLE_TEXT							\
-		ALIGN_FUNCTION();					\
-		__cpuidle_text_start = .;				\
-		*(.cpuidle.text)					\
-		__cpuidle_text_end = .;
-
 #define KPROBES_TEXT							\
 		ALIGN_FUNCTION();					\
 		__kprobes_text_start = .;				\
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -225,10 +225,14 @@ struct ftrace_likely_data {
 #endif
 
 /* Section for code which can't be instrumented at all */
-#define noinstr								\
-	noinline notrace __attribute((__section__(".noinstr.text")))	\
+#define __noinstr_section(section)					\
+	noinline notrace __attribute((__section__(section)))		\
 	__no_kcsan __no_sanitize_address __no_profile __no_sanitize_coverage
 
+#define noinstr __noinstr_section(".noinstr.text")
+
+#define __cpuidle __noinstr_section(".cpuidle.text")
+
 #endif /* __KERNEL__ */
 
 #endif /* __ASSEMBLY__ */
--- a/include/linux/cpu.h
+++ b/include/linux/cpu.h
@@ -171,9 +171,6 @@ void __noreturn cpu_startup_entry(enum c
 
 void cpu_idle_poll_ctrl(bool enable);
 
-/* Attach to any functions which should be considered cpuidle. */
-#define __cpuidle	__section(".cpuidle.text")
-
 bool cpu_in_idle(unsigned long pc);
 
 void arch_cpu_idle(void);
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -376,7 +376,8 @@ static int decode_instructions(struct ob
 			sec->text = true;
 
 		if (!strcmp(sec->name, ".noinstr.text") ||
-		    !strcmp(sec->name, ".entry.text"))
+		    !strcmp(sec->name, ".entry.text") ||
+		    !strcmp(sec->name, ".cpuidle.text"))
 			sec->noinstr = true;
 
 		for (offset = 0; offset < sec->sh.sh_size; offset += insn->len) {
@@ -3080,6 +3081,12 @@ static inline bool noinstr_call_dest(str
 		return true;
 
 	/*
+	 * If the symbol is a static_call trampoline, we can't tell.
+	 */
+	if (func->static_call_tramp)
+		return true;
+
+	/*
 	 * The __ubsan_handle_*() calls are like WARN(), they only happen when
 	 * something 'BAD' happened. At the risk of taking the machine down,
 	 * let them proceed to get the message out.
@@ -3648,6 +3655,12 @@ static int validate_noinstr_sections(str
 	if (sec) {
 		warnings += validate_section(file, sec);
 		warnings += validate_unwind_hints(file, sec);
+	}
+
+	sec = find_section_by_name(file->elf, ".cpuidle.text");
+	if (sec) {
+		warnings += validate_section(file, sec);
+		warnings += validate_unwind_hints(file, sec);
 	}
 
 	return warnings;


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (18 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 19/36] objtool/idle: Validate __cpuidle code as noinstr Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 16:22   ` Arnd Bergmann
                     ` (2 more replies)
  2022-06-08 14:27 ` [PATCH 21/36] x86/tdx: Remove TDX_HCALL_ISSUE_STI Peter Zijlstra
                   ` (16 subsequent siblings)
  36 siblings, 3 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	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) <peterz@infradead.org>
---
 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	sp, %0\n"
--- a/arch/hexagon/kernel/process.c
+++ b/arch/hexagon/kernel/process.c
@@ -44,7 +44,6 @@ void arch_cpu_idle(void)
 {
 	__vmwait();
 	/*  interrupts wake us up, but irqs are still disabled */
-	raw_local_irq_enable();
 }
 
 /*
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -241,6 +241,7 @@ void arch_cpu_idle(void)
 		(*mark_idle)(1);
 
 	raw_safe_halt();
+	raw_local_irq_disable();
 
 	if (mark_idle)
 		(*mark_idle)(0);
--- a/arch/microblaze/kernel/process.c
+++ b/arch/microblaze/kernel/process.c
@@ -138,5 +138,4 @@ int dump_fpu(struct pt_regs *regs, elf_f
 
 void arch_cpu_idle(void)
 {
-       raw_local_irq_enable();
 }
--- a/arch/mips/kernel/idle.c
+++ b/arch/mips/kernel/idle.c
@@ -33,13 +33,13 @@ static void __cpuidle r3081_wait(void)
 {
 	unsigned long cfg = read_c0_conf();
 	write_c0_conf(cfg | R30XX_CONF_HALT);
-	raw_local_irq_enable();
 }
 
 void __cpuidle r4k_wait(void)
 {
 	raw_local_irq_enable();
 	__r4k_wait();
+	raw_local_irq_disable();
 }
 
 /*
@@ -57,7 +57,6 @@ void __cpuidle r4k_wait_irqoff(void)
 		"	.set	arch=r4000	\n"
 		"	wait			\n"
 		"	.set	pop		\n");
-	raw_local_irq_enable();
 }
 
 /*
@@ -77,7 +76,6 @@ static void __cpuidle rm7k_wait_irqoff(v
 		"	wait						\n"
 		"	mtc0	$1, $12		# stalls until W stage	\n"
 		"	.set	pop					\n");
-	raw_local_irq_enable();
 }
 
 /*
@@ -103,6 +101,8 @@ static void __cpuidle au1k_wait(void)
 	"	nop				\n"
 	"	.set	pop			\n"
 	: : "r" (au1k_wait), "r" (c0status));
+
+	raw_local_irq_disable();
 }
 
 static int __initdata nowait;
@@ -245,8 +245,6 @@ void arch_cpu_idle(void)
 {
 	if (cpu_wait)
 		cpu_wait();
-	else
-		raw_local_irq_enable();
 }
 
 #ifdef CONFIG_CPU_IDLE
--- a/arch/nios2/kernel/process.c
+++ b/arch/nios2/kernel/process.c
@@ -33,7 +33,6 @@ EXPORT_SYMBOL(pm_power_off);
 
 void arch_cpu_idle(void)
 {
-	raw_local_irq_enable();
 }
 
 /*
--- a/arch/openrisc/kernel/process.c
+++ b/arch/openrisc/kernel/process.c
@@ -102,6 +102,7 @@ void arch_cpu_idle(void)
 	raw_local_irq_enable();
 	if (mfspr(SPR_UPR) & SPR_UPR_PMP)
 		mtspr(SPR_PMR, mfspr(SPR_PMR) | SPR_PMR_DME);
+	raw_local_irq_disable();
 }
 
 void (*pm_power_off)(void) = NULL;
--- a/arch/parisc/kernel/process.c
+++ b/arch/parisc/kernel/process.c
@@ -187,8 +187,6 @@ void arch_cpu_idle_dead(void)
 
 void __cpuidle arch_cpu_idle(void)
 {
-	raw_local_irq_enable();
-
 	/* nop on real hardware, qemu will idle sleep. */
 	asm volatile("or %%r10,%%r10,%%r10\n":::);
 }
--- a/arch/powerpc/kernel/idle.c
+++ b/arch/powerpc/kernel/idle.c
@@ -51,10 +51,9 @@ void arch_cpu_idle(void)
 		 * Some power_save functions return with
 		 * interrupts enabled, some don't.
 		 */
-		if (irqs_disabled())
-			raw_local_irq_enable();
+		if (!irqs_disabled())
+			raw_local_irq_disable();
 	} else {
-		raw_local_irq_enable();
 		/*
 		 * Go into low thread priority and possibly
 		 * low power mode.
--- a/arch/riscv/kernel/process.c
+++ b/arch/riscv/kernel/process.c
@@ -39,7 +39,6 @@ extern asmlinkage void ret_from_kernel_t
 void arch_cpu_idle(void)
 {
 	cpu_do_idle();
-	raw_local_irq_enable();
 }
 
 void __show_regs(struct pt_regs *regs)
--- a/arch/s390/kernel/idle.c
+++ b/arch/s390/kernel/idle.c
@@ -66,7 +66,6 @@ void arch_cpu_idle(void)
 	idle->idle_count++;
 	account_idle_time(cputime_to_nsecs(idle_time));
 	raw_write_seqcount_end(&idle->seqcount);
-	raw_local_irq_enable();
 }
 
 static ssize_t show_idle_count(struct device *dev,
--- a/arch/sh/kernel/idle.c
+++ b/arch/sh/kernel/idle.c
@@ -25,6 +25,7 @@ void default_idle(void)
 	raw_local_irq_enable();
 	/* Isn't this racy ? */
 	cpu_sleep();
+	raw_local_irq_disable();
 	clear_bl_bit();
 }
 
--- a/arch/sparc/kernel/leon_pmc.c
+++ b/arch/sparc/kernel/leon_pmc.c
@@ -57,6 +57,8 @@ static void pmc_leon_idle_fixup(void)
 		"lda	[%0] %1, %%g0\n"
 		:
 		: "r"(address), "i"(ASI_LEON_BYPASS));
+
+	raw_local_irq_disable();
 }
 
 /*
@@ -70,6 +72,8 @@ static void pmc_leon_idle(void)
 
 	/* For systems without power-down, this will be no-op */
 	__asm__ __volatile__ ("wr	%g0, %asr19\n\t");
+
+	raw_local_irq_disable();
 }
 
 /* Install LEON Power Down function */
--- a/arch/sparc/kernel/process_32.c
+++ b/arch/sparc/kernel/process_32.c
@@ -71,7 +71,6 @@ void arch_cpu_idle(void)
 {
 	if (sparc_idle)
 		(*sparc_idle)();
-	raw_local_irq_enable();
 }
 
 /* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */
--- a/arch/sparc/kernel/process_64.c
+++ b/arch/sparc/kernel/process_64.c
@@ -59,7 +59,6 @@ void arch_cpu_idle(void)
 {
 	if (tlb_type != hypervisor) {
 		touch_nmi_watchdog();
-		raw_local_irq_enable();
 	} else {
 		unsigned long pstate;
 
@@ -90,6 +89,8 @@ void arch_cpu_idle(void)
 			"wrpr %0, %%g0, %%pstate"
 			: "=&r" (pstate)
 			: "i" (PSTATE_IE));
+
+		raw_local_irq_disable();
 	}
 }
 
--- a/arch/um/kernel/process.c
+++ b/arch/um/kernel/process.c
@@ -216,7 +216,6 @@ void arch_cpu_idle(void)
 {
 	cpu_tasks[current_thread_info()->cpu].pid = os_getpid();
 	um_idle_sleep();
-	raw_local_irq_enable();
 }
 
 int __cant_sleep(void) {
--- a/arch/x86/coco/tdx/tdx.c
+++ b/arch/x86/coco/tdx/tdx.c
@@ -178,6 +178,9 @@ void __cpuidle tdx_safe_halt(void)
 	 */
 	if (__halt(irq_disabled, do_sti))
 		WARN_ONCE(1, "HLT instruction emulation failed\n");
+
+	/* XXX I can't make sense of what @do_sti actually does */
+	raw_local_irq_disable();
 }
 
 static bool read_msr(struct pt_regs *regs)
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -699,6 +699,7 @@ EXPORT_SYMBOL(boot_option_idle_override)
 void __cpuidle default_idle(void)
 {
 	raw_safe_halt();
+	raw_local_irq_disable();
 }
 #if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
 EXPORT_SYMBOL(default_idle);
@@ -804,13 +805,7 @@ static void amd_e400_idle(void)
 
 	default_idle();
 
-	/*
-	 * The switch back from broadcast mode needs to be called with
-	 * interrupts disabled.
-	 */
-	raw_local_irq_disable();
 	tick_broadcast_exit();
-	raw_local_irq_enable();
 }
 
 /*
@@ -849,12 +844,10 @@ static __cpuidle void mwait_idle(void)
 		}
 
 		__monitor((void *)&current_thread_info()->flags, 0, 0);
-		if (!need_resched())
+		if (!need_resched()) {
 			__sti_mwait(0, 0);
-		else
-			raw_local_irq_enable();
-	} else {
-		raw_local_irq_enable();
+			raw_local_irq_disable();
+		}
 	}
 	__current_clr_polling();
 }
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -183,6 +183,7 @@ void coprocessor_flush_release_all(struc
 void arch_cpu_idle(void)
 {
 	platform_idle();
+	raw_local_irq_disable();
 }
 
 /*
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -79,7 +79,6 @@ void __weak arch_cpu_idle_dead(void) { }
 void __weak arch_cpu_idle(void)
 {
 	cpu_idle_force_poll = 1;
-	raw_local_irq_enable();
 }
 
 /**
@@ -96,7 +95,6 @@ void __cpuidle default_idle_call(void)
 
 		cpuidle_rcu_enter();
 		arch_cpu_idle();
-		raw_local_irq_disable();
 		cpuidle_rcu_exit();
 
 		start_critical_timings();


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 21/36] x86/tdx: Remove TDX_HCALL_ISSUE_STI
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (19 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
       [not found]   ` <CAJhGHyCnu_BsKf5STMMJKMWm0NVZ8qXT8Qh=BhhCjSSgwchL3Q@mail.gmail.com>
  2022-06-08 14:27 ` [PATCH 22/36] arm,smp: Remove trace_.*_rcuidle() usage Peter Zijlstra
                   ` (15 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, kirill.shutemov,
	dalias, tony, amakhalov, bjorn.andersson, hpa, sparclinux,
	linux-hexagon, linux-riscv, Isaku Yamahata, anton.ivanov, jonas,
	yury.norov, richard, x86, linux, mingo, aou, paulmck, hca,
	stefan.kristiansson, openrisc, paul.walmsley, linux-tegra,
	namhyung, andriy.shevchenko, jpoimboe, jgross, monstr, linux-mips,
	palmer, anup, ink, johannes, linuxppc-dev

Now that arch_cpu_idle() is expected to return with IRQs disabled,
avoid the useless STI/CLI dance.

Per the specs this is supposed to work, but nobody has yet relied up
this behaviour so broken implementations are possible.

Cc: Isaku Yamahata <isaku.yamahata@gmail.com>
Cc: kirill.shutemov@linux.intel.com
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/coco/tdx/tdcall.S        |   13 -------------
 arch/x86/coco/tdx/tdx.c           |   23 ++++-------------------
 arch/x86/include/asm/shared/tdx.h |    1 -
 3 files changed, 4 insertions(+), 33 deletions(-)

--- a/arch/x86/coco/tdx/tdcall.S
+++ b/arch/x86/coco/tdx/tdcall.S
@@ -139,19 +139,6 @@ SYM_FUNC_START(__tdx_hypercall)
 
 	movl $TDVMCALL_EXPOSE_REGS_MASK, %ecx
 
-	/*
-	 * For the idle loop STI needs to be called directly before the TDCALL
-	 * that enters idle (EXIT_REASON_HLT case). STI instruction enables
-	 * interrupts only one instruction later. If there is a window between
-	 * STI and the instruction that emulates the HALT state, there is a
-	 * chance for interrupts to happen in this window, which can delay the
-	 * HLT operation indefinitely. Since this is the not the desired
-	 * result, conditionally call STI before TDCALL.
-	 */
-	testq $TDX_HCALL_ISSUE_STI, %rsi
-	jz .Lskip_sti
-	sti
-.Lskip_sti:
 	tdcall
 
 	/*
--- a/arch/x86/coco/tdx/tdx.c
+++ b/arch/x86/coco/tdx/tdx.c
@@ -124,7 +124,7 @@ static u64 get_cc_mask(void)
 	return BIT_ULL(gpa_width - 1);
 }
 
-static u64 __cpuidle __halt(const bool irq_disabled, const bool do_sti)
+static u64 __cpuidle __halt(const bool irq_disabled)
 {
 	struct tdx_hypercall_args args = {
 		.r10 = TDX_HYPERCALL_STANDARD,
@@ -144,20 +144,14 @@ static u64 __cpuidle __halt(const bool i
 	 * can keep the vCPU in virtual HLT, even if an IRQ is
 	 * pending, without hanging/breaking the guest.
 	 */
-	return __tdx_hypercall(&args, do_sti ? TDX_HCALL_ISSUE_STI : 0);
+	return __tdx_hypercall(&args, 0);
 }
 
 static bool handle_halt(void)
 {
-	/*
-	 * Since non safe halt is mainly used in CPU offlining
-	 * and the guest will always stay in the halt state, don't
-	 * call the STI instruction (set do_sti as false).
-	 */
 	const bool irq_disabled = irqs_disabled();
-	const bool do_sti = false;
 
-	if (__halt(irq_disabled, do_sti))
+	if (__halt(irq_disabled))
 		return false;
 
 	return true;
@@ -165,22 +159,13 @@ static bool handle_halt(void)
 
 void __cpuidle tdx_safe_halt(void)
 {
-	 /*
-	  * For do_sti=true case, __tdx_hypercall() function enables
-	  * interrupts using the STI instruction before the TDCALL. So
-	  * set irq_disabled as false.
-	  */
 	const bool irq_disabled = false;
-	const bool do_sti = true;
 
 	/*
 	 * Use WARN_ONCE() to report the failure.
 	 */
-	if (__halt(irq_disabled, do_sti))
+	if (__halt(irq_disabled))
 		WARN_ONCE(1, "HLT instruction emulation failed\n");
-
-	/* XXX I can't make sense of what @do_sti actually does */
-	raw_local_irq_disable();
 }
 
 static bool read_msr(struct pt_regs *regs)
--- a/arch/x86/include/asm/shared/tdx.h
+++ b/arch/x86/include/asm/shared/tdx.h
@@ -8,7 +8,6 @@
 #define TDX_HYPERCALL_STANDARD  0
 
 #define TDX_HCALL_HAS_OUTPUT	BIT(0)
-#define TDX_HCALL_ISSUE_STI	BIT(1)
 
 #define TDX_CPUID_LEAF_ID	0x21
 #define TDX_IDENT		"IntelTDX    "


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 22/36] arm,smp: Remove trace_.*_rcuidle() usage
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (20 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 21/36] x86/tdx: Remove TDX_HCALL_ISSUE_STI Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 23/36] arm64,smp: " Peter Zijlstra
                   ` (14 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

None of these functions should ever be ran with RCU disabled anymore.

Specifically, do_handle_IPI() is only called from handle_IPI() which
explicitly does irq_enter()/irq_exit() which ensures RCU is watching.

The problem with smp_cross_call() was, per commit 7c64cc0531fa ("arm: Use
_rcuidle for smp_cross_call() tracepoints"), that
cpuidle_enter_state_coupled() already had RCU disabled, but that's
long been fixed by commit 1098582a0f6c ("sched,idle,rcu: Push rcu_idle
deeper into the idle path").

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/kernel/smp.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -639,7 +639,7 @@ static void do_handle_IPI(int ipinr)
 	unsigned int cpu = smp_processor_id();
 
 	if ((unsigned)ipinr < NR_IPI)
-		trace_ipi_entry_rcuidle(ipi_types[ipinr]);
+		trace_ipi_entry(ipi_types[ipinr]);
 
 	switch (ipinr) {
 	case IPI_WAKEUP:
@@ -686,7 +686,7 @@ static void do_handle_IPI(int ipinr)
 	}
 
 	if ((unsigned)ipinr < NR_IPI)
-		trace_ipi_exit_rcuidle(ipi_types[ipinr]);
+		trace_ipi_exit(ipi_types[ipinr]);
 }
 
 /* Legacy version, should go away once all irqchips have been converted */
@@ -709,7 +709,7 @@ static irqreturn_t ipi_handler(int irq,
 
 static void smp_cross_call(const struct cpumask *target, unsigned int ipinr)
 {
-	trace_ipi_raise_rcuidle(target, ipi_types[ipinr]);
+	trace_ipi_raise(target, ipi_types[ipinr]);
 	__ipi_send_mask(ipi_desc[ipinr], target);
 }
 


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 23/36] arm64,smp: Remove trace_.*_rcuidle() usage
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (21 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 22/36] arm,smp: Remove trace_.*_rcuidle() usage Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-14 16:24   ` Mark Rutland
  2022-06-08 14:27 ` [PATCH 24/36] printk: " Peter Zijlstra
                   ` (13 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

Ever since commit d3afc7f12987 ("arm64: Allow IPIs to be handled as
normal interrupts") this function is called in regular IRQ context.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm64/kernel/smp.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -865,7 +865,7 @@ static void do_handle_IPI(int ipinr)
 	unsigned int cpu = smp_processor_id();
 
 	if ((unsigned)ipinr < NR_IPI)
-		trace_ipi_entry_rcuidle(ipi_types[ipinr]);
+		trace_ipi_entry(ipi_types[ipinr]);
 
 	switch (ipinr) {
 	case IPI_RESCHEDULE:
@@ -914,7 +914,7 @@ static void do_handle_IPI(int ipinr)
 	}
 
 	if ((unsigned)ipinr < NR_IPI)
-		trace_ipi_exit_rcuidle(ipi_types[ipinr]);
+		trace_ipi_exit(ipi_types[ipinr]);
 }
 
 static irqreturn_t ipi_handler(int irq, void *data)


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (22 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 23/36] arm64,smp: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-09  9:16   ` Petr Mladek via Virtualization
  2022-06-09 10:14   ` Petr Mladek via Virtualization
  2022-06-08 14:27 ` [PATCH 25/36] time/tick-broadcast: Remove RCU_NONIDLE usage Peter Zijlstra
                   ` (12 subsequent siblings)
  36 siblings, 2 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

The problem, per commit fc98c3c8c9dc ("printk: use rcuidle console
tracepoint"), was printk usage from the cpuidle path where RCU was
already disabled.

Per the patches earlier in this series, this is no longer the case.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 kernel/printk/printk.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2238,7 +2238,7 @@ static u16 printk_sprint(char *text, u16
 		}
 	}
 
-	trace_console_rcuidle(text, text_len);
+	trace_console(text, text_len);
 
 	return text_len;
 }


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 25/36] time/tick-broadcast: Remove RCU_NONIDLE usage
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (23 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 24/36] printk: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-14 16:28   ` Mark Rutland
  2022-06-08 14:27 ` [PATCH 26/36] cpuidle, sched: Remove annotations from TIF_{POLLING_NRFLAG, NEED_RESCHED} Peter Zijlstra
                   ` (11 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

No callers left that have already disabled RCU.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 kernel/time/tick-broadcast-hrtimer.c |   29 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

--- a/kernel/time/tick-broadcast-hrtimer.c
+++ b/kernel/time/tick-broadcast-hrtimer.c
@@ -56,25 +56,20 @@ static int bc_set_next(ktime_t expires,
 	 * hrtimer callback function is currently running, then
 	 * hrtimer_start() cannot move it and the timer stays on the CPU on
 	 * which it is assigned at the moment.
+	 */
+	hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED_HARD);
+	/*
+	 * The core tick broadcast mode expects bc->bound_on to be set
+	 * correctly to prevent a CPU which has the broadcast hrtimer
+	 * armed from going deep idle.
 	 *
-	 * As this can be called from idle code, the hrtimer_start()
-	 * invocation has to be wrapped with RCU_NONIDLE() as
-	 * hrtimer_start() can call into tracing.
+	 * As tick_broadcast_lock is held, nothing can change the cpu
+	 * base which was just established in hrtimer_start() above. So
+	 * the below access is safe even without holding the hrtimer
+	 * base lock.
 	 */
-	RCU_NONIDLE( {
-		hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED_HARD);
-		/*
-		 * The core tick broadcast mode expects bc->bound_on to be set
-		 * correctly to prevent a CPU which has the broadcast hrtimer
-		 * armed from going deep idle.
-		 *
-		 * As tick_broadcast_lock is held, nothing can change the cpu
-		 * base which was just established in hrtimer_start() above. So
-		 * the below access is safe even without holding the hrtimer
-		 * base lock.
-		 */
-		bc->bound_on = bctimer.base->cpu_base->cpu;
-	} );
+	bc->bound_on = bctimer.base->cpu_base->cpu;
+
 	return 0;
 }
 


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 26/36] cpuidle, sched: Remove annotations from TIF_{POLLING_NRFLAG, NEED_RESCHED}
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (24 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 25/36] time/tick-broadcast: Remove RCU_NONIDLE usage Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 27/36] cpuidle,mwait: Make noinstr clean Peter Zijlstra
                   ` (10 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

vmlinux.o: warning: objtool: mwait_idle+0x5: call to current_set_polling_and_test() leaves .noinstr.text section
vmlinux.o: warning: objtool: acpi_processor_ffh_cstate_enter+0xc5: call to current_set_polling_and_test() leaves .noinstr.text section
vmlinux.o: warning: objtool: cpu_idle_poll.isra.0+0x73: call to test_ti_thread_flag() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle+0xbc: call to current_set_polling_and_test() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_irq+0xea: call to current_set_polling_and_test() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_s2idle+0xb4: call to current_set_polling_and_test() leaves .noinstr.text section

vmlinux.o: warning: objtool: intel_idle+0xa6: call to current_clr_polling() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_irq+0xbf: call to current_clr_polling() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_s2idle+0xa1: call to current_clr_polling() leaves .noinstr.text section

vmlinux.o: warning: objtool: mwait_idle+0xe: call to __current_set_polling() leaves .noinstr.text section
vmlinux.o: warning: objtool: acpi_processor_ffh_cstate_enter+0xc5: call to __current_set_polling() leaves .noinstr.text section
vmlinux.o: warning: objtool: cpu_idle_poll.isra.0+0x73: call to test_ti_thread_flag() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle+0xbc: call to __current_set_polling() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_irq+0xea: call to __current_set_polling() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_s2idle+0xb4: call to __current_set_polling() leaves .noinstr.text section

vmlinux.o: warning: objtool: cpu_idle_poll.isra.0+0x73: call to test_ti_thread_flag() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_s2idle+0x73: call to test_ti_thread_flag.constprop.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_irq+0x91: call to test_ti_thread_flag.constprop.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle+0x78: call to test_ti_thread_flag.constprop.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: acpi_safe_halt+0xf: call to test_ti_thread_flag.constprop.0() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 include/linux/sched/idle.h  |   40 ++++++++++++++++++++++++++++++----------
 include/linux/thread_info.h |   18 +++++++++++++++++-
 2 files changed, 47 insertions(+), 11 deletions(-)

--- a/include/linux/sched/idle.h
+++ b/include/linux/sched/idle.h
@@ -23,12 +23,37 @@ static inline void wake_up_if_idle(int c
  */
 #ifdef TIF_POLLING_NRFLAG
 
-static inline void __current_set_polling(void)
+#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_ATOMIC_H
+
+static __always_inline void __current_set_polling(void)
 {
-	set_thread_flag(TIF_POLLING_NRFLAG);
+	arch_set_bit(TIF_POLLING_NRFLAG,
+		     (unsigned long *)(&current_thread_info()->flags));
 }
 
-static inline bool __must_check current_set_polling_and_test(void)
+static __always_inline void __current_clr_polling(void)
+{
+	arch_clear_bit(TIF_POLLING_NRFLAG,
+		       (unsigned long *)(&current_thread_info()->flags));
+}
+
+#else
+
+static __always_inline void __current_set_polling(void)
+{
+	set_bit(TIF_POLLING_NRFLAG,
+		(unsigned long *)(&current_thread_info()->flags));
+}
+
+static __always_inline void __current_clr_polling(void)
+{
+	clear_bit(TIF_POLLING_NRFLAG,
+		  (unsigned long *)(&current_thread_info()->flags));
+}
+
+#endif /* _ASM_GENERIC_BITOPS_INSTRUMENTED_ATOMIC_H */
+
+static __always_inline bool __must_check current_set_polling_and_test(void)
 {
 	__current_set_polling();
 
@@ -41,12 +66,7 @@ static inline bool __must_check current_
 	return unlikely(tif_need_resched());
 }
 
-static inline void __current_clr_polling(void)
-{
-	clear_thread_flag(TIF_POLLING_NRFLAG);
-}
-
-static inline bool __must_check current_clr_polling_and_test(void)
+static __always_inline bool __must_check current_clr_polling_and_test(void)
 {
 	__current_clr_polling();
 
@@ -73,7 +93,7 @@ static inline bool __must_check current_
 }
 #endif
 
-static inline void current_clr_polling(void)
+static __always_inline void current_clr_polling(void)
 {
 	__current_clr_polling();
 
--- a/include/linux/thread_info.h
+++ b/include/linux/thread_info.h
@@ -177,7 +177,23 @@ static __always_inline unsigned long rea
 	clear_ti_thread_flag(task_thread_info(t), TIF_##fl)
 #endif /* !CONFIG_GENERIC_ENTRY */
 
-#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
+#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H
+
+static __always_inline bool tif_need_resched(void)
+{
+	return arch_test_bit(TIF_NEED_RESCHED,
+			     (unsigned long *)(&current_thread_info()->flags));
+}
+
+#else
+
+static __always_inline bool tif_need_resched(void)
+{
+	return test_bit(TIF_NEED_RESCHED,
+			(unsigned long *)(&current_thread_info()->flags));
+}
+
+#endif /* _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H */
 
 #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
 static inline int arch_within_stack_frames(const void * const stack,


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 27/36] cpuidle,mwait: Make noinstr clean
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (25 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 26/36] cpuidle, sched: Remove annotations from TIF_{POLLING_NRFLAG, NEED_RESCHED} Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 28/36] cpuidle,tdx: Make tdx " Peter Zijlstra
                   ` (9 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

vmlinux.o: warning: objtool: intel_idle_s2idle+0x6e: call to __monitor.constprop.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_irq+0x8c: call to __monitor.constprop.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle+0x73: call to __monitor.constprop.0() leaves .noinstr.text section

vmlinux.o: warning: objtool: mwait_idle+0x88: call to clflush() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/include/asm/mwait.h         |   12 ++++++------
 arch/x86/include/asm/special_insns.h |    2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)

--- a/arch/x86/include/asm/mwait.h
+++ b/arch/x86/include/asm/mwait.h
@@ -25,7 +25,7 @@
 #define TPAUSE_C01_STATE		1
 #define TPAUSE_C02_STATE		0
 
-static inline void __monitor(const void *eax, unsigned long ecx,
+static __always_inline void __monitor(const void *eax, unsigned long ecx,
 			     unsigned long edx)
 {
 	/* "monitor %eax, %ecx, %edx;" */
@@ -33,7 +33,7 @@ static inline void __monitor(const void
 		     :: "a" (eax), "c" (ecx), "d"(edx));
 }
 
-static inline void __monitorx(const void *eax, unsigned long ecx,
+static __always_inline void __monitorx(const void *eax, unsigned long ecx,
 			      unsigned long edx)
 {
 	/* "monitorx %eax, %ecx, %edx;" */
@@ -41,7 +41,7 @@ static inline void __monitorx(const void
 		     :: "a" (eax), "c" (ecx), "d"(edx));
 }
 
-static inline void __mwait(unsigned long eax, unsigned long ecx)
+static __always_inline void __mwait(unsigned long eax, unsigned long ecx)
 {
 	mds_idle_clear_cpu_buffers();
 
@@ -76,8 +76,8 @@ static inline void __mwait(unsigned long
  * EAX                     (logical) address to monitor
  * ECX                     #GP if not zero
  */
-static inline void __mwaitx(unsigned long eax, unsigned long ebx,
-			    unsigned long ecx)
+static __always_inline void __mwaitx(unsigned long eax, unsigned long ebx,
+				     unsigned long ecx)
 {
 	/* No MDS buffer clear as this is AMD/HYGON only */
 
@@ -86,7 +86,7 @@ static inline void __mwaitx(unsigned lon
 		     :: "a" (eax), "b" (ebx), "c" (ecx));
 }
 
-static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
+static __always_inline void __sti_mwait(unsigned long eax, unsigned long ecx)
 {
 	mds_idle_clear_cpu_buffers();
 	/* "mwait %eax, %ecx;" */
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -196,7 +196,7 @@ static inline void load_gs_index(unsigne
 
 #endif /* CONFIG_PARAVIRT_XXL */
 
-static inline void clflush(volatile void *__p)
+static __always_inline void clflush(volatile void *__p)
 {
 	asm volatile("clflush %0" : "+m" (*(volatile char __force *)__p));
 }


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 28/36] cpuidle,tdx: Make tdx noinstr clean
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (26 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 27/36] cpuidle,mwait: Make noinstr clean Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 29/36] cpuidle,xenpv: Make more PARAVIRT_XXL " Peter Zijlstra
                   ` (8 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

vmlinux.o: warning: objtool: __halt+0x2c: call to hcall_func.constprop.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: __halt+0x3f: call to __tdx_hypercall() leaves .noinstr.text section
vmlinux.o: warning: objtool: __tdx_hypercall+0x66: call to __tdx_hypercall_failed() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/coco/tdx/tdcall.S |    2 ++
 arch/x86/coco/tdx/tdx.c    |    5 +++--
 2 files changed, 5 insertions(+), 2 deletions(-)

--- a/arch/x86/coco/tdx/tdcall.S
+++ b/arch/x86/coco/tdx/tdcall.S
@@ -31,6 +31,8 @@
 					  TDX_R12 | TDX_R13 | \
 					  TDX_R14 | TDX_R15 )
 
+.section .noinstr.text, "ax"
+
 /*
  * __tdx_module_call()  - Used by TDX guests to request services from
  * the TDX module (does not include VMM services) using TDCALL instruction.
--- a/arch/x86/coco/tdx/tdx.c
+++ b/arch/x86/coco/tdx/tdx.c
@@ -53,8 +53,9 @@ static inline u64 _tdx_hypercall(u64 fn,
 }
 
 /* Called from __tdx_hypercall() for unrecoverable failure */
-void __tdx_hypercall_failed(void)
+noinstr void __tdx_hypercall_failed(void)
 {
+	instrumentation_begin();
 	panic("TDVMCALL failed. TDX module bug?");
 }
 
@@ -64,7 +65,7 @@ void __tdx_hypercall_failed(void)
  * Reusing the KVM EXIT_REASON macros makes it easier to connect the host and
  * guest sides of these calls.
  */
-static u64 hcall_func(u64 exit_reason)
+static __always_inline u64 hcall_func(u64 exit_reason)
 {
 	return exit_reason;
 }


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 29/36] cpuidle,xenpv: Make more PARAVIRT_XXL noinstr clean
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (27 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 28/36] cpuidle,tdx: Make tdx " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-13 18:48   ` [PATCH 29/36] cpuidle, xenpv: " Srivatsa S. Bhat
  2022-06-08 14:27 ` [PATCH 30/36] cpuidle,nospec: Make " Peter Zijlstra
                   ` (7 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

vmlinux.o: warning: objtool: acpi_idle_enter_s2idle+0xde: call to wbinvd() leaves .noinstr.text section
vmlinux.o: warning: objtool: default_idle+0x4: call to arch_safe_halt() leaves .noinstr.text section
vmlinux.o: warning: objtool: xen_safe_halt+0xa: call to HYPERVISOR_sched_op.constprop.0() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/include/asm/paravirt.h      |    6 ++++--
 arch/x86/include/asm/special_insns.h |    4 ++--
 arch/x86/include/asm/xen/hypercall.h |    2 +-
 arch/x86/kernel/paravirt.c           |   14 ++++++++++++--
 arch/x86/xen/enlighten_pv.c          |    2 +-
 arch/x86/xen/irq.c                   |    2 +-
 6 files changed, 21 insertions(+), 9 deletions(-)

--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -168,7 +168,7 @@ static inline void __write_cr4(unsigned
 	PVOP_VCALL1(cpu.write_cr4, x);
 }
 
-static inline void arch_safe_halt(void)
+static __always_inline void arch_safe_halt(void)
 {
 	PVOP_VCALL0(irq.safe_halt);
 }
@@ -178,7 +178,9 @@ static inline void halt(void)
 	PVOP_VCALL0(irq.halt);
 }
 
-static inline void wbinvd(void)
+extern noinstr void pv_native_wbinvd(void);
+
+static __always_inline void wbinvd(void)
 {
 	PVOP_ALT_VCALL0(cpu.wbinvd, "wbinvd", ALT_NOT(X86_FEATURE_XENPV));
 }
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -115,7 +115,7 @@ static inline void wrpkru(u32 pkru)
 }
 #endif
 
-static inline void native_wbinvd(void)
+static __always_inline void native_wbinvd(void)
 {
 	asm volatile("wbinvd": : :"memory");
 }
@@ -179,7 +179,7 @@ static inline void __write_cr4(unsigned
 	native_write_cr4(x);
 }
 
-static inline void wbinvd(void)
+static __always_inline void wbinvd(void)
 {
 	native_wbinvd();
 }
--- a/arch/x86/include/asm/xen/hypercall.h
+++ b/arch/x86/include/asm/xen/hypercall.h
@@ -382,7 +382,7 @@ MULTI_stack_switch(struct multicall_entr
 }
 #endif
 
-static inline int
+static __always_inline int
 HYPERVISOR_sched_op(int cmd, void *arg)
 {
 	return _hypercall2(int, sched_op, cmd, arg);
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -233,6 +233,11 @@ static noinstr void pv_native_set_debugr
 	native_set_debugreg(regno, val);
 }
 
+noinstr void pv_native_wbinvd(void)
+{
+	native_wbinvd();
+}
+
 static noinstr void pv_native_irq_enable(void)
 {
 	native_irq_enable();
@@ -242,6 +247,11 @@ static noinstr void pv_native_irq_disabl
 {
 	native_irq_disable();
 }
+
+static noinstr void pv_native_safe_halt(void)
+{
+	native_safe_halt();
+}
 #endif
 
 enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
@@ -273,7 +283,7 @@ struct paravirt_patch_template pv_ops =
 	.cpu.read_cr0		= native_read_cr0,
 	.cpu.write_cr0		= native_write_cr0,
 	.cpu.write_cr4		= native_write_cr4,
-	.cpu.wbinvd		= native_wbinvd,
+	.cpu.wbinvd		= pv_native_wbinvd,
 	.cpu.read_msr		= native_read_msr,
 	.cpu.write_msr		= native_write_msr,
 	.cpu.read_msr_safe	= native_read_msr_safe,
@@ -307,7 +317,7 @@ struct paravirt_patch_template pv_ops =
 	.irq.save_fl		= __PV_IS_CALLEE_SAVE(native_save_fl),
 	.irq.irq_disable	= __PV_IS_CALLEE_SAVE(pv_native_irq_disable),
 	.irq.irq_enable		= __PV_IS_CALLEE_SAVE(pv_native_irq_enable),
-	.irq.safe_halt		= native_safe_halt,
+	.irq.safe_halt		= pv_native_safe_halt,
 	.irq.halt		= native_halt,
 #endif /* CONFIG_PARAVIRT_XXL */
 
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1019,7 +1019,7 @@ static const typeof(pv_ops) xen_cpu_ops
 
 		.write_cr4 = xen_write_cr4,
 
-		.wbinvd = native_wbinvd,
+		.wbinvd = pv_native_wbinvd,
 
 		.read_msr = xen_read_msr,
 		.write_msr = xen_write_msr,
--- a/arch/x86/xen/irq.c
+++ b/arch/x86/xen/irq.c
@@ -24,7 +24,7 @@ noinstr void xen_force_evtchn_callback(v
 	(void)HYPERVISOR_xen_version(0, NULL);
 }
 
-static void xen_safe_halt(void)
+static noinstr void xen_safe_halt(void)
 {
 	/* Blocking includes an implicit local_irq_enable(). */
 	if (HYPERVISOR_sched_op(SCHEDOP_block, NULL) != 0)


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 30/36] cpuidle,nospec: Make noinstr clean
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (28 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 29/36] cpuidle,xenpv: Make more PARAVIRT_XXL " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 31/36] cpuidle,acpi: " Peter Zijlstra
                   ` (6 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

vmlinux.o: warning: objtool: mwait_idle+0x47: call to mds_idle_clear_cpu_buffers() leaves .noinstr.text section
vmlinux.o: warning: objtool: acpi_processor_ffh_cstate_enter+0xa2: call to mds_idle_clear_cpu_buffers() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle+0x91: call to mds_idle_clear_cpu_buffers() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_s2idle+0x8c: call to mds_idle_clear_cpu_buffers() leaves .noinstr.text section
vmlinux.o: warning: objtool: intel_idle_irq+0xaa: call to mds_idle_clear_cpu_buffers() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/include/asm/nospec-branch.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/x86/include/asm/nospec-branch.h
+++ b/arch/x86/include/asm/nospec-branch.h
@@ -310,7 +310,7 @@ static __always_inline void mds_user_cle
  *
  * Clear CPU buffers if the corresponding static key is enabled
  */
-static inline void mds_idle_clear_cpu_buffers(void)
+static __always_inline void mds_idle_clear_cpu_buffers(void)
 {
 	if (static_branch_likely(&mds_idle_clear))
 		mds_clear_cpu_buffers();


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 31/36] cpuidle,acpi: Make noinstr clean
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (29 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 30/36] cpuidle,nospec: Make " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-07-06 14:04   ` Rafael J. Wysocki
  2022-06-08 14:27 ` [PATCH 32/36] ftrace: WARN on rcuidle Peter Zijlstra
                   ` (5 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

vmlinux.o: warning: objtool: io_idle+0xc: call to __inb.isra.0() leaves .noinstr.text section
vmlinux.o: warning: objtool: acpi_idle_enter+0xfe: call to num_online_cpus() leaves .noinstr.text section
vmlinux.o: warning: objtool: acpi_idle_enter+0x115: call to acpi_idle_fallback_to_c1.isra.0() leaves .noinstr.text section

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/x86/include/asm/shared/io.h |    4 ++--
 drivers/acpi/processor_idle.c    |    2 +-
 include/linux/cpumask.h          |    4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

--- a/arch/x86/include/asm/shared/io.h
+++ b/arch/x86/include/asm/shared/io.h
@@ -5,13 +5,13 @@
 #include <linux/types.h>
 
 #define BUILDIO(bwl, bw, type)						\
-static inline void __out##bwl(type value, u16 port)			\
+static __always_inline void __out##bwl(type value, u16 port)		\
 {									\
 	asm volatile("out" #bwl " %" #bw "0, %w1"			\
 		     : : "a"(value), "Nd"(port));			\
 }									\
 									\
-static inline type __in##bwl(u16 port)					\
+static __always_inline type __in##bwl(u16 port)				\
 {									\
 	type value;							\
 	asm volatile("in" #bwl " %w1, %" #bw "0"			\
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -593,7 +593,7 @@ static int acpi_idle_play_dead(struct cp
 	return 0;
 }
 
-static bool acpi_idle_fallback_to_c1(struct acpi_processor *pr)
+static __always_inline bool acpi_idle_fallback_to_c1(struct acpi_processor *pr)
 {
 	return IS_ENABLED(CONFIG_HOTPLUG_CPU) && !pr->flags.has_cst &&
 		!(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED);
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -908,9 +908,9 @@ static inline const struct cpumask *get_
  * concurrent CPU hotplug operations unless invoked from a cpuhp_lock held
  * region.
  */
-static inline unsigned int num_online_cpus(void)
+static __always_inline unsigned int num_online_cpus(void)
 {
-	return atomic_read(&__num_online_cpus);
+	return arch_atomic_read(&__num_online_cpus);
 }
 #define num_possible_cpus()	cpumask_weight(cpu_possible_mask)
 #define num_present_cpus()	cpumask_weight(cpu_present_mask)


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 32/36] ftrace: WARN on rcuidle
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (30 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 31/36] cpuidle,acpi: " Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle() Peter Zijlstra
                   ` (4 subsequent siblings)
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

CONFIG_GENERIC_ENTRY disallows any and all tracing when RCU isn't
enabled.

XXX if s390 (the only other GENERIC_ENTRY user as of this writing)
isn't comfortable with this, we could switch to
HAVE_NOINSTR_VALIDATION which is x86_64 only atm.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 include/linux/tracepoint.h |   13 ++++++++++++-
 kernel/trace/trace.c       |    3 +++
 2 files changed, 15 insertions(+), 1 deletion(-)

--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -178,6 +178,16 @@ static inline struct tracepoint *tracepo
 #endif /* CONFIG_HAVE_STATIC_CALL */
 
 /*
+ * CONFIG_GENERIC_ENTRY archs are expected to have sanitized entry and idle
+ * code that disallow any/all tracing/instrumentation when RCU isn't watching.
+ */
+#ifdef CONFIG_GENERIC_ENTRY
+#define RCUIDLE_COND(rcuidle)	(rcuidle)
+#else
+#define RCUIDLE_COND(rcuidle)	(rcuidle && in_nmi())
+#endif
+
+/*
  * it_func[0] is never NULL because there is at least one element in the array
  * when the array itself is non NULL.
  */
@@ -189,7 +199,8 @@ static inline struct tracepoint *tracepo
 			return;						\
 									\
 		/* srcu can't be used from NMI */			\
-		WARN_ON_ONCE(rcuidle && in_nmi());			\
+		if (WARN_ON_ONCE(RCUIDLE_COND(rcuidle)))		\
+			return;						\
 									\
 		/* keep srcu and sched-rcu usage consistent */		\
 		preempt_disable_notrace();				\
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3104,6 +3104,9 @@ void __trace_stack(struct trace_array *t
 		return;
 	}
 
+	if (WARN_ON_ONCE(IS_ENABLED(CONFIG_GENERIC_ENTRY)))
+		return;
+
 	/*
 	 * When an NMI triggers, RCU is enabled via rcu_nmi_enter(),
 	 * but if the above rcu_is_watching() failed, then the NMI


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (31 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 32/36] ftrace: WARN on rcuidle Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 16:28   ` Arnd Bergmann
  2022-06-08 14:27 ` [PATCH 34/36] cpuidle,omap3: Push RCU-idle into omap_sram_idle() Peter Zijlstra
                   ` (3 subsequent siblings)
  36 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

arch_cpu_idle() is a very simple idle interface and exposes only a
single idle state and is expected to not require RCU and not do any
tracing/instrumentation.

As such, omap_sram_idle() is not a valid implementation. Replace it
with the simple (shallow) omap3_do_wfi() call. Leaving the more
complicated idle states for the cpuidle driver.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-omap2/pm34xx.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -294,7 +294,7 @@ static void omap3_pm_idle(void)
 	if (omap_irq_pending())
 		return;
 
-	omap_sram_idle();
+	omap3_do_wfi();
 }
 
 #ifdef CONFIG_SUSPEND


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 34/36] cpuidle,omap3: Push RCU-idle into omap_sram_idle()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (32 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 15:04   ` Peter Zijlstra
       [not found]   ` <Yqcv6crSNKuSWoTu@atomide.com>
  2022-06-08 14:27 ` [PATCH 35/36] cpuidle,powerdomain: Remove trace_.*_rcuidle() Peter Zijlstra
                   ` (2 subsequent siblings)
  36 siblings, 2 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

OMAP3 uses full SoC suspend modes as idle states, as such it needs the
whole power-domain and clock-domain code from the idle path.

All that code is not suitable to run with RCU disabled, as such push
RCU-idle deeper still.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-omap2/cpuidle34xx.c |    4 +---
 arch/arm/mach-omap2/pm.h          |    2 +-
 arch/arm/mach-omap2/pm34xx.c      |   12 ++++++++++--
 3 files changed, 12 insertions(+), 6 deletions(-)

--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -133,9 +133,7 @@ static int omap3_enter_idle(struct cpuid
 	}
 
 	/* Execute ARM wfi */
-	cpuidle_rcu_enter();
-	omap_sram_idle();
-	cpuidle_rcu_exit();
+	omap_sram_idle(true);
 
 	/*
 	 * Call idle CPU PM enter notifier chain to restore
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -29,7 +29,7 @@ static inline int omap4_idle_init(void)
 
 extern void *omap3_secure_ram_storage;
 extern void omap3_pm_off_mode_enable(int);
-extern void omap_sram_idle(void);
+extern void omap_sram_idle(bool rcuidle);
 extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused);
 
 #if defined(CONFIG_PM_OPP)
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -26,6 +26,7 @@
 #include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+#include <linux/cpuidle.h>
 
 #include <trace/events/power.h>
 
@@ -174,7 +175,7 @@ static int omap34xx_do_sram_idle(unsigne
 	return 0;
 }
 
-void omap_sram_idle(void)
+void omap_sram_idle(bool rcuidle)
 {
 	/* Variable to tell what needs to be saved and restored
 	 * in omap_sram_idle*/
@@ -254,11 +255,18 @@ void omap_sram_idle(void)
 	 */
 	if (save_state)
 		omap34xx_save_context(omap3_arm_context);
+
+	if (rcuidle)
+		cpuidle_rcu_enter();
+
 	if (save_state == 1 || save_state == 3)
 		cpu_suspend(save_state, omap34xx_do_sram_idle);
 	else
 		omap34xx_do_sram_idle(save_state);
 
+	if (rcuidle)
+		rcuidle_rcu_exit();
+
 	/* Restore normal SDRC POWER settings */
 	if (cpu_is_omap3430() && omap_rev() >= OMAP3430_REV_ES3_0 &&
 	    (omap_type() == OMAP2_DEVICE_TYPE_EMU ||
@@ -316,7 +324,7 @@ static int omap3_pm_suspend(void)
 
 	omap3_intc_suspend();
 
-	omap_sram_idle();
+	omap_sram_idle(false);
 
 restore:
 	/* Restore next_pwrsts */


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 35/36] cpuidle,powerdomain: Remove trace_.*_rcuidle()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (33 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 34/36] cpuidle,omap3: Push RCU-idle into omap_sram_idle() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-08 14:27 ` [PATCH 36/36] cpuidle,clk: " Peter Zijlstra
  2022-06-14 11:19 ` [PATCH 00/36] cpuidle,rcu: Cleanup the mess Mark Rutland
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

OMAP was the one and only user.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 arch/arm/mach-omap2/powerdomain.c |   10 +++++-----
 drivers/base/power/runtime.c      |   24 ++++++++++++------------
 2 files changed, 17 insertions(+), 17 deletions(-)

--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -187,9 +187,9 @@ static int _pwrdm_state_switch(struct po
 			trace_state = (PWRDM_TRACE_STATES_FLAG |
 				       ((next & OMAP_POWERSTATE_MASK) << 8) |
 				       ((prev & OMAP_POWERSTATE_MASK) << 0));
-			trace_power_domain_target_rcuidle(pwrdm->name,
-							  trace_state,
-							  raw_smp_processor_id());
+			trace_power_domain_target(pwrdm->name,
+						  trace_state,
+						  raw_smp_processor_id());
 		}
 		break;
 	default:
@@ -541,8 +541,8 @@ int pwrdm_set_next_pwrst(struct powerdom
 
 	if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) {
 		/* Trace the pwrdm desired target state */
-		trace_power_domain_target_rcuidle(pwrdm->name, pwrst,
-						  raw_smp_processor_id());
+		trace_power_domain_target(pwrdm->name, pwrst,
+					  raw_smp_processor_id());
 		/* Program the pwrdm desired target state */
 		ret = arch_pwrdm->pwrdm_set_next_pwrst(pwrdm, pwrst);
 	}
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -442,7 +442,7 @@ static int rpm_idle(struct device *dev,
 	int (*callback)(struct device *);
 	int retval;
 
-	trace_rpm_idle_rcuidle(dev, rpmflags);
+	trace_rpm_idle(dev, rpmflags);
 	retval = rpm_check_suspend_allowed(dev);
 	if (retval < 0)
 		;	/* Conditions are wrong. */
@@ -481,7 +481,7 @@ static int rpm_idle(struct device *dev,
 			dev->power.request_pending = true;
 			queue_work(pm_wq, &dev->power.work);
 		}
-		trace_rpm_return_int_rcuidle(dev, _THIS_IP_, 0);
+		trace_rpm_return_int(dev, _THIS_IP_, 0);
 		return 0;
 	}
 
@@ -493,7 +493,7 @@ static int rpm_idle(struct device *dev,
 	wake_up_all(&dev->power.wait_queue);
 
  out:
-	trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
+	trace_rpm_return_int(dev, _THIS_IP_, retval);
 	return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO);
 }
 
@@ -557,7 +557,7 @@ static int rpm_suspend(struct device *de
 	struct device *parent = NULL;
 	int retval;
 
-	trace_rpm_suspend_rcuidle(dev, rpmflags);
+	trace_rpm_suspend(dev, rpmflags);
 
  repeat:
 	retval = rpm_check_suspend_allowed(dev);
@@ -708,7 +708,7 @@ static int rpm_suspend(struct device *de
 	}
 
  out:
-	trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
+	trace_rpm_return_int(dev, _THIS_IP_, retval);
 
 	return retval;
 
@@ -760,7 +760,7 @@ static int rpm_resume(struct device *dev
 	struct device *parent = NULL;
 	int retval = 0;
 
-	trace_rpm_resume_rcuidle(dev, rpmflags);
+	trace_rpm_resume(dev, rpmflags);
 
  repeat:
 	if (dev->power.runtime_error) {
@@ -925,7 +925,7 @@ static int rpm_resume(struct device *dev
 		spin_lock_irq(&dev->power.lock);
 	}
 
-	trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
+	trace_rpm_return_int(dev, _THIS_IP_, retval);
 
 	return retval;
 }
@@ -1081,7 +1081,7 @@ int __pm_runtime_idle(struct device *dev
 		if (retval < 0) {
 			return retval;
 		} else if (retval > 0) {
-			trace_rpm_usage_rcuidle(dev, rpmflags);
+			trace_rpm_usage(dev, rpmflags);
 			return 0;
 		}
 	}
@@ -1119,7 +1119,7 @@ int __pm_runtime_suspend(struct device *
 		if (retval < 0) {
 			return retval;
 		} else if (retval > 0) {
-			trace_rpm_usage_rcuidle(dev, rpmflags);
+			trace_rpm_usage(dev, rpmflags);
 			return 0;
 		}
 	}
@@ -1202,7 +1202,7 @@ int pm_runtime_get_if_active(struct devi
 	} else {
 		retval = atomic_inc_not_zero(&dev->power.usage_count);
 	}
-	trace_rpm_usage_rcuidle(dev, 0);
+	trace_rpm_usage(dev, 0);
 	spin_unlock_irqrestore(&dev->power.lock, flags);
 
 	return retval;
@@ -1566,7 +1566,7 @@ void pm_runtime_allow(struct device *dev
 	if (ret == 0)
 		rpm_idle(dev, RPM_AUTO | RPM_ASYNC);
 	else if (ret > 0)
-		trace_rpm_usage_rcuidle(dev, RPM_AUTO | RPM_ASYNC);
+		trace_rpm_usage(dev, RPM_AUTO | RPM_ASYNC);
 
  out:
 	spin_unlock_irq(&dev->power.lock);
@@ -1635,7 +1635,7 @@ static void update_autosuspend(struct de
 			atomic_inc(&dev->power.usage_count);
 			rpm_resume(dev, 0);
 		} else {
-			trace_rpm_usage_rcuidle(dev, 0);
+			trace_rpm_usage(dev, 0);
 		}
 	}
 


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* [PATCH 36/36] cpuidle,clk: Remove trace_.*_rcuidle()
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (34 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 35/36] cpuidle,powerdomain: Remove trace_.*_rcuidle() Peter Zijlstra
@ 2022-06-08 14:27 ` Peter Zijlstra
  2022-06-14 11:19 ` [PATCH 00/36] cpuidle,rcu: Cleanup the mess Mark Rutland
  36 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 14:27 UTC (permalink / raw)
  To: peterz
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86, linux,
	mingo, aou, paulmck, hca, stefan.kristiansson, openrisc,
	paul.walmsley, linux-tegra, namhyung, andriy.shevchenko, jpoimboe,
	jgross, monstr, linux-mips, palmer, anup, ink, johannes,
	linuxppc-dev

OMAP was the one and only user.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/clk/clk.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -978,12 +978,12 @@ static void clk_core_disable(struct clk_
 	if (--core->enable_count > 0)
 		return;
 
-	trace_clk_disable_rcuidle(core);
+	trace_clk_disable(core);
 
 	if (core->ops->disable)
 		core->ops->disable(core->hw);
 
-	trace_clk_disable_complete_rcuidle(core);
+	trace_clk_disable_complete(core);
 
 	clk_core_disable(core->parent);
 }
@@ -1037,12 +1037,12 @@ static int clk_core_enable(struct clk_co
 		if (ret)
 			return ret;
 
-		trace_clk_enable_rcuidle(core);
+		trace_clk_enable(core);
 
 		if (core->ops->enable)
 			ret = core->ops->enable(core->hw);
 
-		trace_clk_enable_complete_rcuidle(core);
+		trace_clk_enable_complete(core);
 
 		if (ret) {
 			clk_core_disable(core->parent);


_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
  2022-06-08 14:27 ` [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE Peter Zijlstra
@ 2022-06-08 15:01   ` Rafael J. Wysocki
  2022-06-08 15:48     ` Peter Zijlstra
       [not found]   ` <20220609164921.5e61711d@jacob-builder>
       [not found]   ` <20220725194306.GA14746@lespinasse.org>
  2 siblings, 1 reply; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-06-08 15:01 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, chris, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	lpieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
> Xeons") wrecked intel_idle in two ways:
>
>  - must not have tracing in idle functions
>  - must return with IRQs disabled
>
> Additionally, it added a branch for no good reason.
>
> Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

And do I think correctly that this can be applied without the rest of
the series?

> ---
>  drivers/idle/intel_idle.c |   48 +++++++++++++++++++++++++++++++++++-----------
>  1 file changed, 37 insertions(+), 11 deletions(-)
>
> --- a/drivers/idle/intel_idle.c
> +++ b/drivers/idle/intel_idle.c
> @@ -129,21 +137,37 @@ static unsigned int mwait_substates __in
>   *
>   * Must be called under local_irq_disable().
>   */
> +
> -static __cpuidle int intel_idle(struct cpuidle_device *dev,
> -                               struct cpuidle_driver *drv, int index)
> +static __always_inline int __intel_idle(struct cpuidle_device *dev,
> +                                       struct cpuidle_driver *drv, int index)
>  {
>         struct cpuidle_state *state = &drv->states[index];
>         unsigned long eax = flg2MWAIT(state->flags);
>         unsigned long ecx = 1; /* break on interrupt flag */
>
> -       if (state->flags & CPUIDLE_FLAG_IRQ_ENABLE)
> -               local_irq_enable();
> -
>         mwait_idle_with_hints(eax, ecx);
>
>         return index;
>  }
>
> +static __cpuidle int intel_idle(struct cpuidle_device *dev,
> +                               struct cpuidle_driver *drv, int index)
> +{
> +       return __intel_idle(dev, drv, index);
> +}
> +
> +static __cpuidle int intel_idle_irq(struct cpuidle_device *dev,
> +                                   struct cpuidle_driver *drv, int index)
> +{
> +       int ret;
> +
> +       raw_local_irq_enable();
> +       ret = __intel_idle(dev, drv, index);
> +       raw_local_irq_disable();
> +
> +       return ret;
> +}
> +
>  /**
>   * intel_idle_s2idle - Ask the processor to enter the given idle state.
>   * @dev: cpuidle device of the target CPU.
> @@ -1801,6 +1824,9 @@ static void __init intel_idle_init_cstat
>                 /* Structure copy. */
>                 drv->states[drv->state_count] = cpuidle_state_table[cstate];
>
> +               if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_IRQ_ENABLE)
> +                       drv->states[drv->state_count].enter = intel_idle_irq;
> +
>                 if ((disabled_states_mask & BIT(drv->state_count)) ||
>                     ((icpu->use_acpi || force_use_acpi) &&
>                      intel_idle_off_by_default(mwait_hint) &&
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 34/36] cpuidle,omap3: Push RCU-idle into omap_sram_idle()
  2022-06-08 14:27 ` [PATCH 34/36] cpuidle,omap3: Push RCU-idle into omap_sram_idle() Peter Zijlstra
@ 2022-06-08 15:04   ` Peter Zijlstra
       [not found]   ` <Yqcv6crSNKuSWoTu@atomide.com>
  1 sibling, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 15:04 UTC (permalink / raw)
  To: rth, ink, mattst88, vgupta, linux, ulli.kroll, linus.walleij,
	shawnguo, Sascha Hauer, kernel, festevam, linux-imx, tony,
	khilman, catalin.marinas, will, guoren, bcain, chenhuacai, kernel,
	geert, sammy, monstr, tsbogend, dinguyen, jonas,
	stefan.kristiansson, shorne, James.Bottomley, deller, mpe, benh,
	paulus, paul.walmsley, palmer, aou, hca, gor, agordeev,
	borntraeger, svens, ysato, dalias, davem, richard, anton.ivanov,
	johannes, tglx, mingo, bp, dave.hansen, x86, hpa, acme,
	mark.rutland, alexander.shishkin, jolsa, namhyung, jgross,
	srivatsa, amakhalov, pv-drivers, boris.ostrovsky, chris, jcmvbkbc,
	rafael, lenb, pavel, gregkh, mturquette, sboyd, daniel.lezcano,
	lpieralisi, sudeep.holla, agross, bjorn.andersson, anup,
	thierry.reding, jonathanh, jacob.jun.pan, Arnd Bergmann,
	yury.norov, andriy.shevchenko, linux, rostedt, pmladek,
	senozhatsky, john.ogness, paulmck, frederic, quic_neeraju, josh,
	mathieu.desnoyers, jiangshanlai, joel, juri.lelli,
	vincent.guittot, dietmar.eggemann, bsegall, mgorman, bristot,
	vschneid, jpoimboe, linux-alpha, linux-kernel, linux-snps-arc,
	linux-arm-kernel, linux-omap, linux-csky, linux-hexagon,
	linux-ia64, linux-m68k, linux-mips, openrisc, linux-parisc,
	linuxppc-dev, linux-riscv, linux-s390, linux-sh, sparclinux,
	linux-um, linux-perf-users, virtualization, xen-devel,
	linux-xtensa, linux-acpi, linux-pm, linux-clk, linux-arm-msm,
	linux-tegra, linux-arch, rcu

On Wed, Jun 08, 2022 at 04:27:57PM +0200, Peter Zijlstra wrote:
> @@ -254,11 +255,18 @@ void omap_sram_idle(void)
>  	 */
>  	if (save_state)
>  		omap34xx_save_context(omap3_arm_context);
> +
> +	if (rcuidle)
> +		cpuidle_rcu_enter();
> +
>  	if (save_state == 1 || save_state == 3)
>  		cpu_suspend(save_state, omap34xx_do_sram_idle);
>  	else
>  		omap34xx_do_sram_idle(save_state);
>  
> +	if (rcuidle)
> +		rcuidle_rcu_exit();

*sigh* so much for this having been exposed to the robots for >2 days :/
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
  2022-06-08 15:01   ` Rafael J. Wysocki
@ 2022-06-08 15:48     ` Peter Zijlstra
  2022-06-08 16:08       ` Rafael J. Wysocki
  0 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-08 15:48 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Juri Lelli, Linux-sh list, Benjamin Herrenschmidt, Linus Walleij,
	Benjamin Segall, Guo Ren, Pavel Machek, Alexander Gordeev,
	linux-arch, Vincent Guittot, Michael Ellerman, Huacai Chen,
	ACPI Devel Maling List, Andy Gross, Geert Uytterhoeven,
	dl-linux-imx, Catalin Marinas, xen-devel, mattst88, lpieralisi,
	sammy, Petr Mladek, Linux PM, Lai Jiangshan, Sascha Hauer,
	linux-um, acme, Thomas Gleixner, Linux OMAP Mailing List,
	Dietmar Eggemann, rth, Greg Kroah-Hartman,
	Linux Kernel Mailing List, linux-perf-users, senozhatsky,
	Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland, linux-ia64,
	Dave Hansen, virtualization, James Bottomley, jcmvbkbc,
	Thierry Reding, kernel, quic_neeraju, linux-s390, vschneid,
	John Ogness, Yoshinori Sato, Fabio Estevam, Helge Deller,
	Daniel Lezcano, Jon Hunter, Mathieu Desnoyers,
	Frederic Weisbecker, Len Brown, linux-xtensa, Sascha Hauer,
	Vasily Gorbik, linux-arm-msm, linux-alpha, linux-m68k,
	Stafford Horne, Linux ARM, chris, Stephen Boyd, dinguyen,
	Daniel Bristot de Oliveira, Alexander Shishkin, Michael Turquette,
	Rasmus Villemoes, Joel Fernandes, Will Deacon, Boris Ostrovsky,
	Kevin Hilman, linux-csky, pv-drivers, linux-snps-arc, Mel Gorman,
	Jacob Pan, Arnd Bergmann, ulli.kroll, vgupta, linux-clk,
	Josh Triplett, Steven Rostedt, rcu, Borislav Petkov, bcain,
	Thomas Bogendoerfer, Parisc List, Sudeep Holla, Shawn Guo,
	David Miller, Rich Felker, Tony Lindgren, amakhalov,
	Bjorn Andersson, H. Peter Anvin, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko,
	jpoimboe, Juergen Gross, Michal Simek,
	open list:BROADCOM NVRAM DRIVER, Palmer Dabbelt, Anup Patel, ink,
	Johannes Berg, linuxppc-dev

On Wed, Jun 08, 2022 at 05:01:05PM +0200, Rafael J. Wysocki wrote:
> On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
> > Xeons") wrecked intel_idle in two ways:
> >
> >  - must not have tracing in idle functions
> >  - must return with IRQs disabled
> >
> > Additionally, it added a branch for no good reason.
> >
> > Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> 
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> And do I think correctly that this can be applied without the rest of
> the series?

Yeah, I don't think this relies on any of the preceding patches. If you
want to route this through the pm/fixes tree that's fine.

Thanks!
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
  2022-06-08 15:48     ` Peter Zijlstra
@ 2022-06-08 16:08       ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-06-08 16:08 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, chris, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	lpieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 5:48 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> On Wed, Jun 08, 2022 at 05:01:05PM +0200, Rafael J. Wysocki wrote:
> > On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
> > >
> > > Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
> > > Xeons") wrecked intel_idle in two ways:
> > >
> > >  - must not have tracing in idle functions
> > >  - must return with IRQs disabled
> > >
> > > Additionally, it added a branch for no good reason.
> > >
> > > Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
> > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> >
> > Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> >
> > And do I think correctly that this can be applied without the rest of
> > the series?
>
> Yeah, I don't think this relies on any of the preceding patches. If you
> want to route this through the pm/fixes tree that's fine.

OK, thanks, applied (and I moved the intel_idle() kerneldoc so it is
next to the function to avoid the docs build warning).
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
  2022-06-08 14:27 ` [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour Peter Zijlstra
@ 2022-06-08 16:22   ` Arnd Bergmann
  2022-06-14 16:22   ` Mark Rutland
  2022-07-06 14:02   ` Rafael J. Wysocki
  2 siblings, 0 replies; 80+ messages in thread
From: Arnd Bergmann @ 2022-06-08 16:22 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael Wysocki, Benjamin Herrenschmidt, Linus Walleij,
	Ben Segall, Guo Ren, Pavel Machek, Alexander Gordeev, linux-arch,
	Vincent Guittot, Michael Ellerman, Huacai Chen,
	ACPI Devel Maling List, Andy Gross, Geert Uytterhoeven,
	NXP Linux Team, Catalin Marinas, xen-devel, Matt Turner,
	Michael Turquette, Sam Creasey, Petr Mladek, Linux PM list,
	Lai Jiangshan, Sascha Hauer, linux-um, Arnaldo Carvalho de Melo,
	Thomas Gleixner, linux-omap, Dietmar Eggemann, Richard Henderson,
	gregkh, Linux Kernel Mailing List, linux-perf-users,
	Sergey Senozhatsky, Sven Schnelle, Jiri Olsa, Paul Mackerras,
	Mark Rutland, open list:IA64 (Itanium) PLATFORM, Dave Hansen,
	open list:DRM DRIVER FOR QEMU'S CIRRUS DEVICE,
	James Bottomley, Max Filippov, Thierry Reding, Xuerui Wang,
	quic_neeraju, linux-s390, vschneid, John Ogness, Yoshinori Sato,
	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, lpieralisi,
	Rasmus Villemoes, Joel Fernandes, Will Deacon, Boris Ostrovsky,
	Kevin Hilman, linux-csky, Pv-drivers,
	open list:SYNOPSYS ARC ARCHITECTURE, Mel Gorman, jacob.jun.pan,
	Arnd Bergmann, Hans Ulli Kroll, Vineet Gupta, linux-clk,
	Josh Triplett, Steven Rostedt, rcu, Borislav Petkov, bcain,
	Thomas Bogendoerfer, Parisc List, Sudeep Holla, Shawn Guo,
	David Miller, Rich Felker, Tony Lindgren, amakhalov,
	Bjorn Andersson, H. Peter Anvin, sparclinux,
	open list: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, jpoimboe, Juergen Gross,
	Michal Simek, open list:BROADCOM NVRAM DRIVER, Palmer Dabbelt,
	Anup Patel, Ivan Kokshaysky, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:27 PM Peter Zijlstra <peterz@infradead.org> 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) <peterz@infradead.org>

I think you now need to add the a raw_local_irq_disable(); in loongarch
as well.

       Arnd
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle()
  2022-06-08 14:27 ` [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle() Peter Zijlstra
@ 2022-06-08 16:28   ` Arnd Bergmann
  2022-06-09  9:40     ` Peter Zijlstra
       [not found]     ` <YqGjqgSrTRseJW6M@atomide.com>
  0 siblings, 2 replies; 80+ messages in thread
From: Arnd Bergmann @ 2022-06-08 16:28 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael Wysocki, Benjamin Herrenschmidt, Linus Walleij,
	Ben Segall, Guo Ren, Pavel Machek, Alexander Gordeev, linux-arch,
	Vincent Guittot, Michael Ellerman, Huacai Chen,
	ACPI Devel Maling List, Andy Gross, Geert Uytterhoeven,
	NXP Linux Team, Catalin Marinas, xen-devel, Matt Turner,
	Michael Turquette, Sam Creasey, Petr Mladek, Linux PM list,
	Lai Jiangshan, Sascha Hauer, linux-um, Arnaldo Carvalho de Melo,
	Thomas Gleixner, linux-omap, Dietmar Eggemann, Richard Henderson,
	gregkh, Linux Kernel Mailing List, linux-perf-users,
	Sergey Senozhatsky, Sven Schnelle, Jiri Olsa, Paul Mackerras,
	Mark Rutland, open list:IA64 (Itanium) PLATFORM, Dave Hansen,
	open list:DRM DRIVER FOR QEMU'S CIRRUS DEVICE,
	James Bottomley, Max Filippov, Thierry Reding, Xuerui Wang,
	quic_neeraju, linux-s390, vschneid, John Ogness, Yoshinori Sato,
	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, lpieralisi,
	Rasmus Villemoes, Joel Fernandes, Will Deacon, Boris Ostrovsky,
	Kevin Hilman, linux-csky, Pv-drivers,
	open list:SYNOPSYS ARC ARCHITECTURE, Mel Gorman, jacob.jun.pan,
	Arnd Bergmann, Hans Ulli Kroll, Vineet Gupta, linux-clk,
	Josh Triplett, Steven Rostedt, rcu, Borislav Petkov, bcain,
	Thomas Bogendoerfer, Parisc List, Sudeep Holla, Shawn Guo,
	David Miller, Rich Felker, Tony Lindgren, amakhalov,
	Bjorn Andersson, H. Peter Anvin, sparclinux,
	open list: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, jpoimboe, Juergen Gross,
	Michal Simek, open list:BROADCOM NVRAM DRIVER, Palmer Dabbelt,
	Anup Patel, Ivan Kokshaysky, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:27 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> arch_cpu_idle() is a very simple idle interface and exposes only a
> single idle state and is expected to not require RCU and not do any
> tracing/instrumentation.
>
> As such, omap_sram_idle() is not a valid implementation. Replace it
> with the simple (shallow) omap3_do_wfi() call. Leaving the more
> complicated idle states for the cpuidle driver.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

I see similar code in omap2:

omap2_pm_idle()
 -> omap2_enter_full_retention()
     -> omap2_sram_suspend()

Is that code path safe to use without RCU or does it need a similar change?

        Arnd
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 02/36] x86/idle: Replace x86_idle with a static_call
  2022-06-08 14:27 ` [PATCH 02/36] x86/idle: Replace x86_idle with a static_call Peter Zijlstra
@ 2022-06-08 18:13   ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-06-08 18:13 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, chris, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	lpieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> Typical boot time setup; no need to suffer an indirect call for that.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> Reviewed-by: Frederic Weisbecker <frederic@kernel.org>

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
>  arch/x86/kernel/process.c |   50 +++++++++++++++++++++++++---------------------
>  1 file changed, 28 insertions(+), 22 deletions(-)
>
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -24,6 +24,7 @@
>  #include <linux/cpuidle.h>
>  #include <linux/acpi.h>
>  #include <linux/elf-randomize.h>
> +#include <linux/static_call.h>
>  #include <trace/events/power.h>
>  #include <linux/hw_breakpoint.h>
>  #include <asm/cpu.h>
> @@ -692,7 +693,23 @@ void __switch_to_xtra(struct task_struct
>  unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
>  EXPORT_SYMBOL(boot_option_idle_override);
>
> -static void (*x86_idle)(void);
> +/*
> + * We use this if we don't have any better idle routine..
> + */
> +void __cpuidle default_idle(void)
> +{
> +       raw_safe_halt();
> +}
> +#if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
> +EXPORT_SYMBOL(default_idle);
> +#endif
> +
> +DEFINE_STATIC_CALL_NULL(x86_idle, default_idle);
> +
> +static bool x86_idle_set(void)
> +{
> +       return !!static_call_query(x86_idle);
> +}
>
>  #ifndef CONFIG_SMP
>  static inline void play_dead(void)
> @@ -715,28 +732,17 @@ void arch_cpu_idle_dead(void)
>  /*
>   * Called from the generic idle code.
>   */
> -void arch_cpu_idle(void)
> -{
> -       x86_idle();
> -}
> -
> -/*
> - * We use this if we don't have any better idle routine..
> - */
> -void __cpuidle default_idle(void)
> +void __cpuidle arch_cpu_idle(void)
>  {
> -       raw_safe_halt();
> +       static_call(x86_idle)();
>  }
> -#if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
> -EXPORT_SYMBOL(default_idle);
> -#endif
>
>  #ifdef CONFIG_XEN
>  bool xen_set_default_idle(void)
>  {
> -       bool ret = !!x86_idle;
> +       bool ret = x86_idle_set();
>
> -       x86_idle = default_idle;
> +       static_call_update(x86_idle, default_idle);
>
>         return ret;
>  }
> @@ -859,20 +865,20 @@ void select_idle_routine(const struct cp
>         if (boot_option_idle_override == IDLE_POLL && smp_num_siblings > 1)
>                 pr_warn_once("WARNING: polling idle and HT enabled, performance may degrade\n");
>  #endif
> -       if (x86_idle || boot_option_idle_override == IDLE_POLL)
> +       if (x86_idle_set() || boot_option_idle_override == IDLE_POLL)
>                 return;
>
>         if (boot_cpu_has_bug(X86_BUG_AMD_E400)) {
>                 pr_info("using AMD E400 aware idle routine\n");
> -               x86_idle = amd_e400_idle;
> +               static_call_update(x86_idle, amd_e400_idle);
>         } else if (prefer_mwait_c1_over_halt(c)) {
>                 pr_info("using mwait in idle threads\n");
> -               x86_idle = mwait_idle;
> +               static_call_update(x86_idle, mwait_idle);
>         } else if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST)) {
>                 pr_info("using TDX aware idle routine\n");
> -               x86_idle = tdx_safe_halt;
> +               static_call_update(x86_idle, tdx_safe_halt);
>         } else
> -               x86_idle = default_idle;
> +               static_call_update(x86_idle, default_idle);
>  }
>
>  void amd_e400_c1e_apic_setup(void)
> @@ -925,7 +931,7 @@ static int __init idle_setup(char *str)
>                  * To continue to load the CPU idle driver, don't touch
>                  * the boot_option_idle_override.
>                  */
> -               x86_idle = default_idle;
> +               static_call_update(x86_idle, default_idle);
>                 boot_option_idle_override = IDLE_HALT;
>         } else if (!strcmp(str, "nomwait")) {
>                 /*
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
  2022-06-08 14:27 ` [PATCH 24/36] printk: " Peter Zijlstra
@ 2022-06-09  9:16   ` Petr Mladek via Virtualization
  2022-06-09 10:02     ` Peter Zijlstra
  2022-06-09 10:14   ` Petr Mladek via Virtualization
  1 sibling, 1 reply; 80+ messages in thread
From: Petr Mladek via Virtualization @ 2022-06-09  9:16 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, linux-pm, jiangshanlai, Sascha Hauer,
	linux-um, acme, tglx, linux-omap, dietmar.eggemann, gregkh,
	linux-kernel, linux-perf-users, senozhatsky, svens, jolsa, paulus,
	mark.rutland, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed 2022-06-08 16:27:47, Peter Zijlstra wrote:
> The problem, per commit fc98c3c8c9dc ("printk: use rcuidle console
> tracepoint"), was printk usage from the cpuidle path where RCU was
> already disabled.
> 
> Per the patches earlier in this series, this is no longer the case.

My understanding is that this series reduces a lot the amount
of code called with RCU disabled. As a result the particular printk()
call mentioned by commit fc98c3c8c9dc ("printk: use rcuidle console
tracepoint") is called with RCU enabled now. Hence this particular
problem is fixed better way now.

But is this true in general?
Does this "prevent" calling printk() a safe way in code with
RCU disabled?

I am not sure if anyone cares. printk() is the best effort
functionality because of the consoles code anyway. Also I wonder
if anyone uses this trace_console().

Therefore if this patch allows to remove some tricky tracing
code then it might be worth it. But if trace_console_rcuidle()
variant is still going to be available then I would keep using it.

Best Regards,
Petr

> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
>  kernel/printk/printk.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -2238,7 +2238,7 @@ static u16 printk_sprint(char *text, u16
>  		}
>  	}
>  
> -	trace_console_rcuidle(text, text_len);
> +	trace_console(text, text_len);
>  
>  	return text_len;
>  }
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle()
  2022-06-08 16:28   ` Arnd Bergmann
@ 2022-06-09  9:40     ` Peter Zijlstra
       [not found]     ` <YqGjqgSrTRseJW6M@atomide.com>
  1 sibling, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-09  9:40 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Juri Lelli, Rafael Wysocki, Benjamin Herrenschmidt, Linus Walleij,
	Ben Segall, Guo Ren, Pavel Machek, Alexander Gordeev, linux-arch,
	Vincent Guittot, Michael Ellerman, Huacai Chen,
	ACPI Devel Maling List, Andy Gross, Geert Uytterhoeven,
	NXP Linux Team, Catalin Marinas, xen-devel, Matt Turner,
	Michael Turquette, Sam Creasey, Petr Mladek, Linux PM list,
	Lai Jiangshan, Sascha Hauer, linux-um, Arnaldo Carvalho de Melo,
	Thomas Gleixner, linux-omap, Dietmar Eggemann, Richard Henderson,
	gregkh, Linux Kernel Mailing List, linux-perf-users,
	Sergey Senozhatsky, Sven Schnelle, Jiri Olsa, Paul Mackerras,
	Mark Rutland, open list:IA64 (Itanium) PLATFORM, Dave Hansen,
	open list:DRM DRIVER FOR QEMU'S CIRRUS DEVICE,
	James Bottomley, Max Filippov, Thierry Reding, Xuerui Wang,
	quic_neeraju, linux-s390, vschneid, John Ogness, Yoshinori Sato,
	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, lpieralisi,
	Rasmus Villemoes, Joel Fernandes, Will Deacon, Boris Ostrovsky,
	Kevin Hilman, linux-csky, Pv-drivers,
	open list:SYNOPSYS ARC ARCHITECTURE, Mel Gorman, jacob.jun.pan,
	Yury Norov, Hans Ulli Kroll, Vineet Gupta, linux-clk,
	Josh Triplett, Steven Rostedt, rcu, Borislav Petkov, bcain,
	Thomas Bogendoerfer, Parisc List, Sudeep Holla, Shawn Guo,
	David Miller, Rich Felker, Tony Lindgren, amakhalov,
	Bjorn Andersson, H. Peter Anvin, sparclinux,
	open list:QUALCOMM HEXAGON..., linux-riscv, Anton Ivanov,
	Jonas Bonn, 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, jpoimboe, Juergen Gross, Michal Simek,
	open list:BROADCOM NVRAM DRIVER, Palmer Dabbelt, Anup Patel,
	Ivan Kokshaysky, Johannes Berg, linuxppc-dev

On Wed, Jun 08, 2022 at 06:28:33PM +0200, Arnd Bergmann wrote:
> On Wed, Jun 8, 2022 at 4:27 PM Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > arch_cpu_idle() is a very simple idle interface and exposes only a
> > single idle state and is expected to not require RCU and not do any
> > tracing/instrumentation.
> >
> > As such, omap_sram_idle() is not a valid implementation. Replace it
> > with the simple (shallow) omap3_do_wfi() call. Leaving the more
> > complicated idle states for the cpuidle driver.
> >
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> 
> I see similar code in omap2:
> 
> omap2_pm_idle()
>  -> omap2_enter_full_retention()
>      -> omap2_sram_suspend()
> 
> Is that code path safe to use without RCU or does it need a similar change?

It needs a similar change, clearly I was running on fumes to not have
found that when grepping around the omap code :/
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle()
       [not found]     ` <YqGjqgSrTRseJW6M@atomide.com>
@ 2022-06-09  9:47       ` Peter Zijlstra
  0 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-09  9:47 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Juri Lelli, Rafael Wysocki, Benjamin Herrenschmidt, Linus Walleij,
	Ben Segall, Guo Ren, Pavel Machek, Alexander Gordeev, linux-arch,
	Vincent Guittot, Michael Ellerman, Huacai Chen,
	ACPI Devel Maling List, Andy Gross, Geert Uytterhoeven,
	NXP Linux Team, Catalin Marinas, xen-devel, Matt Turner,
	Michael Turquette, Sam Creasey, Petr Mladek, Linux PM list,
	Lai Jiangshan, Sascha Hauer, linux-um, Arnaldo Carvalho de Melo,
	Thomas Gleixner, linux-omap, Dietmar Eggemann, Richard Henderson,
	gregkh, Linux Kernel Mailing List, linux-perf-users,
	Sergey Senozhatsky, Sven Schnelle, Jiri Olsa, Paul Mackerras,
	Mark Rutland, open list:IA64 (Itanium) PLATFORM, Dave Hansen,
	open list:DRM DRIVER FOR QEMU'S CIRRUS DEVICE,
	James Bottomley, Max Filippov, Thierry Reding, Xuerui Wang,
	quic_neeraju, linux-s390, vschneid, John Ogness, Yoshinori Sato,
	Linux-sh list, Will Deacon, 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, lpieralisi,
	Rasmus Villemoes, Joel Fernandes, Fabio Estevam, Boris Ostrovsky,
	Kevin Hilman, linux-csky, open list:SYNOPSYS ARC ARCHITECTURE,
	Mel Gorman, jacob.jun.pan, Arnd Bergmann, Hans Ulli Kroll,
	Vineet Gupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Pv-drivers,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	open list: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, jpoimboe, Juergen Gross,
	Michal Simek, open list:BROADCOM NVRAM DRIVER, Palmer Dabbelt,
	Anup Patel, Ivan Kokshaysky, Johannes Berg, linuxppc-dev

On Thu, Jun 09, 2022 at 10:39:22AM +0300, Tony Lindgren wrote:
> * Arnd Bergmann <arnd@arndb.de> [220608 18:18]:
> > On Wed, Jun 8, 2022 at 4:27 PM Peter Zijlstra <peterz@infradead.org> wrote:
> > >
> > > arch_cpu_idle() is a very simple idle interface and exposes only a
> > > single idle state and is expected to not require RCU and not do any
> > > tracing/instrumentation.
> > >
> > > As such, omap_sram_idle() is not a valid implementation. Replace it
> > > with the simple (shallow) omap3_do_wfi() call. Leaving the more
> > > complicated idle states for the cpuidle driver.
> 
> Agreed it makes sense to limit deeper idle states to cpuidle. Hopefully
> there is some informative splat for attempting to use arch_cpu_ide()
> for deeper idle states :)

The arch_cpu_idle() interface doesn't allow one to express a desire for
deeper states. I'm not sure how anyone could even attempt this.

But given what OMAP needs to go deeper, this would involve things that
require RCU, combine that with the follow up patches that rip out all
the trace_.*_rcuidle() hackery from the power and clock domain code,
PROVE_RCU should scream if anybody were to attempt it.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
  2022-06-09  9:16   ` Petr Mladek via Virtualization
@ 2022-06-09 10:02     ` Peter Zijlstra
       [not found]       ` <CA+_sPaoJGrXhNPCs2dKf2J7u07y1xYrRFZBUtkKwzK9GqcHSuQ@mail.gmail.com>
  2022-06-09 13:06       ` Petr Mladek via Virtualization
  0 siblings, 2 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-09 10:02 UTC (permalink / raw)
  To: Petr Mladek
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, linux-pm, jiangshanlai, Sascha Hauer,
	linux-um, acme, tglx, linux-omap, dietmar.eggemann, gregkh,
	linux-kernel, linux-perf-users, senozhatsky, svens, jolsa, paulus,
	mark.rutland, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Thu, Jun 09, 2022 at 11:16:46AM +0200, Petr Mladek wrote:
> On Wed 2022-06-08 16:27:47, Peter Zijlstra wrote:
> > The problem, per commit fc98c3c8c9dc ("printk: use rcuidle console
> > tracepoint"), was printk usage from the cpuidle path where RCU was
> > already disabled.
> > 
> > Per the patches earlier in this series, this is no longer the case.
> 
> My understanding is that this series reduces a lot the amount
> of code called with RCU disabled. As a result the particular printk()
> call mentioned by commit fc98c3c8c9dc ("printk: use rcuidle console
> tracepoint") is called with RCU enabled now. Hence this particular
> problem is fixed better way now.
> 
> But is this true in general?
> Does this "prevent" calling printk() a safe way in code with
> RCU disabled?

On x86_64, yes. Other architectures, less so.

Specifically, the objtool noinstr validation pass will warn at build
time (DEBUG_ENTRY=y) if any noinstr/cpuidle code does a call to
non-vetted code like printk().

At the same time; there's a few hacks that allow WARN to work, but
mostly if you hit WARN in entry/noinstr you get to keep the pieces in
any case.

On other architecture we'll need to rely on runtime coverage with
PROVE_RCU. That is, if a splat like in the above mentioned commit
happens again, we'll need to fix it by adjusting the callchain, not by
mucking about with RCU state.

> I am not sure if anyone cares. printk() is the best effort
> functionality because of the consoles code anyway. Also I wonder
> if anyone uses this trace_console().

This is the tracepoint used to spool all of printk into ftrace, I
suspect there's users, but I haven't used it myself.

> Therefore if this patch allows to remove some tricky tracing
> code then it might be worth it. But if trace_console_rcuidle()
> variant is still going to be available then I would keep using it.

My ultimate goal is to delete trace_.*_rcuidle() and RCU_NONIDLE()
entirely. We're close, but not quite there yet.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
  2022-06-08 14:27 ` [PATCH 24/36] printk: " Peter Zijlstra
  2022-06-09  9:16   ` Petr Mladek via Virtualization
@ 2022-06-09 10:14   ` Petr Mladek via Virtualization
  1 sibling, 0 replies; 80+ messages in thread
From: Petr Mladek via Virtualization @ 2022-06-09 10:14 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, linux-pm, jiangshanlai, Sascha Hauer,
	linux-um, acme, tglx, linux-omap, dietmar.eggemann, gregkh,
	linux-kernel, linux-perf-users, senozhatsky, svens, jolsa, paulus,
	mark.rutland, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

Sending again. The previous attempt was rejected by several
recipients. It was caused by a mail server changes on my side.

I am sorry for spamming those who got the 1st mail already.

On Wed 2022-06-08 16:27:47, Peter Zijlstra wrote:
> The problem, per commit fc98c3c8c9dc ("printk: use rcuidle console
> tracepoint"), was printk usage from the cpuidle path where RCU was
> already disabled.
> 
> Per the patches earlier in this series, this is no longer the case.

My understanding is that this series reduces a lot the amount
of code called with RCU disabled. As a result the particular printk()
call mentioned by commit fc98c3c8c9dc ("printk: use rcuidle console
tracepoint") is called with RCU enabled now. Hence this particular
problem is fixed better way now.

But is this true in general?
Does this "prevent" calling printk() a safe way in code with
RCU disabled?

I am not sure if anyone cares. printk() is the best effort
functionality because of the consoles code anyway. Also I wonder
if anyone uses this trace_console().

Therefore if this patch allows to remove some tricky tracing
code then it might be worth it. But if trace_console_rcuidle()
variant is still going to be available then I would keep using it.

Best Regards,
Petr

> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
>  kernel/printk/printk.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> --- a/kernel/printk/printk.c
> +++ b/kernel/printk/printk.c
> @@ -2238,7 +2238,7 @@ static u16 printk_sprint(char *text, u16
>  		}
>  	}
>  
> -	trace_console_rcuidle(text, text_len);
> +	trace_console(text, text_len);
>  
>  	return text_len;
>  }
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
       [not found]       ` <CA+_sPaoJGrXhNPCs2dKf2J7u07y1xYrRFZBUtkKwzK9GqcHSuQ@mail.gmail.com>
@ 2022-06-09 13:02         ` Petr Mladek via Virtualization
  2022-06-14 14:37           ` Steven Rostedt
  0 siblings, 1 reply; 80+ messages in thread
From: Petr Mladek via Virtualization @ 2022-06-09 13:02 UTC (permalink / raw)
  To: Sergey Senozhatsky
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, linux-pm, jiangshanlai, Sascha Hauer,
	linux-um, acme, tglx, linux-omap, dietmar.eggemann, gregkh,
	linux-kernel, linux-perf-users, svens, jolsa, paulus,
	mark.rutland, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, josh, khilman, linux-csky, tony, linux-snps-arc,
	mgorman, jacob.jun.pan, yury.norov, ulli.kroll, vgupta, linux-clk,
	monstr, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, Peter Zijlstra, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, Arnd Bergmann, richard, x86, linux, mingo,
	aou, paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	pv-drivers, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Thu 2022-06-09 20:30:58, Sergey Senozhatsky wrote:
> My emails are getting rejected... Let me try web-interface

Bad day for mail sending. I have problems as well ;-)

> Kudos to Petr for the questions and thanks to PeterZ for the answers.
> 
> On Thu, Jun 9, 2022 at 7:02 PM Peter Zijlstra <peterz@infradead.org> wrote:
> > This is the tracepoint used to spool all of printk into ftrace, I
> > suspect there's users, but I haven't used it myself.
> 
> I'm somewhat curious whether we can actually remove that trace event.

Good question.

Well, I think that it might be useful. It allows to see trace and
printk messages together.

It was ugly when it was in the console code. The new location
in vprintk_store() allows to have it even "correctly" sorted
(timestamp) against other tracing messages.

Best Regards,
Petr
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
  2022-06-09 10:02     ` Peter Zijlstra
       [not found]       ` <CA+_sPaoJGrXhNPCs2dKf2J7u07y1xYrRFZBUtkKwzK9GqcHSuQ@mail.gmail.com>
@ 2022-06-09 13:06       ` Petr Mladek via Virtualization
  1 sibling, 0 replies; 80+ messages in thread
From: Petr Mladek via Virtualization @ 2022-06-09 13:06 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, linux-pm, jiangshanlai, Sascha Hauer,
	linux-um, acme, tglx, linux-omap, dietmar.eggemann, gregkh,
	linux-kernel, linux-perf-users, senozhatsky, svens, jolsa, paulus,
	mark.rutland, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Thu 2022-06-09 12:02:04, Peter Zijlstra wrote:
> On Thu, Jun 09, 2022 at 11:16:46AM +0200, Petr Mladek wrote:
> > On Wed 2022-06-08 16:27:47, Peter Zijlstra wrote:
> > > The problem, per commit fc98c3c8c9dc ("printk: use rcuidle console
> > > tracepoint"), was printk usage from the cpuidle path where RCU was
> > > already disabled.
> > > 
> > Does this "prevent" calling printk() a safe way in code with
> > RCU disabled?
> 
> On x86_64, yes. Other architectures, less so.
> 
> Specifically, the objtool noinstr validation pass will warn at build
> time (DEBUG_ENTRY=y) if any noinstr/cpuidle code does a call to
> non-vetted code like printk().
> 
> At the same time; there's a few hacks that allow WARN to work, but
> mostly if you hit WARN in entry/noinstr you get to keep the pieces in
> any case.
> 
> On other architecture we'll need to rely on runtime coverage with
> PROVE_RCU. That is, if a splat like in the above mentioned commit
> happens again, we'll need to fix it by adjusting the callchain, not by
> mucking about with RCU state.

Makes sense. Feel free to use for this patch:

Acked-by: Petr Mladek <pmladek@suse.com>

> > Therefore if this patch allows to remove some tricky tracing
> > code then it might be worth it. But if trace_console_rcuidle()
> > variant is still going to be available then I would keep using it.
> 
> My ultimate goal is to delete trace_.*_rcuidle() and RCU_NONIDLE()
> entirely. We're close, but not quite there yet.

I keep my fingers crossed.

Best Regards,
Petr
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 21/36] x86/tdx: Remove TDX_HCALL_ISSUE_STI
       [not found]   ` <CAJhGHyCnu_BsKf5STMMJKMWm0NVZ8qXT8Qh=BhhCjSSgwchL3Q@mail.gmail.com>
@ 2022-06-13  8:41     ` Peter Zijlstra
  0 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-13  8:41 UTC (permalink / raw)
  To: Lai Jiangshan
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, Michael Ellerman,
	Huacai Chen, linux-acpi, agross, geert, linux-imx,
	catalin.marinas, xen-devel, mattst88, mturquette, sammy, pmladek,
	linux-pm, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	linux-omap, dietmar.eggemann, Richard Henderson, gregkh,
	linux-kernel, linux-perf-users, senozhatsky, svens, jolsa, paulus,
	Mark Rutland, linux-ia64, Dave Hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, Alexander Shishkin, lpieralisi, linux, joel, Will Deacon,
	Boris Ostrovsky, khilman, linux-csky, VMware Inc, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, Borislav Petkov, bcain, tsbogend,
	linux-parisc, sudeep.holla, shawnguo, davem, kirill.shutemov,
	dalias, tony, amakhalov, bjorn.andersson, H. Peter Anvin,
	sparclinux, linux-hexagon, linux-riscv, Isaku Yamahata,
	anton.ivanov, jonas, yury.norov, Richard Weinberger, X86 ML,
	linux, Ingo Molnar, Albert Ou, paulmck, hca, stefan.kristiansson,
	openrisc, Paul Walmsley, linux-tegra, Namhyung Kim,
	Andy Shevchenko, jpoimboe, Juergen Gross, monstr, linux-mips,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Mon, Jun 13, 2022 at 04:26:01PM +0800, Lai Jiangshan wrote:
> On Wed, Jun 8, 2022 at 10:48 PM Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > Now that arch_cpu_idle() is expected to return with IRQs disabled,
> > avoid the useless STI/CLI dance.
> >
> > Per the specs this is supposed to work, but nobody has yet relied up
> > this behaviour so broken implementations are possible.
> 
> I'm totally newbie here.
> 
> The point of safe_halt() is that STI must be used and be used
> directly before HLT to enable IRQ during the halting and stop
> the halting if there is any IRQ.

Correct; on real hardware. But this is virt...

> In TDX case, STI must be used directly before the hypercall.
> Otherwise, no IRQ can come and the vcpu would be stalled forever.
> 
> Although the hypercall has an "irq_disabled" argument.
> But the hypervisor doesn't (and can't) touch the IRQ flags no matter
> what the "irq_disabled" argument is.  The IRQ is not enabled during
> the halting if the IRQ is disabled before the hypercall even if
> irq_disabled=false.

All we need the VMM to do is wake the vCPU, and it can do that,
irrespective of the guest's IF.

So the VMM can (and does) know if there's an interrupt pending, and
that's all that's needed to wake from this hypercall. Once the vCPU is
back up and running again, we'll eventually set IF again and the pending
interrupt will get delivered and all's well.

Think of this like MWAIT with ECX[0] set if you will.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
       [not found]   ` <20220609164921.5e61711d@jacob-builder>
@ 2022-06-13  8:44     ` Peter Zijlstra
  0 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-13  8:44 UTC (permalink / raw)
  To: Jacob Pan
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Thu, Jun 09, 2022 at 04:49:21PM -0700, Jacob Pan wrote:
> Hi Peter,
> 
> On Wed, 08 Jun 2022 16:27:27 +0200, Peter Zijlstra <peterz@infradead.org>
> wrote:
> 
> > Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
> > Xeons") wrecked intel_idle in two ways:
> > 
> >  - must not have tracing in idle functions
> >  - must return with IRQs disabled
> > 
> > Additionally, it added a branch for no good reason.
> > 
> > Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> > ---
> >  drivers/idle/intel_idle.c |   48
> > +++++++++++++++++++++++++++++++++++----------- 1 file changed, 37
> > insertions(+), 11 deletions(-)
> > 
> > --- a/drivers/idle/intel_idle.c
> > +++ b/drivers/idle/intel_idle.c
> > @@ -129,21 +137,37 @@ static unsigned int mwait_substates __in
> >   *
> >   * Must be called under local_irq_disable().
> >   */
> nit: this comment is no long true, right?

It still is, all the idle routines are called with interrupts disabled,
but must also exit with interrupts disabled.

If the idle method requires interrupts to be enabled, it must be sure to
disable them again before returning. Given all the RCU/tracing concerns
it must use raw_local_irq_*() for this though.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 29/36] cpuidle, xenpv: Make more PARAVIRT_XXL noinstr clean
  2022-06-08 14:27 ` [PATCH 29/36] cpuidle,xenpv: Make more PARAVIRT_XXL " Peter Zijlstra
@ 2022-06-13 18:48   ` Srivatsa S. Bhat
  2022-06-13 19:23     ` [Pv-drivers] " Nadav Amit via Virtualization
  0 siblings, 1 reply; 80+ messages in thread
From: Srivatsa S. Bhat @ 2022-06-13 18:48 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-clk, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, pv-drivers,
	linux-snps-arc, mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll,
	vgupta, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On 6/8/22 4:27 PM, Peter Zijlstra wrote:
> vmlinux.o: warning: objtool: acpi_idle_enter_s2idle+0xde: call to wbinvd() leaves .noinstr.text section
> vmlinux.o: warning: objtool: default_idle+0x4: call to arch_safe_halt() leaves .noinstr.text section
> vmlinux.o: warning: objtool: xen_safe_halt+0xa: call to HYPERVISOR_sched_op.constprop.0() leaves .noinstr.text section
> 
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Reviewed-by: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>


Regards,
Srivatsa
VMware Photon OS

> ---
>  arch/x86/include/asm/paravirt.h      |    6 ++++--
>  arch/x86/include/asm/special_insns.h |    4 ++--
>  arch/x86/include/asm/xen/hypercall.h |    2 +-
>  arch/x86/kernel/paravirt.c           |   14 ++++++++++++--
>  arch/x86/xen/enlighten_pv.c          |    2 +-
>  arch/x86/xen/irq.c                   |    2 +-
>  6 files changed, 21 insertions(+), 9 deletions(-)
> 
> --- a/arch/x86/include/asm/paravirt.h
> +++ b/arch/x86/include/asm/paravirt.h
> @@ -168,7 +168,7 @@ static inline void __write_cr4(unsigned
>  	PVOP_VCALL1(cpu.write_cr4, x);
>  }
>  
> -static inline void arch_safe_halt(void)
> +static __always_inline void arch_safe_halt(void)
>  {
>  	PVOP_VCALL0(irq.safe_halt);
>  }
> @@ -178,7 +178,9 @@ static inline void halt(void)
>  	PVOP_VCALL0(irq.halt);
>  }
>  
> -static inline void wbinvd(void)
> +extern noinstr void pv_native_wbinvd(void);
> +
> +static __always_inline void wbinvd(void)
>  {
>  	PVOP_ALT_VCALL0(cpu.wbinvd, "wbinvd", ALT_NOT(X86_FEATURE_XENPV));
>  }
> --- a/arch/x86/include/asm/special_insns.h
> +++ b/arch/x86/include/asm/special_insns.h
> @@ -115,7 +115,7 @@ static inline void wrpkru(u32 pkru)
>  }
>  #endif
>  
> -static inline void native_wbinvd(void)
> +static __always_inline void native_wbinvd(void)
>  {
>  	asm volatile("wbinvd": : :"memory");
>  }
> @@ -179,7 +179,7 @@ static inline void __write_cr4(unsigned
>  	native_write_cr4(x);
>  }
>  
> -static inline void wbinvd(void)
> +static __always_inline void wbinvd(void)
>  {
>  	native_wbinvd();
>  }
> --- a/arch/x86/include/asm/xen/hypercall.h
> +++ b/arch/x86/include/asm/xen/hypercall.h
> @@ -382,7 +382,7 @@ MULTI_stack_switch(struct multicall_entr
>  }
>  #endif
>  
> -static inline int
> +static __always_inline int
>  HYPERVISOR_sched_op(int cmd, void *arg)
>  {
>  	return _hypercall2(int, sched_op, cmd, arg);
> --- a/arch/x86/kernel/paravirt.c
> +++ b/arch/x86/kernel/paravirt.c
> @@ -233,6 +233,11 @@ static noinstr void pv_native_set_debugr
>  	native_set_debugreg(regno, val);
>  }
>  
> +noinstr void pv_native_wbinvd(void)
> +{
> +	native_wbinvd();
> +}
> +
>  static noinstr void pv_native_irq_enable(void)
>  {
>  	native_irq_enable();
> @@ -242,6 +247,11 @@ static noinstr void pv_native_irq_disabl
>  {
>  	native_irq_disable();
>  }
> +
> +static noinstr void pv_native_safe_halt(void)
> +{
> +	native_safe_halt();
> +}
>  #endif
>  
>  enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
> @@ -273,7 +283,7 @@ struct paravirt_patch_template pv_ops =
>  	.cpu.read_cr0		= native_read_cr0,
>  	.cpu.write_cr0		= native_write_cr0,
>  	.cpu.write_cr4		= native_write_cr4,
> -	.cpu.wbinvd		= native_wbinvd,
> +	.cpu.wbinvd		= pv_native_wbinvd,
>  	.cpu.read_msr		= native_read_msr,
>  	.cpu.write_msr		= native_write_msr,
>  	.cpu.read_msr_safe	= native_read_msr_safe,
> @@ -307,7 +317,7 @@ struct paravirt_patch_template pv_ops =
>  	.irq.save_fl		= __PV_IS_CALLEE_SAVE(native_save_fl),
>  	.irq.irq_disable	= __PV_IS_CALLEE_SAVE(pv_native_irq_disable),
>  	.irq.irq_enable		= __PV_IS_CALLEE_SAVE(pv_native_irq_enable),
> -	.irq.safe_halt		= native_safe_halt,
> +	.irq.safe_halt		= pv_native_safe_halt,
>  	.irq.halt		= native_halt,
>  #endif /* CONFIG_PARAVIRT_XXL */
>  
> --- a/arch/x86/xen/enlighten_pv.c
> +++ b/arch/x86/xen/enlighten_pv.c
> @@ -1019,7 +1019,7 @@ static const typeof(pv_ops) xen_cpu_ops
>  
>  		.write_cr4 = xen_write_cr4,
>  
> -		.wbinvd = native_wbinvd,
> +		.wbinvd = pv_native_wbinvd,
>  
>  		.read_msr = xen_read_msr,
>  		.write_msr = xen_write_msr,
> --- a/arch/x86/xen/irq.c
> +++ b/arch/x86/xen/irq.c
> @@ -24,7 +24,7 @@ noinstr void xen_force_evtchn_callback(v
>  	(void)HYPERVISOR_xen_version(0, NULL);
>  }
>  
> -static void xen_safe_halt(void)
> +static noinstr void xen_safe_halt(void)
>  {
>  	/* Blocking includes an implicit local_irq_enable(). */
>  	if (HYPERVISOR_sched_op(SCHEDOP_block, NULL) != 0)
> 
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [Pv-drivers] [PATCH 29/36] cpuidle, xenpv: Make more PARAVIRT_XXL noinstr clean
  2022-06-13 18:48   ` [PATCH 29/36] cpuidle, xenpv: " Srivatsa S. Bhat
@ 2022-06-13 19:23     ` Nadav Amit via Virtualization
  2022-06-14 16:44       ` Peter Zijlstra
  0 siblings, 1 reply; 80+ messages in thread
From: Nadav Amit via Virtualization @ 2022-06-13 19:23 UTC (permalink / raw)
  To: srivatsa@csail.mit.edu
  Cc: juri.lelli@redhat.com, rafael@kernel.org, Benjamin Herrenschmidt,
	linus.walleij@linaro.org, bsegall@google.com, guoren@kernel.org,
	pavel@ucw.cz, agordeev@linux.ibm.com, linux-clk@vger.kernel.org,
	linux-arch, vincent.guittot@linaro.org, mpe@ellerman.id.au,
	linux-sh@vger.kernel.org, linux-acpi@vger.kernel.org, Ingo Molnar,
	geert@linux-m68k.org, linux-imx@nxp.com, Catalin Marinas,
	xen-devel@lists.xenproject.org, mattst88@gmail.com,
	lpieralisi@kernel.org, sammy@sammy.net, pmladek@suse.com,
	linux-pm@vger.kernel.org, ink@jurassic.park.msu.ru,
	jiangshanlai@gmail.com, Sascha Hauer,
	linux-um@lists.infradead.org, acme@kernel.org, Thomas Gleixner,
	linux-omap@vger.kernel.org, dietmar.eggemann@arm.com,
	rth@twiddle.net, Greg Kroah-Hartman, LKML,
	linux-perf-users@vger.kernel.org, senozhatsky@chromium.org,
	svens@linux.ibm.com, kernel@pengutronix.de, paulus@samba.org,
	mark.rutland@arm.com, linux-ia64@vger.kernel.org, Dave Hansen,
	Linux Virtualization, James.Bottomley@hansenpartnership.com,
	jcmvbkbc@gmail.com, thierry.reding@gmail.com, kernel@xen0n.name,
	quic_neeraju@quicinc.com, linux-s390, vschneid@redhat.com,
	john.ogness@linutronix.de, ysato@users.sourceforge.jp,
	festevam@gmail.com, deller@gmx.de, daniel.lezcano@linaro.org,
	jonathanh@nvidia.com, hca@linux.ibm.com, lenb@kernel.org,
	linux-xtensa@linux-xtensa.org, jolsa@kernel.org,
	gor@linux.ibm.com, linux-arm-msm@vger.kernel.org,
	sudeep.holla@arm.com, linux-m68k@lists.linux-m68k.org,
	shorne@gmail.com, linux-arm-kernel@lists.infradead.org,
	chris@zankel.net, sboyd@kernel.org, dinguyen@kernel.org,
	bristot@redhat.com, chenhuacai@kernel.org,
	alexander.shishkin@linux.intel.com, mturquette@baylibre.com,
	linux@rasmusvillemoes.dk, joel@joelfernandes.org, Will Deacon,
	Boris Ostrovsky, khilman@kernel.org, linux-csky@vger.kernel.org,
	Pv-drivers, tony@atomide.com, linux-snps-arc@lists.infradead.org,
	Mel Gorman, jacob.jun.pan@linux.intel.com, Arnd Bergmann,
	ulli.kroll@googlemail.com, vgupta@kernel.org,
	josh@joshtriplett.org, Steven Rostedt, rcu@vger.kernel.org,
	Mathieu Desnoyers, bcain@quicinc.com, tsbogend@alpha.franken.de,
	linux-parisc@vger.kernel.org, anup@brainfault.org,
	linux-alpha@vger.kernel.org, shawnguo@kernel.org,
	davem@davemloft.net, dalias@libc.org, Peter Zijlstra,
	bjorn.andersson@linaro.org, H. Peter Anvin,
	sparclinux@vger.kernel.org, linux-riscv@lists.infradead.org,
	Anton Ivanov, jonas@southpole.se, yury.norov@gmail.com,
	richard@nod.at, X86 ML, linux@armlinux.org.uk, agross@kernel.org,
	aou@eecs.berkeley.edu, paulmck@kernel.org, frederic@kernel.org,
	stefan.kristiansson@saunalahti.fi, openrisc@lists.librecores.org,
	paul.walmsley@sifive.com, linux-tegra@vger.kernel.org,
	namhyung@kernel.org, andriy.shevchenko@linux.intel.com,
	jpoimboe@kernel.org, Juergen Gross, monstr@monstr.eu,
	linux-mips@vger.kernel.org, palmer@dabbelt.com,
	linux-hexagon@vger.kernel.org, Borislav Petkov,
	johannes@sipsolutions.net, linuxppc-dev

On Jun 13, 2022, at 11:48 AM, Srivatsa S. Bhat <srivatsa@csail.mit.edu> wrote:

> ⚠ External Email
> 
> On 6/8/22 4:27 PM, Peter Zijlstra wrote:
>> vmlinux.o: warning: objtool: acpi_idle_enter_s2idle+0xde: call to wbinvd() leaves .noinstr.text section
>> vmlinux.o: warning: objtool: default_idle+0x4: call to arch_safe_halt() leaves .noinstr.text section
>> vmlinux.o: warning: objtool: xen_safe_halt+0xa: call to HYPERVISOR_sched_op.constprop.0() leaves .noinstr.text section
>> 
>> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> 
> Reviewed-by: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
> 
>> 
>> -static inline void wbinvd(void)
>> +extern noinstr void pv_native_wbinvd(void);
>> +
>> +static __always_inline void wbinvd(void)
>> {
>>      PVOP_ALT_VCALL0(cpu.wbinvd, "wbinvd", ALT_NOT(X86_FEATURE_XENPV));
>> }

I guess it is yet another instance of wrong accounting of GCC for
the assembly blocks’ weight. I guess it is not a solution for older
GCCs, but presumably ____PVOP_ALT_CALL() and friends should have
used asm_inline or some new “asm_volatile_inline” variant.

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 00/36] cpuidle,rcu: Cleanup the mess
  2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
                   ` (35 preceding siblings ...)
  2022-06-08 14:27 ` [PATCH 36/36] cpuidle,clk: " Peter Zijlstra
@ 2022-06-14 11:19 ` Mark Rutland
  2022-06-14 16:58   ` Peter Zijlstra
  36 siblings, 1 reply; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 11:19 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed, Jun 08, 2022 at 04:27:23PM +0200, Peter Zijlstra wrote:
> Hi All! (omg so many)

Hi Peter,

Sorry for the delay; my plate has also been rather full recently. I'm beginning
to page this in now.

> These here few patches mostly clear out the utter mess that is cpuidle vs rcuidle.
> 
> At the end of the ride there's only 2 real RCU_NONIDLE() users left
> 
>   arch/arm64/kernel/suspend.c:            RCU_NONIDLE(__cpu_suspend_exit());
>   drivers/perf/arm_pmu.c:                 RCU_NONIDLE(armpmu_start(event, PERF_EF_RELOAD));

The latter of these is necessary because apparently PM notifiers are called
with RCU not watching. Is that still the case today (or at the end of this
series)? If so, that feels like fertile land for more issues (yaey...). If not,
we should be able to drop this.

I can go dig into that some more.

>   kernel/cfi.c:   RCU_NONIDLE({
> 
> (the CFI one is likely dead in the kCFI rewrite) and there's only a hand full
> of trace_.*_rcuidle() left:
> 
>   kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
>   kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
>   kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
>   kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
>   kernel/trace/trace_preemptirq.c:                trace_preempt_enable_rcuidle(a0, a1);
>   kernel/trace/trace_preemptirq.c:                trace_preempt_disable_rcuidle(a0, a1);
> 
> All of them are in 'deprecated' code that is unused for GENERIC_ENTRY.

I think those are also unused on arm64 too?

If not, I can go attack that.

> I've touched a _lot_ of code that I can't test and likely broken some of it :/
> In particular, the whole ARM cpuidle stuff was quite involved with OMAP being
> the absolute 'winner'.
> 
> I'm hoping Mark can help me sort the remaining ARM64 bits as he moves that to
> GENERIC_ENTRY.

Moving to GENERIC_ENTRY as a whole is going to take a tonne of work
(refactoring both arm64 and the generic portion to be more amenable to each
other), but we can certainly move closer to that for the bits that matter here.

Maybe we want a STRICT_ENTRY option to get rid of all the deprecated stuff that
we can select regardless of GENERIC_ENTRY to make that easier.

> I've also got a note that says ARM64 can probably do a WFE based
> idle state and employ TIF_POLLING_NRFLAG to avoid some IPIs.

Possibly; I'm not sure how much of a win that'll be given that by default we'll
have a ~10KHz WFE wakeup from the timer, but we could take a peek.

Thanks,
Mark.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage
  2022-06-08 14:27 ` [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage Peter Zijlstra
@ 2022-06-14 12:41   ` Mark Rutland
  2022-06-14 16:40     ` Peter Zijlstra
  0 siblings, 1 reply; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 12:41 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed, Jun 08, 2022 at 04:27:37PM +0200, Peter Zijlstra wrote:
> --- a/kernel/time/tick-broadcast.c
> +++ b/kernel/time/tick-broadcast.c
> @@ -622,9 +622,13 @@ struct cpumask *tick_get_broadcast_onesh
>   * to avoid a deep idle transition as we are about to get the
>   * broadcast IPI right away.
>   */
> -int tick_check_broadcast_expired(void)
> +noinstr int tick_check_broadcast_expired(void)
>  {
> +#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H
> +	return arch_test_bit(smp_processor_id(), cpumask_bits(tick_broadcast_force_mask));
> +#else
>  	return cpumask_test_cpu(smp_processor_id(), tick_broadcast_force_mask);
> +#endif
>  }

This is somewhat not-ideal. :/

Could we unconditionally do the arch_test_bit() variant, with a comment, or
does that not exist in some cases?

Thanks,
Mark.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 24/36] printk: Remove trace_.*_rcuidle() usage
  2022-06-09 13:02         ` Petr Mladek via Virtualization
@ 2022-06-14 14:37           ` Steven Rostedt
  0 siblings, 0 replies; 80+ messages in thread
From: Steven Rostedt @ 2022-06-14 14:37 UTC (permalink / raw)
  To: Petr Mladek
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, linux-pm, jiangshanlai, Sascha Hauer,
	linux-um, acme, tglx, linux-omap, dietmar.eggemann, gregkh,
	linux-kernel, linux-perf-users, Sergey Senozhatsky, svens, jolsa,
	paulus, mark.rutland, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, josh, khilman, linux-csky, tony, linux-snps-arc,
	mgorman, jacob.jun.pan, yury.norov, ulli.kroll, vgupta, linux-clk,
	monstr, rcu, bp, bcain, tsbogend, linux-parisc, sudeep.holla,
	shawnguo, davem, dalias, Peter Zijlstra, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, Arnd Bergmann, richard, x86, linux, mingo,
	aou, paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	pv-drivers, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Thu, 9 Jun 2022 15:02:20 +0200
Petr Mladek <pmladek@suse.com> wrote:

> > I'm somewhat curious whether we can actually remove that trace event.  
> 
> Good question.
> 
> Well, I think that it might be useful. It allows to see trace and
> printk messages together.

Yes people still use it. I was just asked about it at Kernel Recipes. That
is, someone wanted printk mixed in with the tracing, and I told them about
this event (which they didn't know about but was happy to hear that it
existed).

-- Steve
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 15/36] cpuidle,cpu_pm: Remove RCU fiddling from cpu_pm_{enter,exit}()
  2022-06-08 14:27 ` [PATCH 15/36] cpuidle, cpu_pm: Remove RCU fiddling from cpu_pm_{enter, exit}() Peter Zijlstra
@ 2022-06-14 16:13   ` Mark Rutland
  2022-06-14 16:42     ` Peter Zijlstra
  0 siblings, 1 reply; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:13 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed, Jun 08, 2022 at 04:27:38PM +0200, Peter Zijlstra wrote:
> All callers should still have RCU enabled.

IIUC with that true we should be able to drop the RCU_NONIDLE() from
drivers/perf/arm_pmu.c, as we only needed that for an invocation via a pm
notifier.

I should be able to give that a spin on some hardware.

> 
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
>  kernel/cpu_pm.c |    9 ---------
>  1 file changed, 9 deletions(-)
> 
> --- a/kernel/cpu_pm.c
> +++ b/kernel/cpu_pm.c
> @@ -30,16 +30,9 @@ static int cpu_pm_notify(enum cpu_pm_eve
>  {
>  	int ret;
>  
> -	/*
> -	 * This introduces a RCU read critical section, which could be
> -	 * disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know
> -	 * this.
> -	 */
> -	rcu_irq_enter_irqson();
>  	rcu_read_lock();
>  	ret = raw_notifier_call_chain(&cpu_pm_notifier.chain, event, NULL);
>  	rcu_read_unlock();
> -	rcu_irq_exit_irqson();

To make this easier to debug, is it worth adding an assertion that RCU is
watching here? e.g.

	RCU_LOCKDEP_WARN(!rcu_is_watching(),
			 "cpu_pm_notify() used illegally from EQS");

>  
>  	return notifier_to_errno(ret);
>  }
> @@ -49,11 +42,9 @@ static int cpu_pm_notify_robust(enum cpu
>  	unsigned long flags;
>  	int ret;
>  
> -	rcu_irq_enter_irqson();
>  	raw_spin_lock_irqsave(&cpu_pm_notifier.lock, flags);
>  	ret = raw_notifier_call_chain_robust(&cpu_pm_notifier.chain, event_up, event_down, NULL);
>  	raw_spin_unlock_irqrestore(&cpu_pm_notifier.lock, flags);
> -	rcu_irq_exit_irqson();


... and likewise here?

Thanks,
Mark.

>  
>  	return notifier_to_errno(ret);
>  }
> 
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 16/36] rcu: Fix rcu_idle_exit()
  2022-06-08 14:27 ` [PATCH 16/36] rcu: Fix rcu_idle_exit() Peter Zijlstra
@ 2022-06-14 16:14   ` Mark Rutland
  0 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:14 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed, Jun 08, 2022 at 04:27:39PM +0200, Peter Zijlstra wrote:
> Current rcu_idle_exit() is terminally broken because it uses
> local_irq_{save,restore}(), which are traced which uses RCU.
> 
> However, now that all the callers are sure to have IRQs disabled, we
> can remove these calls.
> 
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> Acked-by: Paul E. McKenney <paulmck@kernel.org>

Acked-by: Mark Rutland <mark.rutland@arm.com>

Mark.

> ---
>  kernel/rcu/tree.c |    9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
> 
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -659,7 +659,7 @@ static noinstr void rcu_eqs_enter(bool u
>   * If you add or remove a call to rcu_idle_enter(), be sure to test with
>   * CONFIG_RCU_EQS_DEBUG=y.
>   */
> -void rcu_idle_enter(void)
> +void noinstr rcu_idle_enter(void)
>  {
>  	lockdep_assert_irqs_disabled();
>  	rcu_eqs_enter(false);
> @@ -896,13 +896,10 @@ static void noinstr rcu_eqs_exit(bool us
>   * If you add or remove a call to rcu_idle_exit(), be sure to test with
>   * CONFIG_RCU_EQS_DEBUG=y.
>   */
> -void rcu_idle_exit(void)
> +void noinstr rcu_idle_exit(void)
>  {
> -	unsigned long flags;
> -
> -	local_irq_save(flags);
> +	lockdep_assert_irqs_disabled();
>  	rcu_eqs_exit(false);
> -	local_irq_restore(flags);
>  }
>  EXPORT_SYMBOL_GPL(rcu_idle_exit);
>  
> 
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
  2022-06-08 14:27 ` [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour Peter Zijlstra
  2022-06-08 16:22   ` Arnd Bergmann
@ 2022-06-14 16:22   ` Mark Rutland
  2022-07-06 14:02   ` Rafael J. Wysocki
  2 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:22 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, 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) <peterz@infradead.org>

Nice!

  Acked-by: Mark Rutland <mark.rutland@arm.com> [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();
>  }
>  #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	sp, %0\n"
> --- a/arch/hexagon/kernel/process.c
> +++ b/arch/hexagon/kernel/process.c
> @@ -44,7 +44,6 @@ void arch_cpu_idle(void)
>  {
>  	__vmwait();
>  	/*  interrupts wake us up, but irqs are still disabled */
> -	raw_local_irq_enable();
>  }
>  
>  /*
> --- a/arch/ia64/kernel/process.c
> +++ b/arch/ia64/kernel/process.c
> @@ -241,6 +241,7 @@ void arch_cpu_idle(void)
>  		(*mark_idle)(1);
>  
>  	raw_safe_halt();
> +	raw_local_irq_disable();
>  
>  	if (mark_idle)
>  		(*mark_idle)(0);
> --- a/arch/microblaze/kernel/process.c
> +++ b/arch/microblaze/kernel/process.c
> @@ -138,5 +138,4 @@ int dump_fpu(struct pt_regs *regs, elf_f
>  
>  void arch_cpu_idle(void)
>  {
> -       raw_local_irq_enable();
>  }
> --- a/arch/mips/kernel/idle.c
> +++ b/arch/mips/kernel/idle.c
> @@ -33,13 +33,13 @@ static void __cpuidle r3081_wait(void)
>  {
>  	unsigned long cfg = read_c0_conf();
>  	write_c0_conf(cfg | R30XX_CONF_HALT);
> -	raw_local_irq_enable();
>  }
>  
>  void __cpuidle r4k_wait(void)
>  {
>  	raw_local_irq_enable();
>  	__r4k_wait();
> +	raw_local_irq_disable();
>  }
>  
>  /*
> @@ -57,7 +57,6 @@ void __cpuidle r4k_wait_irqoff(void)
>  		"	.set	arch=r4000	\n"
>  		"	wait			\n"
>  		"	.set	pop		\n");
> -	raw_local_irq_enable();
>  }
>  
>  /*
> @@ -77,7 +76,6 @@ static void __cpuidle rm7k_wait_irqoff(v
>  		"	wait						\n"
>  		"	mtc0	$1, $12		# stalls until W stage	\n"
>  		"	.set	pop					\n");
> -	raw_local_irq_enable();
>  }
>  
>  /*
> @@ -103,6 +101,8 @@ static void __cpuidle au1k_wait(void)
>  	"	nop				\n"
>  	"	.set	pop			\n"
>  	: : "r" (au1k_wait), "r" (c0status));
> +
> +	raw_local_irq_disable();
>  }
>  
>  static int __initdata nowait;
> @@ -245,8 +245,6 @@ void arch_cpu_idle(void)
>  {
>  	if (cpu_wait)
>  		cpu_wait();
> -	else
> -		raw_local_irq_enable();
>  }
>  
>  #ifdef CONFIG_CPU_IDLE
> --- a/arch/nios2/kernel/process.c
> +++ b/arch/nios2/kernel/process.c
> @@ -33,7 +33,6 @@ EXPORT_SYMBOL(pm_power_off);
>  
>  void arch_cpu_idle(void)
>  {
> -	raw_local_irq_enable();
>  }
>  
>  /*
> --- a/arch/openrisc/kernel/process.c
> +++ b/arch/openrisc/kernel/process.c
> @@ -102,6 +102,7 @@ void arch_cpu_idle(void)
>  	raw_local_irq_enable();
>  	if (mfspr(SPR_UPR) & SPR_UPR_PMP)
>  		mtspr(SPR_PMR, mfspr(SPR_PMR) | SPR_PMR_DME);
> +	raw_local_irq_disable();
>  }
>  
>  void (*pm_power_off)(void) = NULL;
> --- a/arch/parisc/kernel/process.c
> +++ b/arch/parisc/kernel/process.c
> @@ -187,8 +187,6 @@ void arch_cpu_idle_dead(void)
>  
>  void __cpuidle arch_cpu_idle(void)
>  {
> -	raw_local_irq_enable();
> -
>  	/* nop on real hardware, qemu will idle sleep. */
>  	asm volatile("or %%r10,%%r10,%%r10\n":::);
>  }
> --- a/arch/powerpc/kernel/idle.c
> +++ b/arch/powerpc/kernel/idle.c
> @@ -51,10 +51,9 @@ void arch_cpu_idle(void)
>  		 * Some power_save functions return with
>  		 * interrupts enabled, some don't.
>  		 */
> -		if (irqs_disabled())
> -			raw_local_irq_enable();
> +		if (!irqs_disabled())
> +			raw_local_irq_disable();
>  	} else {
> -		raw_local_irq_enable();
>  		/*
>  		 * Go into low thread priority and possibly
>  		 * low power mode.
> --- a/arch/riscv/kernel/process.c
> +++ b/arch/riscv/kernel/process.c
> @@ -39,7 +39,6 @@ extern asmlinkage void ret_from_kernel_t
>  void arch_cpu_idle(void)
>  {
>  	cpu_do_idle();
> -	raw_local_irq_enable();
>  }
>  
>  void __show_regs(struct pt_regs *regs)
> --- a/arch/s390/kernel/idle.c
> +++ b/arch/s390/kernel/idle.c
> @@ -66,7 +66,6 @@ void arch_cpu_idle(void)
>  	idle->idle_count++;
>  	account_idle_time(cputime_to_nsecs(idle_time));
>  	raw_write_seqcount_end(&idle->seqcount);
> -	raw_local_irq_enable();
>  }
>  
>  static ssize_t show_idle_count(struct device *dev,
> --- a/arch/sh/kernel/idle.c
> +++ b/arch/sh/kernel/idle.c
> @@ -25,6 +25,7 @@ void default_idle(void)
>  	raw_local_irq_enable();
>  	/* Isn't this racy ? */
>  	cpu_sleep();
> +	raw_local_irq_disable();
>  	clear_bl_bit();
>  }
>  
> --- a/arch/sparc/kernel/leon_pmc.c
> +++ b/arch/sparc/kernel/leon_pmc.c
> @@ -57,6 +57,8 @@ static void pmc_leon_idle_fixup(void)
>  		"lda	[%0] %1, %%g0\n"
>  		:
>  		: "r"(address), "i"(ASI_LEON_BYPASS));
> +
> +	raw_local_irq_disable();
>  }
>  
>  /*
> @@ -70,6 +72,8 @@ static void pmc_leon_idle(void)
>  
>  	/* For systems without power-down, this will be no-op */
>  	__asm__ __volatile__ ("wr	%g0, %asr19\n\t");
> +
> +	raw_local_irq_disable();
>  }
>  
>  /* Install LEON Power Down function */
> --- a/arch/sparc/kernel/process_32.c
> +++ b/arch/sparc/kernel/process_32.c
> @@ -71,7 +71,6 @@ void arch_cpu_idle(void)
>  {
>  	if (sparc_idle)
>  		(*sparc_idle)();
> -	raw_local_irq_enable();
>  }
>  
>  /* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */
> --- a/arch/sparc/kernel/process_64.c
> +++ b/arch/sparc/kernel/process_64.c
> @@ -59,7 +59,6 @@ void arch_cpu_idle(void)
>  {
>  	if (tlb_type != hypervisor) {
>  		touch_nmi_watchdog();
> -		raw_local_irq_enable();
>  	} else {
>  		unsigned long pstate;
>  
> @@ -90,6 +89,8 @@ void arch_cpu_idle(void)
>  			"wrpr %0, %%g0, %%pstate"
>  			: "=&r" (pstate)
>  			: "i" (PSTATE_IE));
> +
> +		raw_local_irq_disable();
>  	}
>  }
>  
> --- a/arch/um/kernel/process.c
> +++ b/arch/um/kernel/process.c
> @@ -216,7 +216,6 @@ void arch_cpu_idle(void)
>  {
>  	cpu_tasks[current_thread_info()->cpu].pid = os_getpid();
>  	um_idle_sleep();
> -	raw_local_irq_enable();
>  }
>  
>  int __cant_sleep(void) {
> --- a/arch/x86/coco/tdx/tdx.c
> +++ b/arch/x86/coco/tdx/tdx.c
> @@ -178,6 +178,9 @@ void __cpuidle tdx_safe_halt(void)
>  	 */
>  	if (__halt(irq_disabled, do_sti))
>  		WARN_ONCE(1, "HLT instruction emulation failed\n");
> +
> +	/* XXX I can't make sense of what @do_sti actually does */
> +	raw_local_irq_disable();
>  }
>  
>  static bool read_msr(struct pt_regs *regs)
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -699,6 +699,7 @@ EXPORT_SYMBOL(boot_option_idle_override)
>  void __cpuidle default_idle(void)
>  {
>  	raw_safe_halt();
> +	raw_local_irq_disable();
>  }
>  #if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
>  EXPORT_SYMBOL(default_idle);
> @@ -804,13 +805,7 @@ static void amd_e400_idle(void)
>  
>  	default_idle();
>  
> -	/*
> -	 * The switch back from broadcast mode needs to be called with
> -	 * interrupts disabled.
> -	 */
> -	raw_local_irq_disable();
>  	tick_broadcast_exit();
> -	raw_local_irq_enable();
>  }
>  
>  /*
> @@ -849,12 +844,10 @@ static __cpuidle void mwait_idle(void)
>  		}
>  
>  		__monitor((void *)&current_thread_info()->flags, 0, 0);
> -		if (!need_resched())
> +		if (!need_resched()) {
>  			__sti_mwait(0, 0);
> -		else
> -			raw_local_irq_enable();
> -	} else {
> -		raw_local_irq_enable();
> +			raw_local_irq_disable();
> +		}
>  	}
>  	__current_clr_polling();
>  }
> --- a/arch/xtensa/kernel/process.c
> +++ b/arch/xtensa/kernel/process.c
> @@ -183,6 +183,7 @@ void coprocessor_flush_release_all(struc
>  void arch_cpu_idle(void)
>  {
>  	platform_idle();
> +	raw_local_irq_disable();
>  }
>  
>  /*
> --- a/kernel/sched/idle.c
> +++ b/kernel/sched/idle.c
> @@ -79,7 +79,6 @@ void __weak arch_cpu_idle_dead(void) { }
>  void __weak arch_cpu_idle(void)
>  {
>  	cpu_idle_force_poll = 1;
> -	raw_local_irq_enable();
>  }
>  
>  /**
> @@ -96,7 +95,6 @@ void __cpuidle default_idle_call(void)
>  
>  		cpuidle_rcu_enter();
>  		arch_cpu_idle();
> -		raw_local_irq_disable();
>  		cpuidle_rcu_exit();
>  
>  		start_critical_timings();
> 
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 23/36] arm64,smp: Remove trace_.*_rcuidle() usage
  2022-06-08 14:27 ` [PATCH 23/36] arm64,smp: " Peter Zijlstra
@ 2022-06-14 16:24   ` Mark Rutland
  0 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:24 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, maz, yury.norov, richard, x86, linux, mingo,
	aou, paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed, Jun 08, 2022 at 04:27:46PM +0200, Peter Zijlstra wrote:
> Ever since commit d3afc7f12987 ("arm64: Allow IPIs to be handled as
> normal interrupts") this function is called in regular IRQ context.
> 
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

[adding Marc since he authored that commit]

Makes sense to me:

  Acked-by: Mark Rutland <mark.rutland@arm.com>

Mark.

> ---
>  arch/arm64/kernel/smp.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -865,7 +865,7 @@ static void do_handle_IPI(int ipinr)
>  	unsigned int cpu = smp_processor_id();
>  
>  	if ((unsigned)ipinr < NR_IPI)
> -		trace_ipi_entry_rcuidle(ipi_types[ipinr]);
> +		trace_ipi_entry(ipi_types[ipinr]);
>  
>  	switch (ipinr) {
>  	case IPI_RESCHEDULE:
> @@ -914,7 +914,7 @@ static void do_handle_IPI(int ipinr)
>  	}
>  
>  	if ((unsigned)ipinr < NR_IPI)
> -		trace_ipi_exit_rcuidle(ipi_types[ipinr]);
> +		trace_ipi_exit(ipi_types[ipinr]);
>  }
>  
>  static irqreturn_t ipi_handler(int irq, void *data)
> 
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 25/36] time/tick-broadcast: Remove RCU_NONIDLE usage
  2022-06-08 14:27 ` [PATCH 25/36] time/tick-broadcast: Remove RCU_NONIDLE usage Peter Zijlstra
@ 2022-06-14 16:28   ` Mark Rutland
  0 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:28 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Wed, Jun 08, 2022 at 04:27:48PM +0200, Peter Zijlstra wrote:
> No callers left that have already disabled RCU.
> 
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Acked-by: Mark Rutland <mark.rutland@arm.com>

Mark.

> ---
>  kernel/time/tick-broadcast-hrtimer.c |   29 ++++++++++++-----------------
>  1 file changed, 12 insertions(+), 17 deletions(-)
> 
> --- a/kernel/time/tick-broadcast-hrtimer.c
> +++ b/kernel/time/tick-broadcast-hrtimer.c
> @@ -56,25 +56,20 @@ static int bc_set_next(ktime_t expires,
>  	 * hrtimer callback function is currently running, then
>  	 * hrtimer_start() cannot move it and the timer stays on the CPU on
>  	 * which it is assigned at the moment.
> +	 */
> +	hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED_HARD);
> +	/*
> +	 * The core tick broadcast mode expects bc->bound_on to be set
> +	 * correctly to prevent a CPU which has the broadcast hrtimer
> +	 * armed from going deep idle.
>  	 *
> -	 * As this can be called from idle code, the hrtimer_start()
> -	 * invocation has to be wrapped with RCU_NONIDLE() as
> -	 * hrtimer_start() can call into tracing.
> +	 * As tick_broadcast_lock is held, nothing can change the cpu
> +	 * base which was just established in hrtimer_start() above. So
> +	 * the below access is safe even without holding the hrtimer
> +	 * base lock.
>  	 */
> -	RCU_NONIDLE( {
> -		hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED_HARD);
> -		/*
> -		 * The core tick broadcast mode expects bc->bound_on to be set
> -		 * correctly to prevent a CPU which has the broadcast hrtimer
> -		 * armed from going deep idle.
> -		 *
> -		 * As tick_broadcast_lock is held, nothing can change the cpu
> -		 * base which was just established in hrtimer_start() above. So
> -		 * the below access is safe even without holding the hrtimer
> -		 * base lock.
> -		 */
> -		bc->bound_on = bctimer.base->cpu_base->cpu;
> -	} );
> +	bc->bound_on = bctimer.base->cpu_base->cpu;
> +
>  	return 0;
>  }
>  
> 
> 
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage
  2022-06-14 12:41   ` Mark Rutland
@ 2022-06-14 16:40     ` Peter Zijlstra
  2022-06-14 16:59       ` Mark Rutland
  0 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-14 16:40 UTC (permalink / raw)
  To: Mark Rutland
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Tue, Jun 14, 2022 at 01:41:13PM +0100, Mark Rutland wrote:
> On Wed, Jun 08, 2022 at 04:27:37PM +0200, Peter Zijlstra wrote:
> > --- a/kernel/time/tick-broadcast.c
> > +++ b/kernel/time/tick-broadcast.c
> > @@ -622,9 +622,13 @@ struct cpumask *tick_get_broadcast_onesh
> >   * to avoid a deep idle transition as we are about to get the
> >   * broadcast IPI right away.
> >   */
> > -int tick_check_broadcast_expired(void)
> > +noinstr int tick_check_broadcast_expired(void)
> >  {
> > +#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H
> > +	return arch_test_bit(smp_processor_id(), cpumask_bits(tick_broadcast_force_mask));
> > +#else
> >  	return cpumask_test_cpu(smp_processor_id(), tick_broadcast_force_mask);
> > +#endif
> >  }
> 
> This is somewhat not-ideal. :/

I'll say.

> Could we unconditionally do the arch_test_bit() variant, with a comment, or
> does that not exist in some cases?

Loads of build errors ensued, which is how I ended up with this mess ...
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 15/36] cpuidle,cpu_pm: Remove RCU fiddling from cpu_pm_{enter,exit}()
  2022-06-14 16:13   ` [PATCH 15/36] cpuidle,cpu_pm: Remove RCU fiddling from cpu_pm_{enter,exit}() Mark Rutland
@ 2022-06-14 16:42     ` Peter Zijlstra
  2022-06-14 16:53       ` Mark Rutland
  0 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-14 16:42 UTC (permalink / raw)
  To: Mark Rutland
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Tue, Jun 14, 2022 at 05:13:16PM +0100, Mark Rutland wrote:
> On Wed, Jun 08, 2022 at 04:27:38PM +0200, Peter Zijlstra wrote:
> > All callers should still have RCU enabled.
> 
> IIUC with that true we should be able to drop the RCU_NONIDLE() from
> drivers/perf/arm_pmu.c, as we only needed that for an invocation via a pm
> notifier.
> 
> I should be able to give that a spin on some hardware.
> 
> > 
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> > ---
> >  kernel/cpu_pm.c |    9 ---------
> >  1 file changed, 9 deletions(-)
> > 
> > --- a/kernel/cpu_pm.c
> > +++ b/kernel/cpu_pm.c
> > @@ -30,16 +30,9 @@ static int cpu_pm_notify(enum cpu_pm_eve
> >  {
> >  	int ret;
> >  
> > -	/*
> > -	 * This introduces a RCU read critical section, which could be
> > -	 * disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know
> > -	 * this.
> > -	 */
> > -	rcu_irq_enter_irqson();
> >  	rcu_read_lock();
> >  	ret = raw_notifier_call_chain(&cpu_pm_notifier.chain, event, NULL);
> >  	rcu_read_unlock();
> > -	rcu_irq_exit_irqson();
> 
> To make this easier to debug, is it worth adding an assertion that RCU is
> watching here? e.g.
> 
> 	RCU_LOCKDEP_WARN(!rcu_is_watching(),
> 			 "cpu_pm_notify() used illegally from EQS");
> 

My understanding is that rcu_read_lock() implies something along those
lines when PROVE_RCU.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [Pv-drivers] [PATCH 29/36] cpuidle, xenpv: Make more PARAVIRT_XXL noinstr clean
  2022-06-13 19:23     ` [Pv-drivers] " Nadav Amit via Virtualization
@ 2022-06-14 16:44       ` Peter Zijlstra
  0 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-14 16:44 UTC (permalink / raw)
  To: Nadav Amit
  Cc: juri.lelli@redhat.com, rafael@kernel.org, Benjamin Herrenschmidt,
	linus.walleij@linaro.org, bsegall@google.com, guoren@kernel.org,
	pavel@ucw.cz, agordeev@linux.ibm.com, linux-clk@vger.kernel.org,
	linux-arch, vincent.guittot@linaro.org, mpe@ellerman.id.au,
	linux-sh@vger.kernel.org, linux-acpi@vger.kernel.org, Ingo Molnar,
	geert@linux-m68k.org, linux-imx@nxp.com, Catalin Marinas,
	xen-devel@lists.xenproject.org, mattst88@gmail.com,
	lpieralisi@kernel.org, sammy@sammy.net, pmladek@suse.com,
	linux-pm@vger.kernel.org, ink@jurassic.park.msu.ru,
	jiangshanlai@gmail.com, Sascha Hauer,
	linux-um@lists.infradead.org, acme@kernel.org, Thomas Gleixner,
	linux-omap@vger.kernel.org, dietmar.eggemann@arm.com,
	rth@twiddle.net, Greg Kroah-Hartman, LKML,
	linux-perf-users@vger.kernel.org, senozhatsky@chromium.org,
	svens@linux.ibm.com, kernel@pengutronix.de, paulus@samba.org,
	mark.rutland@arm.com, linux-ia64@vger.kernel.org, Dave Hansen,
	Linux Virtualization, James.Bottomley@hansenpartnership.com,
	jcmvbkbc@gmail.com, thierry.reding@gmail.com, kernel@xen0n.name,
	quic_neeraju@quicinc.com, linux-s390, vschneid@redhat.com,
	john.ogness@linutronix.de, ysato@users.sourceforge.jp,
	festevam@gmail.com, deller@gmx.de, daniel.lezcano@linaro.org,
	jonathanh@nvidia.com, hca@linux.ibm.com, lenb@kernel.org,
	linux-xtensa@linux-xtensa.org, jolsa@kernel.org,
	gor@linux.ibm.com, linux-arm-msm@vger.kernel.org,
	sudeep.holla@arm.com, linux-m68k@lists.linux-m68k.org,
	shorne@gmail.com, linux-arm-kernel@lists.infradead.org,
	chris@zankel.net, sboyd@kernel.org, dinguyen@kernel.org,
	bristot@redhat.com, chenhuacai@kernel.org,
	alexander.shishkin@linux.intel.com, mturquette@baylibre.com,
	linux@rasmusvillemoes.dk, joel@joelfernandes.org, Will Deacon,
	Boris Ostrovsky, khilman@kernel.org, linux-csky@vger.kernel.org,
	tony@atomide.com, linux-snps-arc@lists.infradead.org, Mel Gorman,
	jacob.jun.pan@linux.intel.com, Arnd Bergmann,
	ulli.kroll@googlemail.com, vgupta@kernel.org,
	josh@joshtriplett.org, Steven Rostedt, rcu@vger.kernel.org,
	Mathieu Desnoyers, bcain@quicinc.com, tsbogend@alpha.franken.de,
	linux-parisc@vger.kernel.org, anup@brainfault.org,
	linux-alpha@vger.kernel.org, shawnguo@kernel.org,
	davem@davemloft.net, dalias@libc.org, Pv-drivers,
	bjorn.andersson@linaro.org, H. Peter Anvin,
	sparclinux@vger.kernel.org, linux-riscv@lists.infradead.org,
	Anton Ivanov, jonas@southpole.se, yury.norov@gmail.com,
	richard@nod.at, X86 ML, linux@armlinux.org.uk, agross@kernel.org,
	aou@eecs.berkeley.edu, paulmck@kernel.org, frederic@kernel.org,
	stefan.kristiansson@saunalahti.fi, openrisc@lists.librecores.org,
	paul.walmsley@sifive.com, linux-tegra@vger.kernel.org,
	namhyung@kernel.org, andriy.shevchenko@linux.intel.com,
	jpoimboe@kernel.org, Juergen Gross, monstr@monstr.eu,
	linux-mips@vger.kernel.org, palmer@dabbelt.com,
	linux-hexagon@vger.kernel.org, Borislav Petkov,
	johannes@sipsolutions.net, linuxppc-dev

On Mon, Jun 13, 2022 at 07:23:13PM +0000, Nadav Amit wrote:
> On Jun 13, 2022, at 11:48 AM, Srivatsa S. Bhat <srivatsa@csail.mit.edu> wrote:
> 
> > ⚠ External Email
> > 
> > On 6/8/22 4:27 PM, Peter Zijlstra wrote:
> >> vmlinux.o: warning: objtool: acpi_idle_enter_s2idle+0xde: call to wbinvd() leaves .noinstr.text section
> >> vmlinux.o: warning: objtool: default_idle+0x4: call to arch_safe_halt() leaves .noinstr.text section
> >> vmlinux.o: warning: objtool: xen_safe_halt+0xa: call to HYPERVISOR_sched_op.constprop.0() leaves .noinstr.text section
> >> 
> >> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> > 
> > Reviewed-by: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
> > 
> >> 
> >> -static inline void wbinvd(void)
> >> +extern noinstr void pv_native_wbinvd(void);
> >> +
> >> +static __always_inline void wbinvd(void)
> >> {
> >>      PVOP_ALT_VCALL0(cpu.wbinvd, "wbinvd", ALT_NOT(X86_FEATURE_XENPV));
> >> }
> 
> I guess it is yet another instance of wrong accounting of GCC for
> the assembly blocks’ weight. I guess it is not a solution for older
> GCCs, but presumably ____PVOP_ALT_CALL() and friends should have
> used asm_inline or some new “asm_volatile_inline” variant.

Partially, some of the *SAN options also generate a metric ton of
nonsense when enabled and skew the compilers towards not inlining
things.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 15/36] cpuidle,cpu_pm: Remove RCU fiddling from cpu_pm_{enter,exit}()
  2022-06-14 16:42     ` Peter Zijlstra
@ 2022-06-14 16:53       ` Mark Rutland
  0 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:53 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Tue, Jun 14, 2022 at 06:42:14PM +0200, Peter Zijlstra wrote:
> On Tue, Jun 14, 2022 at 05:13:16PM +0100, Mark Rutland wrote:
> > On Wed, Jun 08, 2022 at 04:27:38PM +0200, Peter Zijlstra wrote:
> > > All callers should still have RCU enabled.
> > 
> > IIUC with that true we should be able to drop the RCU_NONIDLE() from
> > drivers/perf/arm_pmu.c, as we only needed that for an invocation via a pm
> > notifier.
> > 
> > I should be able to give that a spin on some hardware.
> > 
> > > 
> > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> > > ---
> > >  kernel/cpu_pm.c |    9 ---------
> > >  1 file changed, 9 deletions(-)
> > > 
> > > --- a/kernel/cpu_pm.c
> > > +++ b/kernel/cpu_pm.c
> > > @@ -30,16 +30,9 @@ static int cpu_pm_notify(enum cpu_pm_eve
> > >  {
> > >  	int ret;
> > >  
> > > -	/*
> > > -	 * This introduces a RCU read critical section, which could be
> > > -	 * disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know
> > > -	 * this.
> > > -	 */
> > > -	rcu_irq_enter_irqson();
> > >  	rcu_read_lock();
> > >  	ret = raw_notifier_call_chain(&cpu_pm_notifier.chain, event, NULL);
> > >  	rcu_read_unlock();
> > > -	rcu_irq_exit_irqson();
> > 
> > To make this easier to debug, is it worth adding an assertion that RCU is
> > watching here? e.g.
> > 
> > 	RCU_LOCKDEP_WARN(!rcu_is_watching(),
> > 			 "cpu_pm_notify() used illegally from EQS");
> > 
> 
> My understanding is that rcu_read_lock() implies something along those
> lines when PROVE_RCU.

Ah, duh. Given that:

Acked-by: Mark Rutland <mark.rutland@arm.com>

Mark.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 00/36] cpuidle,rcu: Cleanup the mess
  2022-06-14 11:19 ` [PATCH 00/36] cpuidle,rcu: Cleanup the mess Mark Rutland
@ 2022-06-14 16:58   ` Peter Zijlstra
  2022-06-14 17:33     ` Mark Rutland
  0 siblings, 1 reply; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-14 16:58 UTC (permalink / raw)
  To: Mark Rutland
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Tue, Jun 14, 2022 at 12:19:29PM +0100, Mark Rutland wrote:
> On Wed, Jun 08, 2022 at 04:27:23PM +0200, Peter Zijlstra wrote:
> > Hi All! (omg so many)
> 
> Hi Peter,
> 
> Sorry for the delay; my plate has also been rather full recently. I'm beginning
> to page this in now.

No worries; we all have too much to do ;-)

> > These here few patches mostly clear out the utter mess that is cpuidle vs rcuidle.
> > 
> > At the end of the ride there's only 2 real RCU_NONIDLE() users left
> > 
> >   arch/arm64/kernel/suspend.c:            RCU_NONIDLE(__cpu_suspend_exit());
> >   drivers/perf/arm_pmu.c:                 RCU_NONIDLE(armpmu_start(event, PERF_EF_RELOAD));
> 
> The latter of these is necessary because apparently PM notifiers are called
> with RCU not watching. Is that still the case today (or at the end of this
> series)? If so, that feels like fertile land for more issues (yaey...). If not,
> we should be able to drop this.

That should be fixed; fingers crossed :-)

> >   kernel/cfi.c:   RCU_NONIDLE({
> > 
> > (the CFI one is likely dead in the kCFI rewrite) and there's only a hand full
> > of trace_.*_rcuidle() left:
> > 
> >   kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
> >   kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
> >   kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
> >   kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
> >   kernel/trace/trace_preemptirq.c:                trace_preempt_enable_rcuidle(a0, a1);
> >   kernel/trace/trace_preemptirq.c:                trace_preempt_disable_rcuidle(a0, a1);
> > 
> > All of them are in 'deprecated' code that is unused for GENERIC_ENTRY.
> 
> I think those are also unused on arm64 too?
> 
> If not, I can go attack that.

My grep spots:

arch/arm64/kernel/entry-common.c:               trace_hardirqs_on();
arch/arm64/include/asm/daifflags.h:     trace_hardirqs_off();
arch/arm64/include/asm/daifflags.h:             trace_hardirqs_off();

The _on thing should be replaced with something like:

	trace_hardirqs_on_prepare();
	lockdep_hardirqs_on_prepare();
	instrumentation_end();
	rcu_irq_exit();
	lockdep_hardirqs_on(CALLER_ADDR0);

(as I think you know, since you have some of that already). And
something similar for the _off thing, but with _off_finish().

> > I've touched a _lot_ of code that I can't test and likely broken some of it :/
> > In particular, the whole ARM cpuidle stuff was quite involved with OMAP being
> > the absolute 'winner'.
> > 
> > I'm hoping Mark can help me sort the remaining ARM64 bits as he moves that to
> > GENERIC_ENTRY.
> 
> Moving to GENERIC_ENTRY as a whole is going to take a tonne of work
> (refactoring both arm64 and the generic portion to be more amenable to each
> other), but we can certainly move closer to that for the bits that matter here.

I know ... been there etc.. :-)

> Maybe we want a STRICT_ENTRY option to get rid of all the deprecated stuff that
> we can select regardless of GENERIC_ENTRY to make that easier.

Possible yeah.

> > I've also got a note that says ARM64 can probably do a WFE based
> > idle state and employ TIF_POLLING_NRFLAG to avoid some IPIs.
> 
> Possibly; I'm not sure how much of a win that'll be given that by default we'll
> have a ~10KHz WFE wakeup from the timer, but we could take a peek.

Ohh.. I didn't know it woke up *that* often. I just know Will made use
of it in things like smp_cond_load_relaxed() which would be somewhat
similar to a very shallow idle state that looks at the TIF word.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage
  2022-06-14 16:40     ` Peter Zijlstra
@ 2022-06-14 16:59       ` Mark Rutland
  0 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 16:59 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Tue, Jun 14, 2022 at 06:40:53PM +0200, Peter Zijlstra wrote:
> On Tue, Jun 14, 2022 at 01:41:13PM +0100, Mark Rutland wrote:
> > On Wed, Jun 08, 2022 at 04:27:37PM +0200, Peter Zijlstra wrote:
> > > --- a/kernel/time/tick-broadcast.c
> > > +++ b/kernel/time/tick-broadcast.c
> > > @@ -622,9 +622,13 @@ struct cpumask *tick_get_broadcast_onesh
> > >   * to avoid a deep idle transition as we are about to get the
> > >   * broadcast IPI right away.
> > >   */
> > > -int tick_check_broadcast_expired(void)
> > > +noinstr int tick_check_broadcast_expired(void)
> > >  {
> > > +#ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H
> > > +	return arch_test_bit(smp_processor_id(), cpumask_bits(tick_broadcast_force_mask));
> > > +#else
> > >  	return cpumask_test_cpu(smp_processor_id(), tick_broadcast_force_mask);
> > > +#endif
> > >  }
> > 
> > This is somewhat not-ideal. :/
> 
> I'll say.
> 
> > Could we unconditionally do the arch_test_bit() variant, with a comment, or
> > does that not exist in some cases?
> 
> Loads of build errors ensued, which is how I ended up with this mess ...

Yaey :(

I see the same is true for the thread flag manipulation too.

I'll take a look and see if we can layer things so that we can use the arch_*()
helpers and wrap those consistently so that we don't have to check the CPP
guard.

Ideally we'd have a a better language that allows us to make some
context-senstive decisions, then we could hide all this gunk in the lower
levels with somethin like:

	if (!THIS_IS_A_NOINSTR_FUNCTION()) {
		explicit_instrumentation(...);
	}

... ho hum.

Mark.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 00/36] cpuidle,rcu: Cleanup the mess
  2022-06-14 16:58   ` Peter Zijlstra
@ 2022-06-14 17:33     ` Mark Rutland
  0 siblings, 0 replies; 80+ messages in thread
From: Mark Rutland @ 2022-06-14 17:33 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, linux-ia64, dave.hansen, virtualization,
	James.Bottomley, jcmvbkbc, thierry.reding, kernel, quic_neeraju,
	linux-s390, vschneid, john.ogness, ysato, linux-sh, festevam,
	deller, daniel.lezcano, jonathanh, mathieu.desnoyers, frederic,
	lenb, linux-xtensa, kernel, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, tony, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Tue, Jun 14, 2022 at 06:58:30PM +0200, Peter Zijlstra wrote:
> On Tue, Jun 14, 2022 at 12:19:29PM +0100, Mark Rutland wrote:
> > On Wed, Jun 08, 2022 at 04:27:23PM +0200, Peter Zijlstra wrote:
> > > Hi All! (omg so many)
> > 
> > Hi Peter,
> > 
> > Sorry for the delay; my plate has also been rather full recently. I'm beginning
> > to page this in now.
> 
> No worries; we all have too much to do ;-)
> 
> > > These here few patches mostly clear out the utter mess that is cpuidle vs rcuidle.
> > > 
> > > At the end of the ride there's only 2 real RCU_NONIDLE() users left
> > > 
> > >   arch/arm64/kernel/suspend.c:            RCU_NONIDLE(__cpu_suspend_exit());
> > >   drivers/perf/arm_pmu.c:                 RCU_NONIDLE(armpmu_start(event, PERF_EF_RELOAD));
> > 
> > The latter of these is necessary because apparently PM notifiers are called
> > with RCU not watching. Is that still the case today (or at the end of this
> > series)? If so, that feels like fertile land for more issues (yaey...). If not,
> > we should be able to drop this.
> 
> That should be fixed; fingers crossed :-)

Cool; I'll try to give that a spin when I'm sat next to some relevant hardware. :)

> > >   kernel/cfi.c:   RCU_NONIDLE({
> > > 
> > > (the CFI one is likely dead in the kCFI rewrite) and there's only a hand full
> > > of trace_.*_rcuidle() left:
> > > 
> > >   kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
> > >   kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
> > >   kernel/trace/trace_preemptirq.c:                        trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
> > >   kernel/trace/trace_preemptirq.c:                        trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
> > >   kernel/trace/trace_preemptirq.c:                trace_preempt_enable_rcuidle(a0, a1);
> > >   kernel/trace/trace_preemptirq.c:                trace_preempt_disable_rcuidle(a0, a1);
> > > 
> > > All of them are in 'deprecated' code that is unused for GENERIC_ENTRY.
> > I think those are also unused on arm64 too?
> > 
> > If not, I can go attack that.
> 
> My grep spots:
> 
> arch/arm64/kernel/entry-common.c:               trace_hardirqs_on();
> arch/arm64/include/asm/daifflags.h:     trace_hardirqs_off();
> arch/arm64/include/asm/daifflags.h:             trace_hardirqs_off();

Ah; I hadn't realised those used trace_.*_rcuidle() behind the scenes.

That affects local_irq_{enable,disable,restore}() too (which is what the
daifflags.h bits are emulating), and also the generic entry code's
irqentry_exit().

So it feels to me like we should be fixing those more generally? e.g. say that
with a new STRICT_ENTRY[_RCU], we can only call trace_hardirqs_{on,off}() with
RCU watching, and alter the definition of those?

> The _on thing should be replaced with something like:
> 
> 	trace_hardirqs_on_prepare();
> 	lockdep_hardirqs_on_prepare();
> 	instrumentation_end();
> 	rcu_irq_exit();
> 	lockdep_hardirqs_on(CALLER_ADDR0);
> 
> (as I think you know, since you have some of that already). And
> something similar for the _off thing, but with _off_finish().

Sure; I knew that was necessary for the outermost parts of entry (and I think
that's all handled), I just hadn't realised that trace_hardirqs_{on,off} did
the rcuidle thing in the middle.

It'd be nice to not have to open-code the whole sequence everywhere for the
portions which run after entry and are instrumentable, so (as above) I reckon
we want to make trace_hardirqs_{on,off}() not do the rcuidle part
unnecessarily (which IIUC is an end-goal anyway)?

> > > I've touched a _lot_ of code that I can't test and likely broken some of it :/
> > > In particular, the whole ARM cpuidle stuff was quite involved with OMAP being
> > > the absolute 'winner'.
> > > 
> > > I'm hoping Mark can help me sort the remaining ARM64 bits as he moves that to
> > > GENERIC_ENTRY.
> > 
> > Moving to GENERIC_ENTRY as a whole is going to take a tonne of work
> > (refactoring both arm64 and the generic portion to be more amenable to each
> > other), but we can certainly move closer to that for the bits that matter here.
> 
> I know ... been there etc.. :-)
> 
> > Maybe we want a STRICT_ENTRY option to get rid of all the deprecated stuff that
> > we can select regardless of GENERIC_ENTRY to make that easier.
> 
> Possible yeah.
> 
> > > I've also got a note that says ARM64 can probably do a WFE based
> > > idle state and employ TIF_POLLING_NRFLAG to avoid some IPIs.
> > 
> > Possibly; I'm not sure how much of a win that'll be given that by default we'll
> > have a ~10KHz WFE wakeup from the timer, but we could take a peek.
> 
> Ohh.. I didn't know it woke up *that* often. I just know Will made use
> of it in things like smp_cond_load_relaxed() which would be somewhat
> similar to a very shallow idle state that looks at the TIF word.

We'll get some saving, I'm just not sure where that falls on the curve of idle
states. FWIW the wakeup *can* be disabled (and it'd be nice to when we have
WFxT instructions which take a timeout), it jsut happens to be on by default
for reasons.

Thanks,
Mark.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 34.5/36] cpuidle,omap4: Push RCU-idle into omap4_enter_lowpower()
       [not found]   ` <Yqcv6crSNKuSWoTu@atomide.com>
@ 2022-06-14 22:12     ` Peter Zijlstra
  0 siblings, 0 replies; 80+ messages in thread
From: Peter Zijlstra @ 2022-06-14 22:12 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: juri.lelli, rafael, benh, linus.walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, geert, linux-imx, catalin.marinas, xen-devel,
	mattst88, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	rth, gregkh, linux-kernel, linux-perf-users, senozhatsky, svens,
	jolsa, paulus, mark.rutland, linux-ia64, dave.hansen,
	virtualization, James.Bottomley, jcmvbkbc, thierry.reding, kernel,
	quic_neeraju, linux-s390, vschneid, john.ogness, ysato, linux-sh,
	festevam, deller, daniel.lezcano, jonathanh, mathieu.desnoyers,
	frederic, lenb, linux-xtensa, kernel, gor, linux-arm-msm,
	linux-alpha, linux-m68k, shorne, linux-arm-kernel, chris, sboyd,
	dinguyen, bristot, alexander.shishkin, lpieralisi, linux, joel,
	will, boris.ostrovsky, khilman, linux-csky, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, ulli.kroll, vgupta,
	linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend, linux-parisc,
	sudeep.holla, shawnguo, davem, dalias, pv-drivers, amakhalov,
	bjorn.andersson, hpa, sparclinux, linux-hexagon, linux-riscv,
	anton.ivanov, jonas, yury.norov, richard, x86, linux, mingo, aou,
	paulmck, hca, stefan.kristiansson, openrisc, paul.walmsley,
	linux-tegra, namhyung, andriy.shevchenko, jpoimboe, jgross,
	monstr, linux-mips, palmer, anup, ink, johannes, linuxppc-dev

On Mon, Jun 13, 2022 at 03:39:05PM +0300, Tony Lindgren wrote:
> OMAP4 uses full SoC suspend modes as idle states, as such it needs the
> whole power-domain and clock-domain code from the idle path.
> 
> All that code is not suitable to run with RCU disabled, as such push
> RCU-idle deeper still.
> 
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
> 
> Peter here's one more for your series, looks like this is needed to avoid
> warnings similar to what you did for omap3.

Thanks Tony!

I've had a brief look at omap2_pm_idle() and do I understand it right
that something like the below patch would reduce it to a simple 'WFI'?

What do I do with the rest of that code, because I don't think this
thing has a cpuidle driver to take over, effectively turning it into
dead code.

--- a/arch/arm/mach-omap2/pm24xx.c
+++ b/arch/arm/mach-omap2/pm24xx.c
@@ -126,10 +126,20 @@ static int omap2_allow_mpu_retention(voi
 	return 1;
 }
 
-static void omap2_enter_mpu_retention(void)
+static void omap2_do_wfi(void)
 {
 	const int zero = 0;
 
+	/* WFI */
+	asm("mcr p15, 0, %0, c7, c0, 4" : : "r" (zero) : "memory", "cc");
+}
+
+#if 0
+/*
+ * possible cpuidle implementation between WFI and full_retention above
+ */
+static void omap2_enter_mpu_retention(void)
+{
 	/* The peripherals seem not to be able to wake up the MPU when
 	 * it is in retention mode. */
 	if (omap2_allow_mpu_retention()) {
@@ -146,8 +157,7 @@ static void omap2_enter_mpu_retention(vo
 		pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
 	}
 
-	/* WFI */
-	asm("mcr p15, 0, %0, c7, c0, 4" : : "r" (zero) : "memory", "cc");
+	omap2_do_wfi();
 
 	pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
 }
@@ -161,6 +171,7 @@ static int omap2_can_sleep(void)
 
 	return 1;
 }
+#endif
 
 static void omap2_pm_idle(void)
 {
@@ -169,6 +180,7 @@ static void omap2_pm_idle(void)
 	if (omap_irq_pending())
 		return;
 
+#if 0
 	error = cpu_cluster_pm_enter();
 	if (error || !omap2_can_sleep()) {
 		omap2_enter_mpu_retention();
@@ -179,6 +191,9 @@ static void omap2_pm_idle(void)
 
 out_cpu_cluster_pm:
 	cpu_cluster_pm_exit();
+#else
+	omap2_do_wfi();
+#endif
 }
 
 static void __init prcm_setup_regs(void)
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 19/36] objtool/idle: Validate __cpuidle code as noinstr
  2022-06-08 14:27 ` [PATCH 19/36] objtool/idle: Validate __cpuidle code as noinstr Peter Zijlstra
@ 2022-07-06  9:46   ` Geert Uytterhoeven
  0 siblings, 0 replies; 80+ messages in thread
From: Geert Uytterhoeven @ 2022-07-06  9:46 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: juri.lelli, rafael, benh, Linus Walleij, bsegall, guoren, pavel,
	agordeev, linux-arch, vincent.guittot, mpe, chenhuacai,
	linux-acpi, agross, NXP Linux Team, catalin.marinas, xen-devel,
	Matt Turner, mturquette, sammy, pmladek, linux-pm, jiangshanlai,
	Sascha Hauer, linux-um, acme, tglx, linux-omap, dietmar.eggemann,
	Richard Henderson, gregkh, linux-kernel, linux-perf-users,
	senozhatsky, svens, jolsa, paulus, mark.rutland, linux-ia64,
	dave.hansen, virtualization, James.Bottomley, jcmvbkbc,
	thierry.reding, kernel, quic_neeraju, linux-s390, vschneid,
	john.ogness, ysato, linux-sh, Fabio Estevam, deller,
	daniel.lezcano, jonathanh, mathieu.desnoyers, frederic, lenb,
	linux-xtensa, Sascha Hauer, gor, linux-arm-msm, linux-alpha,
	linux-m68k, shorne, linux-arm-kernel, chris, sboyd, dinguyen,
	bristot, alexander.shishkin, lpieralisi, linux, joel, will,
	boris.ostrovsky, khilman, linux-csky, pv-drivers, linux-snps-arc,
	mgorman, jacob.jun.pan, Arnd Bergmann, Hans Ulli Kroll,
	Vineet Gupta, linux-clk, josh, rostedt, rcu, bp, bcain, tsbogend,
	linux-parisc, sudeep.holla, Shawn Guo, davem, dalias, tony,
	amakhalov, bjorn.andersson, hpa, sparclinux, linux-hexagon,
	linux-riscv, anton.ivanov, jonas, yury.norov, richard, x86,
	Russell King, mingo, aou, paulmck, hca, stefan.kristiansson,
	openrisc, paul.walmsley, linux-tegra, namhyung, andriy.shevchenko,
	jpoimboe, jgross, monstr, linux-mips, palmer, anup,
	Ivan Kokshaysky, johannes, linuxppc-dev

On Wed, Jun 8, 2022 at 4:46 PM Peter Zijlstra <peterz@infradead.org> wrote:
> Idle code is very like entry code in that RCU isn't available. As
> such, add a little validation.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

>  arch/m68k/kernel/vmlinux-nommu.lds   |    1 -
>  arch/m68k/kernel/vmlinux-std.lds     |    1 -
>  arch/m68k/kernel/vmlinux-sun3.lds    |    1 -

FWIW
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 03/36] cpuidle/poll: Ensure IRQ state is invariant
  2022-06-08 14:27 ` [PATCH 03/36] cpuidle/poll: Ensure IRQ state is invariant Peter Zijlstra
@ 2022-07-06 13:51   ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-06 13:51 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> cpuidle_state::enter() methods should be IRQ invariant
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
>  drivers/cpuidle/poll_state.c |    4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> --- a/drivers/cpuidle/poll_state.c
> +++ b/drivers/cpuidle/poll_state.c
> @@ -17,7 +17,7 @@ static int __cpuidle poll_idle(struct cp
>
>         dev->poll_time_limit = false;
>
> -       local_irq_enable();
> +       raw_local_irq_enable();
>         if (!current_set_polling_and_test()) {
>                 unsigned int loop_count = 0;
>                 u64 limit;
> @@ -36,6 +36,8 @@ static int __cpuidle poll_idle(struct cp
>                         }
>                 }
>         }
> +       raw_local_irq_disable();
> +
>         current_clr_polling();
>
>         return index;
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 05/36] cpuidle: Move IRQ state validation
  2022-06-08 14:27 ` [PATCH 05/36] cpuidle: Move IRQ state validation Peter Zijlstra
@ 2022-07-06 13:54   ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-06 13:54 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> Make cpuidle_enter_state() consistent with the s2idle variant and
> verify ->enter() always returns with interrupts disabled.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
>  drivers/cpuidle/cpuidle.c |   10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
>
> --- a/drivers/cpuidle/cpuidle.c
> +++ b/drivers/cpuidle/cpuidle.c
> @@ -234,7 +234,11 @@ int cpuidle_enter_state(struct cpuidle_d
>         stop_critical_timings();
>         if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
>                 rcu_idle_enter();
> +
>         entered_state = target_state->enter(dev, drv, index);
> +       if (WARN_ONCE(!irqs_disabled(), "%ps leaked IRQ state", target_state->enter))

I'm not sure if dumping a call trace here is really useful and
WARN_ON() often gets converted to panic().

I would print an error message with pr_warn_once().

Otherwise LGTM.

> +               raw_local_irq_disable();
> +
>         if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
>                 rcu_idle_exit();
>         start_critical_timings();
> @@ -246,12 +250,8 @@ int cpuidle_enter_state(struct cpuidle_d
>         /* The cpu is no longer idle or about to enter idle. */
>         sched_idle_set_state(NULL);
>
> -       if (broadcast) {
> -               if (WARN_ON_ONCE(!irqs_disabled()))
> -                       local_irq_disable();
> -
> +       if (broadcast)
>                 tick_broadcast_exit();
> -       }
>
>         if (!cpuidle_state_is_coupled(drv, index))
>                 local_irq_enable();
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 17/36] acpi_idle: Remove tracing
  2022-06-08 14:27 ` [PATCH 17/36] acpi_idle: Remove tracing Peter Zijlstra
@ 2022-07-06 13:59   ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-06 13:59 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> All the idle routines are called with RCU disabled, as such there must
> not be any tracing inside.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

This actually does some additional code duplication cleanup which
would be good to mention in the changelog.  Or even move to a separate
patch for that matter.

Otherwise LGTM.

> ---
>  drivers/acpi/processor_idle.c |   24 +++++++++++++-----------
>  1 file changed, 13 insertions(+), 11 deletions(-)
>
> --- a/drivers/acpi/processor_idle.c
> +++ b/drivers/acpi/processor_idle.c
> @@ -108,8 +108,8 @@ static const struct dmi_system_id proces
>  static void __cpuidle acpi_safe_halt(void)
>  {
>         if (!tif_need_resched()) {
> -               safe_halt();
> -               local_irq_disable();
> +               raw_safe_halt();
> +               raw_local_irq_disable();
>         }
>  }
>
> @@ -524,16 +524,21 @@ static int acpi_idle_bm_check(void)
>         return bm_status;
>  }
>
> -static void wait_for_freeze(void)
> +static __cpuidle void io_idle(unsigned long addr)
>  {
> +       /* IO port based C-state */
> +       inb(addr);
> +
>  #ifdef CONFIG_X86
>         /* No delay is needed if we are in guest */
>         if (boot_cpu_has(X86_FEATURE_HYPERVISOR))
>                 return;
>  #endif
> -       /* Dummy wait op - must do something useless after P_LVL2 read
> -          because chipsets cannot guarantee that STPCLK# signal
> -          gets asserted in time to freeze execution properly. */
> +       /*
> +        * Dummy wait op - must do something useless after P_LVL2 read
> +        * because chipsets cannot guarantee that STPCLK# signal
> +        * gets asserted in time to freeze execution properly.
> +        */
>         inl(acpi_gbl_FADT.xpm_timer_block.address);
>  }
>
> @@ -553,9 +558,7 @@ static void __cpuidle acpi_idle_do_entry
>         } else if (cx->entry_method == ACPI_CSTATE_HALT) {
>                 acpi_safe_halt();
>         } else {
> -               /* IO port based C-state */
> -               inb(cx->address);
> -               wait_for_freeze();
> +               io_idle(cx->address);
>         }
>
>         perf_lopwr_cb(false);
> @@ -577,8 +580,7 @@ static int acpi_idle_play_dead(struct cp
>                 if (cx->entry_method == ACPI_CSTATE_HALT)
>                         safe_halt();
>                 else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) {
> -                       inb(cx->address);
> -                       wait_for_freeze();
> +                       io_idle(cx->address);
>                 } else
>                         return -ENODEV;
>
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 18/36] cpuidle: Annotate poll_idle()
  2022-06-08 14:27 ` [PATCH 18/36] cpuidle: Annotate poll_idle() Peter Zijlstra
@ 2022-07-06 14:00   ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-06 14:00 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:46 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> The __cpuidle functions will become a noinstr class, as such they need
> explicit annotations.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
>  drivers/cpuidle/poll_state.c |    6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> --- a/drivers/cpuidle/poll_state.c
> +++ b/drivers/cpuidle/poll_state.c
> @@ -13,7 +13,10 @@
>  static int __cpuidle poll_idle(struct cpuidle_device *dev,
>                                struct cpuidle_driver *drv, int index)
>  {
> -       u64 time_start = local_clock();
> +       u64 time_start;
> +
> +       instrumentation_begin();
> +       time_start = local_clock();
>
>         dev->poll_time_limit = false;
>
> @@ -39,6 +42,7 @@ static int __cpuidle poll_idle(struct cp
>         raw_local_irq_disable();
>
>         current_clr_polling();
> +       instrumentation_end();
>
>         return index;
>  }
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour
  2022-06-08 14:27 ` [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour Peter Zijlstra
  2022-06-08 16:22   ` Arnd Bergmann
  2022-06-14 16:22   ` Mark Rutland
@ 2022-07-06 14:02   ` Rafael J. Wysocki
  2 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-06 14:02 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:46 PM Peter Zijlstra <peterz@infradead.org> 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) <peterz@infradead.org>

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
>  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    sp, %0\n"
> --- a/arch/hexagon/kernel/process.c
> +++ b/arch/hexagon/kernel/process.c
> @@ -44,7 +44,6 @@ void arch_cpu_idle(void)
>  {
>         __vmwait();
>         /*  interrupts wake us up, but irqs are still disabled */
> -       raw_local_irq_enable();
>  }
>
>  /*
> --- a/arch/ia64/kernel/process.c
> +++ b/arch/ia64/kernel/process.c
> @@ -241,6 +241,7 @@ void arch_cpu_idle(void)
>                 (*mark_idle)(1);
>
>         raw_safe_halt();
> +       raw_local_irq_disable();
>
>         if (mark_idle)
>                 (*mark_idle)(0);
> --- a/arch/microblaze/kernel/process.c
> +++ b/arch/microblaze/kernel/process.c
> @@ -138,5 +138,4 @@ int dump_fpu(struct pt_regs *regs, elf_f
>
>  void arch_cpu_idle(void)
>  {
> -       raw_local_irq_enable();
>  }
> --- a/arch/mips/kernel/idle.c
> +++ b/arch/mips/kernel/idle.c
> @@ -33,13 +33,13 @@ static void __cpuidle r3081_wait(void)
>  {
>         unsigned long cfg = read_c0_conf();
>         write_c0_conf(cfg | R30XX_CONF_HALT);
> -       raw_local_irq_enable();
>  }
>
>  void __cpuidle r4k_wait(void)
>  {
>         raw_local_irq_enable();
>         __r4k_wait();
> +       raw_local_irq_disable();
>  }
>
>  /*
> @@ -57,7 +57,6 @@ void __cpuidle r4k_wait_irqoff(void)
>                 "       .set    arch=r4000      \n"
>                 "       wait                    \n"
>                 "       .set    pop             \n");
> -       raw_local_irq_enable();
>  }
>
>  /*
> @@ -77,7 +76,6 @@ static void __cpuidle rm7k_wait_irqoff(v
>                 "       wait                                            \n"
>                 "       mtc0    $1, $12         # stalls until W stage  \n"
>                 "       .set    pop                                     \n");
> -       raw_local_irq_enable();
>  }
>
>  /*
> @@ -103,6 +101,8 @@ static void __cpuidle au1k_wait(void)
>         "       nop                             \n"
>         "       .set    pop                     \n"
>         : : "r" (au1k_wait), "r" (c0status));
> +
> +       raw_local_irq_disable();
>  }
>
>  static int __initdata nowait;
> @@ -245,8 +245,6 @@ void arch_cpu_idle(void)
>  {
>         if (cpu_wait)
>                 cpu_wait();
> -       else
> -               raw_local_irq_enable();
>  }
>
>  #ifdef CONFIG_CPU_IDLE
> --- a/arch/nios2/kernel/process.c
> +++ b/arch/nios2/kernel/process.c
> @@ -33,7 +33,6 @@ EXPORT_SYMBOL(pm_power_off);
>
>  void arch_cpu_idle(void)
>  {
> -       raw_local_irq_enable();
>  }
>
>  /*
> --- a/arch/openrisc/kernel/process.c
> +++ b/arch/openrisc/kernel/process.c
> @@ -102,6 +102,7 @@ void arch_cpu_idle(void)
>         raw_local_irq_enable();
>         if (mfspr(SPR_UPR) & SPR_UPR_PMP)
>                 mtspr(SPR_PMR, mfspr(SPR_PMR) | SPR_PMR_DME);
> +       raw_local_irq_disable();
>  }
>
>  void (*pm_power_off)(void) = NULL;
> --- a/arch/parisc/kernel/process.c
> +++ b/arch/parisc/kernel/process.c
> @@ -187,8 +187,6 @@ void arch_cpu_idle_dead(void)
>
>  void __cpuidle arch_cpu_idle(void)
>  {
> -       raw_local_irq_enable();
> -
>         /* nop on real hardware, qemu will idle sleep. */
>         asm volatile("or %%r10,%%r10,%%r10\n":::);
>  }
> --- a/arch/powerpc/kernel/idle.c
> +++ b/arch/powerpc/kernel/idle.c
> @@ -51,10 +51,9 @@ void arch_cpu_idle(void)
>                  * Some power_save functions return with
>                  * interrupts enabled, some don't.
>                  */
> -               if (irqs_disabled())
> -                       raw_local_irq_enable();
> +               if (!irqs_disabled())
> +                       raw_local_irq_disable();
>         } else {
> -               raw_local_irq_enable();
>                 /*
>                  * Go into low thread priority and possibly
>                  * low power mode.
> --- a/arch/riscv/kernel/process.c
> +++ b/arch/riscv/kernel/process.c
> @@ -39,7 +39,6 @@ extern asmlinkage void ret_from_kernel_t
>  void arch_cpu_idle(void)
>  {
>         cpu_do_idle();
> -       raw_local_irq_enable();
>  }
>
>  void __show_regs(struct pt_regs *regs)
> --- a/arch/s390/kernel/idle.c
> +++ b/arch/s390/kernel/idle.c
> @@ -66,7 +66,6 @@ void arch_cpu_idle(void)
>         idle->idle_count++;
>         account_idle_time(cputime_to_nsecs(idle_time));
>         raw_write_seqcount_end(&idle->seqcount);
> -       raw_local_irq_enable();
>  }
>
>  static ssize_t show_idle_count(struct device *dev,
> --- a/arch/sh/kernel/idle.c
> +++ b/arch/sh/kernel/idle.c
> @@ -25,6 +25,7 @@ void default_idle(void)
>         raw_local_irq_enable();
>         /* Isn't this racy ? */
>         cpu_sleep();
> +       raw_local_irq_disable();
>         clear_bl_bit();
>  }
>
> --- a/arch/sparc/kernel/leon_pmc.c
> +++ b/arch/sparc/kernel/leon_pmc.c
> @@ -57,6 +57,8 @@ static void pmc_leon_idle_fixup(void)
>                 "lda    [%0] %1, %%g0\n"
>                 :
>                 : "r"(address), "i"(ASI_LEON_BYPASS));
> +
> +       raw_local_irq_disable();
>  }
>
>  /*
> @@ -70,6 +72,8 @@ static void pmc_leon_idle(void)
>
>         /* For systems without power-down, this will be no-op */
>         __asm__ __volatile__ ("wr       %g0, %asr19\n\t");
> +
> +       raw_local_irq_disable();
>  }
>
>  /* Install LEON Power Down function */
> --- a/arch/sparc/kernel/process_32.c
> +++ b/arch/sparc/kernel/process_32.c
> @@ -71,7 +71,6 @@ void arch_cpu_idle(void)
>  {
>         if (sparc_idle)
>                 (*sparc_idle)();
> -       raw_local_irq_enable();
>  }
>
>  /* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */
> --- a/arch/sparc/kernel/process_64.c
> +++ b/arch/sparc/kernel/process_64.c
> @@ -59,7 +59,6 @@ void arch_cpu_idle(void)
>  {
>         if (tlb_type != hypervisor) {
>                 touch_nmi_watchdog();
> -               raw_local_irq_enable();
>         } else {
>                 unsigned long pstate;
>
> @@ -90,6 +89,8 @@ void arch_cpu_idle(void)
>                         "wrpr %0, %%g0, %%pstate"
>                         : "=&r" (pstate)
>                         : "i" (PSTATE_IE));
> +
> +               raw_local_irq_disable();
>         }
>  }
>
> --- a/arch/um/kernel/process.c
> +++ b/arch/um/kernel/process.c
> @@ -216,7 +216,6 @@ void arch_cpu_idle(void)
>  {
>         cpu_tasks[current_thread_info()->cpu].pid = os_getpid();
>         um_idle_sleep();
> -       raw_local_irq_enable();
>  }
>
>  int __cant_sleep(void) {
> --- a/arch/x86/coco/tdx/tdx.c
> +++ b/arch/x86/coco/tdx/tdx.c
> @@ -178,6 +178,9 @@ void __cpuidle tdx_safe_halt(void)
>          */
>         if (__halt(irq_disabled, do_sti))
>                 WARN_ONCE(1, "HLT instruction emulation failed\n");
> +
> +       /* XXX I can't make sense of what @do_sti actually does */
> +       raw_local_irq_disable();
>  }
>
>  static bool read_msr(struct pt_regs *regs)
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -699,6 +699,7 @@ EXPORT_SYMBOL(boot_option_idle_override)
>  void __cpuidle default_idle(void)
>  {
>         raw_safe_halt();
> +       raw_local_irq_disable();
>  }
>  #if defined(CONFIG_APM_MODULE) || defined(CONFIG_HALTPOLL_CPUIDLE_MODULE)
>  EXPORT_SYMBOL(default_idle);
> @@ -804,13 +805,7 @@ static void amd_e400_idle(void)
>
>         default_idle();
>
> -       /*
> -        * The switch back from broadcast mode needs to be called with
> -        * interrupts disabled.
> -        */
> -       raw_local_irq_disable();
>         tick_broadcast_exit();
> -       raw_local_irq_enable();
>  }
>
>  /*
> @@ -849,12 +844,10 @@ static __cpuidle void mwait_idle(void)
>                 }
>
>                 __monitor((void *)&current_thread_info()->flags, 0, 0);
> -               if (!need_resched())
> +               if (!need_resched()) {
>                         __sti_mwait(0, 0);
> -               else
> -                       raw_local_irq_enable();
> -       } else {
> -               raw_local_irq_enable();
> +                       raw_local_irq_disable();
> +               }
>         }
>         __current_clr_polling();
>  }
> --- a/arch/xtensa/kernel/process.c
> +++ b/arch/xtensa/kernel/process.c
> @@ -183,6 +183,7 @@ void coprocessor_flush_release_all(struc
>  void arch_cpu_idle(void)
>  {
>         platform_idle();
> +       raw_local_irq_disable();
>  }
>
>  /*
> --- a/kernel/sched/idle.c
> +++ b/kernel/sched/idle.c
> @@ -79,7 +79,6 @@ void __weak arch_cpu_idle_dead(void) { }
>  void __weak arch_cpu_idle(void)
>  {
>         cpu_idle_force_poll = 1;
> -       raw_local_irq_enable();
>  }
>
>  /**
> @@ -96,7 +95,6 @@ void __cpuidle default_idle_call(void)
>
>                 cpuidle_rcu_enter();
>                 arch_cpu_idle();
> -               raw_local_irq_disable();
>                 cpuidle_rcu_exit();
>
>                 start_critical_timings();
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 31/36] cpuidle,acpi: Make noinstr clean
  2022-06-08 14:27 ` [PATCH 31/36] cpuidle,acpi: " Peter Zijlstra
@ 2022-07-06 14:04   ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-06 14:04 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	mattst88, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, rth,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	jcmvbkbc, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list,
	Fabio Estevam, Helge Deller, Daniel Lezcano, Jon Hunter,
	Mathieu Desnoyers, Frederic Weisbecker, Len Brown, linux-xtensa,
	Sascha Hauer, Vasily Gorbik, linux-arm-msm, linux-alpha,
	linux-m68k, Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes, Will Deacon,
	Boris Ostrovsky, Kevin Hilman, linux-csky, pv-drivers,
	linux-snps-arc, Mel Gorman, Jacob Pan, Arnd Bergmann, ulli.kroll,
	vgupta, linux-clk, Josh Triplett, Steven Rostedt, rcu,
	Borislav Petkov, bcain, Thomas Bogendoerfer, Parisc List,
	Sudeep Holla, Shawn Guo, David Miller, Rich Felker, Tony Lindgren,
	amakhalov, Bjorn Andersson, H. Peter Anvin, sparclinux,
	linux-hexagon, linux-riscv, anton.ivanov, jonas, 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, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, Michal Simek, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, ink, Johannes Berg, linuxppc-dev

On Wed, Jun 8, 2022 at 4:47 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> vmlinux.o: warning: objtool: io_idle+0xc: call to __inb.isra.0() leaves .noinstr.text section
> vmlinux.o: warning: objtool: acpi_idle_enter+0xfe: call to num_online_cpus() leaves .noinstr.text section
> vmlinux.o: warning: objtool: acpi_idle_enter+0x115: call to acpi_idle_fallback_to_c1.isra.0() leaves .noinstr.text section
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
>  arch/x86/include/asm/shared/io.h |    4 ++--
>  drivers/acpi/processor_idle.c    |    2 +-
>  include/linux/cpumask.h          |    4 ++--
>  3 files changed, 5 insertions(+), 5 deletions(-)
>
> --- a/arch/x86/include/asm/shared/io.h
> +++ b/arch/x86/include/asm/shared/io.h
> @@ -5,13 +5,13 @@
>  #include <linux/types.h>
>
>  #define BUILDIO(bwl, bw, type)                                         \
> -static inline void __out##bwl(type value, u16 port)                    \
> +static __always_inline void __out##bwl(type value, u16 port)           \
>  {                                                                      \
>         asm volatile("out" #bwl " %" #bw "0, %w1"                       \
>                      : : "a"(value), "Nd"(port));                       \
>  }                                                                      \
>                                                                         \
> -static inline type __in##bwl(u16 port)                                 \
> +static __always_inline type __in##bwl(u16 port)                                \
>  {                                                                      \
>         type value;                                                     \
>         asm volatile("in" #bwl " %w1, %" #bw "0"                        \
> --- a/drivers/acpi/processor_idle.c
> +++ b/drivers/acpi/processor_idle.c
> @@ -593,7 +593,7 @@ static int acpi_idle_play_dead(struct cp
>         return 0;
>  }
>
> -static bool acpi_idle_fallback_to_c1(struct acpi_processor *pr)
> +static __always_inline bool acpi_idle_fallback_to_c1(struct acpi_processor *pr)
>  {
>         return IS_ENABLED(CONFIG_HOTPLUG_CPU) && !pr->flags.has_cst &&
>                 !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED);
> --- a/include/linux/cpumask.h
> +++ b/include/linux/cpumask.h
> @@ -908,9 +908,9 @@ static inline const struct cpumask *get_
>   * concurrent CPU hotplug operations unless invoked from a cpuhp_lock held
>   * region.
>   */
> -static inline unsigned int num_online_cpus(void)
> +static __always_inline unsigned int num_online_cpus(void)
>  {
> -       return atomic_read(&__num_online_cpus);
> +       return arch_atomic_read(&__num_online_cpus);
>  }
>  #define num_possible_cpus()    cpumask_weight(cpu_possible_mask)
>  #define num_present_cpus()     cpumask_weight(cpu_present_mask)
>
>
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
       [not found]       ` <20220729102458.GA1695@lespinasse.org>
@ 2022-07-29 14:59         ` Rafael J. Wysocki
       [not found]           ` <20220730094800.GB1587@lespinasse.org>
  0 siblings, 1 reply; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-29 14:59 UTC (permalink / raw)
  To: Michel Lespinasse
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	Matt Turner, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, Richard Henderson,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	Max Filippov, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list, Will Deacon,
	Helge Deller, Daniel Lezcano, Jon Hunter, Mathieu Desnoyers,
	Frederic Weisbecker, Len Brown, linux-xtensa, Sascha Hauer,
	Vasily Gorbik, linux-arm-msm, linux-alpha, linux-m68k,
	Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd, rh0,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes,
	Fabio Estevam, Boris Ostrovsky, Josh Triplett, Kevin Hilman,
	linux-csky, Tony Lindgren, linux-snps-arc, Mel Gorman, Jacob Pan,
	Yury Norov, ulli.kroll, vgupta, linux-clk, Michal Simek,
	Steven Rostedt, rcu, Borislav Petkov, bcain, Thomas Bogendoerfer,
	Parisc List, Sudeep Holla, Shawn Guo, David Miller, Rich Felker,
	Peter Zijlstra, amakhalov, Bjorn Andersson, H. Peter Anvin,
	sparclinux, linux-hexagon, linux-riscv, anton.ivanov, jonas,
	Arnd Bergmann, Richard Weinberger, the arch/x86 maintainers,
	Russell King - ARM Linux, Ingo Molnar, Albert Ou,
	Paul E. McKenney, Heiko Carstens, stefan.kristiansson, openrisc,
	Paul Walmsley, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, pv-drivers, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, Ivan Kokshaysky, Johannes Berg,
	linuxppc-dev

On Fri, Jul 29, 2022 at 12:25 PM Michel Lespinasse
<michel@lespinasse.org> wrote:
>
> On Thu, Jul 28, 2022 at 10:20:53AM -0700, Paul E. McKenney wrote:
> > On Mon, Jul 25, 2022 at 12:43:06PM -0700, Michel Lespinasse wrote:
> > > On Wed, Jun 08, 2022 at 04:27:27PM +0200, Peter Zijlstra wrote:
> > > > Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
> > > > Xeons") wrecked intel_idle in two ways:
> > > >
> > > >  - must not have tracing in idle functions
> > > >  - must return with IRQs disabled
> > > >
> > > > Additionally, it added a branch for no good reason.
> > > >
> > > > Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
> > > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> > >
> > > After this change was introduced, I am seeing "WARNING: suspicious RCU
> > > usage" when booting a kernel with debug options compiled in. Please
> > > see the attached dmesg output. The issue starts with commit 32d4fd5751ea
> > > and is still present in v5.19-rc8.
> > >
> > > I'm not sure, is this too late to fix or revert in v5.19 final ?
> >
> > I finally got a chance to take a quick look at this.
> >
> > The rcu_eqs_exit() function is making a lockdep complaint about
> > being invoked with interrupts enabled.  This function is called from
> > rcu_idle_exit(), which is an expected code path from cpuidle_enter_state()
> > via its call to rcu_idle_exit().  Except that rcu_idle_exit() disables
> > interrupts before invoking rcu_eqs_exit().
> >
> > The only other call to rcu_idle_exit() does not disable interrupts,
> > but it is via rcu_user_exit(), which would be a very odd choice for
> > cpuidle_enter_state().
> >
> > It seems unlikely, but it might be that it is the use of local_irq_save()
> > instead of raw_local_irq_save() within rcu_idle_exit() that is causing
> > the trouble.  If this is the case, then the commit shown below would
> > help.  Note that this commit removes the warning from lockdep, so it
> > is necessary to build the kernel with CONFIG_RCU_EQS_DEBUG=y to enable
> > equivalent debugging.
> >
> > Could you please try your test with the -rce commit shown below applied?
>
> Thanks for looking into it.
>
> After checking out Peter's commit 32d4fd5751ea,
> cherry picking your commit ed4ae5eff4b3,
> and setting CONFIG_RCU_EQS_DEBUG=y in addition of my usual debug config,
> I am now seeing this a few seconds into the boot:
>
> [    3.010650] ------------[ cut here ]------------
> [    3.010651] WARNING: CPU: 0 PID: 0 at kernel/sched/clock.c:397 sched_clock_tick+0x27/0x60
> [    3.010657] Modules linked in:
> [    3.010660] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.19.0-rc1-test-00005-g1be22fea0611 #1
> [    3.010662] Hardware name: LENOVO 30BFS44D00/1036, BIOS S03KT51A 01/17/2022
> [    3.010663] RIP: 0010:sched_clock_tick+0x27/0x60
> [    3.010665] Code: 1f 40 00 53 eb 02 5b c3 66 90 8b 05 2f c3 40 01 85 c0 74 18 65 8b 05 60 88 8f 4e 85 c0 75 0d 65 8b 05 a9 85 8f 4e 85 c0 74 02 <0f> 0b e8 e2 6c 89 00 48 c7 c3 40 d5 02 00
>  89 c0 48 03 1c c5 c0 98
> [    3.010667] RSP: 0000:ffffffffb2803e28 EFLAGS: 00010002
> [    3.010670] RAX: 0000000000000001 RBX: ffffc8ce7fa07060 RCX: 0000000000000001
> [    3.010671] RDX: 0000000000000000 RSI: ffffffffb268dd21 RDI: ffffffffb269ab13
> [    3.010673] RBP: 0000000000000001 R08: ffffffffffc300d5 R09: 000000000002be80
> [    3.010674] R10: 000003625b53183a R11: ffffa012b802b7a4 R12: ffffffffb2aa9e80
> [    3.010675] R13: ffffffffb2aa9e00 R14: 0000000000000001 R15: 0000000000000000
> [    3.010677] FS:  0000000000000000(0000) GS:ffffa012b8000000(0000) knlGS:0000000000000000
> [    3.010678] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [    3.010680] CR2: ffffa012f81ff000 CR3: 0000000c99612001 CR4: 00000000003706f0
> [    3.010681] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [    3.010682] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> [    3.010683] Call Trace:
> [    3.010685]  <TASK>
> [    3.010688]  cpuidle_enter_state+0xb7/0x4b0
> [    3.010694]  cpuidle_enter+0x29/0x40
> [    3.010697]  do_idle+0x1d4/0x210
> [    3.010702]  cpu_startup_entry+0x19/0x20
> [    3.010704]  rest_init+0x117/0x1a0
> [    3.010708]  arch_call_rest_init+0xa/0x10
> [    3.010711]  start_kernel+0x6d8/0x6ff
> [    3.010716]  secondary_startup_64_no_verify+0xce/0xdb
> [    3.010728]  </TASK>
> [    3.010729] irq event stamp: 44179
> [    3.010730] hardirqs last  enabled at (44179): [<ffffffffb2000ccb>] asm_sysvec_apic_timer_interrupt+0x1b/0x20
> [    3.010734] hardirqs last disabled at (44177): [<ffffffffb22003f0>] __do_softirq+0x3f0/0x498
> [    3.010736] softirqs last  enabled at (44178): [<ffffffffb2200332>] __do_softirq+0x332/0x498
> [    3.010738] softirqs last disabled at (44171): [<ffffffffb16c760b>] irq_exit_rcu+0xab/0xf0
> [    3.010741] ---[ end trace 0000000000000000 ]---

Can you please give this patch a go:
https://patchwork.kernel.org/project/linux-pm/patch/Yt/AxPFi88neW7W5@e126311.manchester.arm.com/
?
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

* Re: [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE
       [not found]           ` <20220730094800.GB1587@lespinasse.org>
@ 2022-07-30 19:52             ` Rafael J. Wysocki
  0 siblings, 0 replies; 80+ messages in thread
From: Rafael J. Wysocki @ 2022-07-30 19:52 UTC (permalink / raw)
  To: Michel Lespinasse
  Cc: Juri Lelli, Rafael J. Wysocki, Benjamin Herrenschmidt,
	Linus Walleij, Benjamin Segall, Guo Ren, Pavel Machek,
	Alexander Gordeev, linux-arch, Vincent Guittot, Michael Ellerman,
	Huacai Chen, ACPI Devel Maling List, Andy Gross,
	Geert Uytterhoeven, dl-linux-imx, Catalin Marinas, xen-devel,
	Matt Turner, Michael Turquette, sammy, Petr Mladek, Linux PM,
	Lai Jiangshan, Sascha Hauer, linux-um, acme, Thomas Gleixner,
	Linux OMAP Mailing List, Dietmar Eggemann, Richard Henderson,
	Greg Kroah-Hartman, Linux Kernel Mailing List, linux-perf-users,
	senozhatsky, Sven Schnelle, jolsa, Paul Mackerras, Mark Rutland,
	linux-ia64, Dave Hansen, virtualization, James Bottomley,
	Max Filippov, Thierry Reding, kernel, quic_neeraju, linux-s390,
	vschneid, John Ogness, Yoshinori Sato, Linux-sh list, Will Deacon,
	Helge Deller, Daniel Lezcano, Jon Hunter, Mathieu Desnoyers,
	Frederic Weisbecker, Len Brown, linux-xtensa, Sascha Hauer,
	Vasily Gorbik, linux-arm-msm, linux-alpha, linux-m68k,
	Stafford Horne, Linux ARM, Chris Zankel, Stephen Boyd, rh0,
	dinguyen, Daniel Bristot de Oliveira, Alexander Shishkin,
	Lorenzo Pieralisi, Rasmus Villemoes, Joel Fernandes,
	Fabio Estevam, Boris Ostrovsky, Josh Triplett, Kevin Hilman,
	linux-csky, Tony Lindgren, linux-snps-arc, Mel Gorman, Jacob Pan,
	Yury Norov, ulli.kroll, vgupta, linux-clk, Michal Simek,
	Steven Rostedt, rcu, Borislav Petkov, bcain, Thomas Bogendoerfer,
	Parisc List, Sudeep Holla, Shawn Guo, David Miller, Rich Felker,
	Peter Zijlstra, amakhalov, Bjorn Andersson, H. Peter Anvin,
	sparclinux, linux-hexagon, linux-riscv, anton.ivanov, jonas,
	Arnd Bergmann, Richard Weinberger, the arch/x86 maintainers,
	Russell King - ARM Linux, Ingo Molnar, Albert Ou,
	Paul E. McKenney, Heiko Carstens, stefan.kristiansson, openrisc,
	Paul Walmsley, linux-tegra, namhyung, Andy Shevchenko, jpoimboe,
	Juergen Gross, pv-drivers, open list:BROADCOM NVRAM DRIVER,
	Palmer Dabbelt, Anup Patel, Ivan Kokshaysky, Johannes Berg,
	linuxppc-dev

On Sat, Jul 30, 2022 at 11:48 AM Michel Lespinasse
<michel@lespinasse.org> wrote:
>
> On Fri, Jul 29, 2022 at 04:59:50PM +0200, Rafael J. Wysocki wrote:
> > On Fri, Jul 29, 2022 at 12:25 PM Michel Lespinasse
> > <michel@lespinasse.org> wrote:
> > >
> > > On Thu, Jul 28, 2022 at 10:20:53AM -0700, Paul E. McKenney wrote:
> > > > On Mon, Jul 25, 2022 at 12:43:06PM -0700, Michel Lespinasse wrote:
> > > > > On Wed, Jun 08, 2022 at 04:27:27PM +0200, Peter Zijlstra wrote:
> > > > > > Commit c227233ad64c ("intel_idle: enable interrupts before C1 on
> > > > > > Xeons") wrecked intel_idle in two ways:
> > > > > >
> > > > > >  - must not have tracing in idle functions
> > > > > >  - must return with IRQs disabled
> > > > > >
> > > > > > Additionally, it added a branch for no good reason.
> > > > > >
> > > > > > Fixes: c227233ad64c ("intel_idle: enable interrupts before C1 on Xeons")
> > > > > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> > > > >
> > > > > After this change was introduced, I am seeing "WARNING: suspicious RCU
> > > > > usage" when booting a kernel with debug options compiled in. Please
> > > > > see the attached dmesg output. The issue starts with commit 32d4fd5751ea
> > > > > and is still present in v5.19-rc8.
> > > > >
> > > > > I'm not sure, is this too late to fix or revert in v5.19 final ?
> > > >
> > > > I finally got a chance to take a quick look at this.
> > > >
> > > > The rcu_eqs_exit() function is making a lockdep complaint about
> > > > being invoked with interrupts enabled.  This function is called from
> > > > rcu_idle_exit(), which is an expected code path from cpuidle_enter_state()
> > > > via its call to rcu_idle_exit().  Except that rcu_idle_exit() disables
> > > > interrupts before invoking rcu_eqs_exit().
> > > >
> > > > The only other call to rcu_idle_exit() does not disable interrupts,
> > > > but it is via rcu_user_exit(), which would be a very odd choice for
> > > > cpuidle_enter_state().
> > > >
> > > > It seems unlikely, but it might be that it is the use of local_irq_save()
> > > > instead of raw_local_irq_save() within rcu_idle_exit() that is causing
> > > > the trouble.  If this is the case, then the commit shown below would
> > > > help.  Note that this commit removes the warning from lockdep, so it
> > > > is necessary to build the kernel with CONFIG_RCU_EQS_DEBUG=y to enable
> > > > equivalent debugging.
> > > >
> > > > Could you please try your test with the -rce commit shown below applied?
> > >
> > > Thanks for looking into it.
> > >
> > > After checking out Peter's commit 32d4fd5751ea,
> > > cherry picking your commit ed4ae5eff4b3,
> > > and setting CONFIG_RCU_EQS_DEBUG=y in addition of my usual debug config,
> > > I am now seeing this a few seconds into the boot:
> > >
> > > [    3.010650] ------------[ cut here ]------------
> > > [    3.010651] WARNING: CPU: 0 PID: 0 at kernel/sched/clock.c:397 sched_clock_tick+0x27/0x60
> > > [    3.010657] Modules linked in:
> > > [    3.010660] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.19.0-rc1-test-00005-g1be22fea0611 #1
> > > [    3.010662] Hardware name: LENOVO 30BFS44D00/1036, BIOS S03KT51A 01/17/2022
> > > [    3.010663] RIP: 0010:sched_clock_tick+0x27/0x60
> > > [    3.010665] Code: 1f 40 00 53 eb 02 5b c3 66 90 8b 05 2f c3 40 01 85 c0 74 18 65 8b 05 60 88 8f 4e 85 c0 75 0d 65 8b 05 a9 85 8f 4e 85 c0 74 02 <0f> 0b e8 e2 6c 89 00 48 c7 c3 40 d5 02 00
> > >  89 c0 48 03 1c c5 c0 98
> > > [    3.010667] RSP: 0000:ffffffffb2803e28 EFLAGS: 00010002
> > > [    3.010670] RAX: 0000000000000001 RBX: ffffc8ce7fa07060 RCX: 0000000000000001
> > > [    3.010671] RDX: 0000000000000000 RSI: ffffffffb268dd21 RDI: ffffffffb269ab13
> > > [    3.010673] RBP: 0000000000000001 R08: ffffffffffc300d5 R09: 000000000002be80
> > > [    3.010674] R10: 000003625b53183a R11: ffffa012b802b7a4 R12: ffffffffb2aa9e80
> > > [    3.010675] R13: ffffffffb2aa9e00 R14: 0000000000000001 R15: 0000000000000000
> > > [    3.010677] FS:  0000000000000000(0000) GS:ffffa012b8000000(0000) knlGS:0000000000000000
> > > [    3.010678] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > > [    3.010680] CR2: ffffa012f81ff000 CR3: 0000000c99612001 CR4: 00000000003706f0
> > > [    3.010681] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> > > [    3.010682] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> > > [    3.010683] Call Trace:
> > > [    3.010685]  <TASK>
> > > [    3.010688]  cpuidle_enter_state+0xb7/0x4b0
> > > [    3.010694]  cpuidle_enter+0x29/0x40
> > > [    3.010697]  do_idle+0x1d4/0x210
> > > [    3.010702]  cpu_startup_entry+0x19/0x20
> > > [    3.010704]  rest_init+0x117/0x1a0
> > > [    3.010708]  arch_call_rest_init+0xa/0x10
> > > [    3.010711]  start_kernel+0x6d8/0x6ff
> > > [    3.010716]  secondary_startup_64_no_verify+0xce/0xdb
> > > [    3.010728]  </TASK>
> > > [    3.010729] irq event stamp: 44179
> > > [    3.010730] hardirqs last  enabled at (44179): [<ffffffffb2000ccb>] asm_sysvec_apic_timer_interrupt+0x1b/0x20
> > > [    3.010734] hardirqs last disabled at (44177): [<ffffffffb22003f0>] __do_softirq+0x3f0/0x498
> > > [    3.010736] softirqs last  enabled at (44178): [<ffffffffb2200332>] __do_softirq+0x332/0x498
> > > [    3.010738] softirqs last disabled at (44171): [<ffffffffb16c760b>] irq_exit_rcu+0xab/0xf0
> > > [    3.010741] ---[ end trace 0000000000000000 ]---
> >
> > Can you please give this patch a go:
> > https://patchwork.kernel.org/project/linux-pm/patch/Yt/AxPFi88neW7W5@e126311.manchester.arm.com/
> > ?
>
> I tried, but it didn't change the picture for me.
>
> I'm not sure if that was the patch you meant to send though, as it
> seems it's only adding a tracepoint so shouldn't make any difference
> if I'm not actually using the tracepoint ?

You are right, it looks like I pasted a link to a different patch by
mistake.  Sorry about that.

I meant this one:

https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/commit/?h=pm&id=d295ad34f236c3518634fb6403d4c0160456e470

which will appear in the final 5.19.
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

^ permalink raw reply	[flat|nested] 80+ messages in thread

end of thread, other threads:[~2022-07-30 19:52 UTC | newest]

Thread overview: 80+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-08 14:27 [PATCH 00/36] cpuidle,rcu: Cleanup the mess Peter Zijlstra
2022-06-08 14:27 ` [PATCH 01/36] x86/perf/amd: Remove tracing from perf_lopwr_cb() Peter Zijlstra
2022-06-08 14:27 ` [PATCH 02/36] x86/idle: Replace x86_idle with a static_call Peter Zijlstra
2022-06-08 18:13   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 03/36] cpuidle/poll: Ensure IRQ state is invariant Peter Zijlstra
2022-07-06 13:51   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 04/36] cpuidle,intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE Peter Zijlstra
2022-06-08 15:01   ` Rafael J. Wysocki
2022-06-08 15:48     ` Peter Zijlstra
2022-06-08 16:08       ` Rafael J. Wysocki
     [not found]   ` <20220609164921.5e61711d@jacob-builder>
2022-06-13  8:44     ` Peter Zijlstra
     [not found]   ` <20220725194306.GA14746@lespinasse.org>
     [not found]     ` <20220728172053.GA3607379@paulmck-ThinkPad-P17-Gen-1>
     [not found]       ` <20220729102458.GA1695@lespinasse.org>
2022-07-29 14:59         ` Rafael J. Wysocki
     [not found]           ` <20220730094800.GB1587@lespinasse.org>
2022-07-30 19:52             ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 05/36] cpuidle: Move IRQ state validation Peter Zijlstra
2022-07-06 13:54   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 06/36] cpuidle,riscv: Push RCU-idle into driver Peter Zijlstra
2022-06-08 14:27 ` [PATCH 07/36] cpuidle,tegra: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 08/36] cpuidle,psci: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 09/36] cpuidle,imx6: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 10/36] cpuidle,omap3: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 11/36] cpuidle,armada: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 12/36] cpuidle,omap2: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 13/36] cpuidle,dt: " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 14/36] cpuidle: Fix rcu_idle_*() usage Peter Zijlstra
2022-06-14 12:41   ` Mark Rutland
2022-06-14 16:40     ` Peter Zijlstra
2022-06-14 16:59       ` Mark Rutland
2022-06-08 14:27 ` [PATCH 15/36] cpuidle, cpu_pm: Remove RCU fiddling from cpu_pm_{enter, exit}() Peter Zijlstra
2022-06-14 16:13   ` [PATCH 15/36] cpuidle,cpu_pm: Remove RCU fiddling from cpu_pm_{enter,exit}() Mark Rutland
2022-06-14 16:42     ` Peter Zijlstra
2022-06-14 16:53       ` Mark Rutland
2022-06-08 14:27 ` [PATCH 16/36] rcu: Fix rcu_idle_exit() Peter Zijlstra
2022-06-14 16:14   ` Mark Rutland
2022-06-08 14:27 ` [PATCH 17/36] acpi_idle: Remove tracing Peter Zijlstra
2022-07-06 13:59   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 18/36] cpuidle: Annotate poll_idle() Peter Zijlstra
2022-07-06 14:00   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 19/36] objtool/idle: Validate __cpuidle code as noinstr Peter Zijlstra
2022-07-06  9:46   ` Geert Uytterhoeven
2022-06-08 14:27 ` [PATCH 20/36] arch/idle: Change arch_cpu_idle() IRQ behaviour Peter Zijlstra
2022-06-08 16:22   ` Arnd Bergmann
2022-06-14 16:22   ` Mark Rutland
2022-07-06 14:02   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 21/36] x86/tdx: Remove TDX_HCALL_ISSUE_STI Peter Zijlstra
     [not found]   ` <CAJhGHyCnu_BsKf5STMMJKMWm0NVZ8qXT8Qh=BhhCjSSgwchL3Q@mail.gmail.com>
2022-06-13  8:41     ` Peter Zijlstra
2022-06-08 14:27 ` [PATCH 22/36] arm,smp: Remove trace_.*_rcuidle() usage Peter Zijlstra
2022-06-08 14:27 ` [PATCH 23/36] arm64,smp: " Peter Zijlstra
2022-06-14 16:24   ` Mark Rutland
2022-06-08 14:27 ` [PATCH 24/36] printk: " Peter Zijlstra
2022-06-09  9:16   ` Petr Mladek via Virtualization
2022-06-09 10:02     ` Peter Zijlstra
     [not found]       ` <CA+_sPaoJGrXhNPCs2dKf2J7u07y1xYrRFZBUtkKwzK9GqcHSuQ@mail.gmail.com>
2022-06-09 13:02         ` Petr Mladek via Virtualization
2022-06-14 14:37           ` Steven Rostedt
2022-06-09 13:06       ` Petr Mladek via Virtualization
2022-06-09 10:14   ` Petr Mladek via Virtualization
2022-06-08 14:27 ` [PATCH 25/36] time/tick-broadcast: Remove RCU_NONIDLE usage Peter Zijlstra
2022-06-14 16:28   ` Mark Rutland
2022-06-08 14:27 ` [PATCH 26/36] cpuidle, sched: Remove annotations from TIF_{POLLING_NRFLAG, NEED_RESCHED} Peter Zijlstra
2022-06-08 14:27 ` [PATCH 27/36] cpuidle,mwait: Make noinstr clean Peter Zijlstra
2022-06-08 14:27 ` [PATCH 28/36] cpuidle,tdx: Make tdx " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 29/36] cpuidle,xenpv: Make more PARAVIRT_XXL " Peter Zijlstra
2022-06-13 18:48   ` [PATCH 29/36] cpuidle, xenpv: " Srivatsa S. Bhat
2022-06-13 19:23     ` [Pv-drivers] " Nadav Amit via Virtualization
2022-06-14 16:44       ` Peter Zijlstra
2022-06-08 14:27 ` [PATCH 30/36] cpuidle,nospec: Make " Peter Zijlstra
2022-06-08 14:27 ` [PATCH 31/36] cpuidle,acpi: " Peter Zijlstra
2022-07-06 14:04   ` Rafael J. Wysocki
2022-06-08 14:27 ` [PATCH 32/36] ftrace: WARN on rcuidle Peter Zijlstra
2022-06-08 14:27 ` [PATCH 33/36] cpuidle,omap3: Use WFI for omap3_pm_idle() Peter Zijlstra
2022-06-08 16:28   ` Arnd Bergmann
2022-06-09  9:40     ` Peter Zijlstra
     [not found]     ` <YqGjqgSrTRseJW6M@atomide.com>
2022-06-09  9:47       ` Peter Zijlstra
2022-06-08 14:27 ` [PATCH 34/36] cpuidle,omap3: Push RCU-idle into omap_sram_idle() Peter Zijlstra
2022-06-08 15:04   ` Peter Zijlstra
     [not found]   ` <Yqcv6crSNKuSWoTu@atomide.com>
2022-06-14 22:12     ` [PATCH 34.5/36] cpuidle,omap4: Push RCU-idle into omap4_enter_lowpower() Peter Zijlstra
2022-06-08 14:27 ` [PATCH 35/36] cpuidle,powerdomain: Remove trace_.*_rcuidle() Peter Zijlstra
2022-06-08 14:27 ` [PATCH 36/36] cpuidle,clk: " Peter Zijlstra
2022-06-14 11:19 ` [PATCH 00/36] cpuidle,rcu: Cleanup the mess Mark Rutland
2022-06-14 16:58   ` Peter Zijlstra
2022-06-14 17:33     ` Mark Rutland

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).