Skip to content

Commit 65e22ae

Browse files
masneybgregkh
authored andcommitted
x86/xen: don't unbind uninitialized lock_kicker_irq
[ Upstream commit 65cae18 ] When booting a hyperthreaded system with the kernel parameter 'mitigations=auto,nosmt', the following warning occurs: WARNING: CPU: 0 PID: 1 at drivers/xen/events/events_base.c:1112 unbind_from_irqhandler+0x4e/0x60 ... Hardware name: Xen HVM domU, BIOS 4.2.amazon 08/24/2006 ... Call Trace: xen_uninit_lock_cpu+0x28/0x62 xen_hvm_cpu_die+0x21/0x30 takedown_cpu+0x9c/0xe0 ? trace_suspend_resume+0x60/0x60 cpuhp_invoke_callback+0x9a/0x530 _cpu_up+0x11a/0x130 cpu_up+0x7e/0xc0 bringup_nonboot_cpus+0x48/0x50 smp_init+0x26/0x79 kernel_init_freeable+0xea/0x229 ? rest_init+0xaa/0xaa kernel_init+0xa/0x106 ret_from_fork+0x35/0x40 The secondary CPUs are not activated with the nosmt mitigations and only the primary thread on each CPU core is used. In this situation, xen_hvm_smp_prepare_cpus(), and more importantly xen_init_lock_cpu(), is not called, so the lock_kicker_irq is not initialized for the secondary CPUs. Let's fix this by exiting early in xen_uninit_lock_cpu() if the irq is not set to avoid the warning from above for each secondary CPU. Signed-off-by: Brian Masney <bmasney@redhat.com> Link: https://lore.kernel.org/r/20201107011119.631442-1-bmasney@redhat.com Reviewed-by: Juergen Gross <jgross@suse.com> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 454c941 commit 65e22ae

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

arch/x86/xen/spinlock.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,20 @@ void xen_init_lock_cpu(int cpu)
9898

9999
void xen_uninit_lock_cpu(int cpu)
100100
{
101+
int irq;
102+
101103
if (!xen_pvspin)
102104
return;
103105

104-
unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
106+
/*
107+
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
108+
* CPUs are not activated, and lock_kicker_irq is not initialized.
109+
*/
110+
irq = per_cpu(lock_kicker_irq, cpu);
111+
if (irq == -1)
112+
return;
113+
114+
unbind_from_irqhandler(irq, NULL);
105115
per_cpu(lock_kicker_irq, cpu) = -1;
106116
kfree(per_cpu(irq_name, cpu));
107117
per_cpu(irq_name, cpu) = NULL;

0 commit comments

Comments
 (0)