diff mbox series

[v2] x86/xen: don't unbind uninitialized lock_kicker_irq

Message ID 20201107011119.631442-1-bmasney@redhat.com (mailing list archive)
State Accepted
Commit bdaac6fb4897e0113ae16ab8f09f7cf21812d91f
Headers show
Series [v2] x86/xen: don't unbind uninitialized lock_kicker_irq | expand

Commit Message

Brian Masney Nov. 7, 2020, 1:11 a.m. UTC
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>
---
Changes since v1:
- Remove duplicate per_cpu() call and pass in irq variable.
- Changed subject from 'x86/xen: fix warning when running with nosmt
  mitigations'
- Shorten code comment

 arch/x86/xen/spinlock.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

Comments

Jürgen Groß Nov. 9, 2020, 5:34 a.m. UTC | #1
On 07.11.20 02:11, Brian Masney wrote:
> 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>

Reviewed-by: Juergen Gross <jgross@suse.com>


Juergen
Boris Ostrovsky Nov. 9, 2020, 9:59 p.m. UTC | #2
On 11/9/20 12:34 AM, Jürgen Groß wrote:
> On 07.11.20 02:11, Brian Masney wrote:
>> 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>
>
> Reviewed-by: Juergen Gross <jgross@suse.com>



Applied to for-linus-5.10b.


-boris
diff mbox series

Patch

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 799f4eba0a62..043c73dfd2c9 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -93,10 +93,20 @@  void xen_init_lock_cpu(int cpu)
 
 void xen_uninit_lock_cpu(int cpu)
 {
+	int irq;
+
 	if (!xen_pvspin)
 		return;
 
-	unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
+	/*
+	 * When booting the kernel with 'mitigations=auto,nosmt', the secondary
+	 * CPUs are not activated, and lock_kicker_irq is not initialized.
+	 */
+	irq = per_cpu(lock_kicker_irq, cpu);
+	if (irq == -1)
+		return;
+
+	unbind_from_irqhandler(irq, NULL);
 	per_cpu(lock_kicker_irq, cpu) = -1;
 	kfree(per_cpu(irq_name, cpu));
 	per_cpu(irq_name, cpu) = NULL;