summaryrefslogtreecommitdiffstats
path: root/kernel/time
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2024-02-29 15:23:36 +0100
committerBorislav Petkov (AMD) <bp@alien8.de>2024-03-01 21:04:27 +0100
commit2be2a197ff6c3a659ab9285e1d88cbdc609ac6de (patch)
treee742ba7b20801029543c26db8d259147194b0c9a /kernel/time
parent44c76825d6eefee9eb7ce06c38e1a6632ac7eb7d (diff)
downloadlinux-2be2a197ff6c3a659ab9285e1d88cbdc609ac6de.tar.gz
linux-2be2a197ff6c3a659ab9285e1d88cbdc609ac6de.tar.bz2
linux-2be2a197ff6c3a659ab9285e1d88cbdc609ac6de.zip
sched/idle: Conditionally handle tick broadcast in default_idle_call()
The x86 architecture has an idle routine for AMD CPUs which are affected by erratum 400. On the affected CPUs the local APIC timer stops in the C1E halt state. It therefore requires tick broadcasting. The invocation of tick_broadcast_enter()/exit() from this function violates the RCU constraints because it can end up in lockdep or tracing, which rightfully triggers a warning. tick_broadcast_enter()/exit() must be invoked before ct_cpuidle_enter() and after ct_cpuidle_exit() in default_idle_call(). Add a static branch conditional invocation of tick_broadcast_enter()/exit() into this function to allow X86 to replace the AMD specific idle code. It's guarded by a config switch which will be selected by x86. Otherwise it's a NOOP. Reported-by: Borislav Petkov <bp@alien8.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Link: https://lore.kernel.org/r/20240229142248.266708822@linutronix.de
Diffstat (limited to 'kernel/time')
-rw-r--r--kernel/time/Kconfig5
1 files changed, 5 insertions, 0 deletions
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig
index bae8f11070be..fc3b1a06c981 100644
--- a/kernel/time/Kconfig
+++ b/kernel/time/Kconfig
@@ -39,6 +39,11 @@ config GENERIC_CLOCKEVENTS_BROADCAST
bool
depends on GENERIC_CLOCKEVENTS
+# Handle broadcast in default_idle_call()
+config GENERIC_CLOCKEVENTS_BROADCAST_IDLE
+ bool
+ depends on GENERIC_CLOCKEVENTS_BROADCAST
+
# Automatically adjust the min. reprogramming time for
# clock event device
config GENERIC_CLOCKEVENTS_MIN_ADJUST