Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d5a78cd authored by Aristeu Rozanski's avatar Aristeu Rozanski Committed by Ingo Molnar
Browse files

x86, NMI watchdog: disable NMIs on LVT0 in case NMI watchdog is not working



Impact: change NMI watchdog detection and disabling sequence

Currently, if the NMI watchdog fails using IOAPIC method, it'll only disable
interrupts on 8259 if the timer is passing thru it. This patch disables
NMI delivery on LINT0 if the NMI watchdog initial test fails, just for safety.

Signed-off-by: default avatarAristeu Rozanski <aris@redhat.com>
Cc: "Maciej W. Rozycki" <macro@linux-mips.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 6f290b4e
Loading
Loading
Loading
Loading
+11 −7
Original line number Original line Diff line number Diff line
@@ -131,6 +131,11 @@ static void report_broken_nmi(int cpu, int *prev_nmi_count)
	atomic_dec(&nmi_active);
	atomic_dec(&nmi_active);
}
}


static void __acpi_nmi_disable(void *__unused)
{
	apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
}

int __init check_nmi_watchdog(void)
int __init check_nmi_watchdog(void)
{
{
	unsigned int *prev_nmi_count;
	unsigned int *prev_nmi_count;
@@ -179,8 +184,12 @@ int __init check_nmi_watchdog(void)
	kfree(prev_nmi_count);
	kfree(prev_nmi_count);
	return 0;
	return 0;
error:
error:
	if (nmi_watchdog == NMI_IO_APIC && !timer_through_8259)
	if (nmi_watchdog == NMI_IO_APIC) {
		if (!timer_through_8259)
			disable_8259A_irq(0);
			disable_8259A_irq(0);
		on_each_cpu(__acpi_nmi_disable, NULL, 1);
	}

#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
	timer_ack = 0;
	timer_ack = 0;
#endif
#endif
@@ -285,11 +294,6 @@ void acpi_nmi_enable(void)
		on_each_cpu(__acpi_nmi_enable, NULL, 1);
		on_each_cpu(__acpi_nmi_enable, NULL, 1);
}
}


static void __acpi_nmi_disable(void *__unused)
{
	apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
}

/*
/*
 * Disable timer based NMIs on all CPUs:
 * Disable timer based NMIs on all CPUs:
 */
 */