Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Revert "x86/apic: Include the LDR when clearing out APIC registers"

This reverts commit 558682b5291937a70748d36fd9ba757fb25b99ae.

Chris Wilson reports that it breaks his CPU hotplug test scripts. In
particular, it breaks offlining and then re-onlining the boot CPU, which
we treat specially (and the BIOS does too).

The symptoms are that we can offline the CPU, but it then does not come
back online again:

smpboot: CPU 0 is now offline
smpboot: Booting Node 0 Processor 0 APIC 0x0
smpboot: do_boot_cpu failed(-1) to wakeup CPU#0

Thomas says he knows why it's broken (my personal suspicion: our magic
handling of the "cpu0_logical_apicid" thing), but for 5.3 the right fix
is to just revert it, since we've never touched the LDR bits before, and
it's not worth the risk to do anything else at this stage.

[ Hotpluging of the boot CPU is special anyway, and should be off by
default. See the "BOOTPARAM_HOTPLUG_CPU0" config option and the
cpu0_hotplug kernel parameter.

In general you should not do it, and it has various known limitations
(hibernate and suspend require the boot CPU, for example).

But it should work, even if the boot CPU is special and needs careful
treatment - Linus ]

Link: https://lore.kernel.org/lkml/156785100521.13300.14461504732265570003@skylake-alporthouse-com/
Reported-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Bandan Das <bsd@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

-4
-4
arch/x86/kernel/apic/apic.c
··· 1179 1179 apic_write(APIC_LVT0, v | APIC_LVT_MASKED); 1180 1180 v = apic_read(APIC_LVT1); 1181 1181 apic_write(APIC_LVT1, v | APIC_LVT_MASKED); 1182 - if (!x2apic_enabled()) { 1183 - v = apic_read(APIC_LDR) & ~APIC_LDR_MASK; 1184 - apic_write(APIC_LDR, v); 1185 - } 1186 1182 if (maxlvt >= 4) { 1187 1183 v = apic_read(APIC_LVTPC); 1188 1184 apic_write(APIC_LVTPC, v | APIC_LVT_MASKED);