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

Commit 407984f1 authored by Don Zickus's avatar Don Zickus Committed by Andi Kleen
Browse files

[PATCH] x86: Add abilty to enable/disable nmi watchdog with sysctl



Adds a new /proc/sys/kernel/nmi call that will enable/disable the nmi
watchdog.

Signed-off-by: default avatarDon Zickus <dzickus@redhat.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
parent 2fbe7b25
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -846,6 +846,58 @@ static int unknown_nmi_panic_callback(struct pt_regs *regs, int cpu)
	return 0;
}

/*
 * proc handler for /proc/sys/kernel/nmi_watchdog
 */
int proc_nmi_enabled(struct ctl_table *table, int write, struct file *file,
			void __user *buffer, size_t *length, loff_t *ppos)
{
	int old_state;

	nmi_watchdog_enabled = (atomic_read(&nmi_active) > 0) ? 1 : 0;
	old_state = nmi_watchdog_enabled;
	proc_dointvec(table, write, file, buffer, length, ppos);
	if (!!old_state == !!nmi_watchdog_enabled)
		return 0;

	if (atomic_read(&nmi_active) < 0) {
		printk(KERN_WARNING "NMI watchdog is permanently disabled\n");
		return -EINVAL;
	}

	if (nmi_watchdog == NMI_DEFAULT) {
		if (nmi_known_cpu() > 0)
			nmi_watchdog = NMI_LOCAL_APIC;
		else
			nmi_watchdog = NMI_IO_APIC;
	}

	if (nmi_watchdog == NMI_LOCAL_APIC)
	{
		if (nmi_watchdog_enabled)
			enable_lapic_nmi_watchdog();
		else
			disable_lapic_nmi_watchdog();
	} else if (nmi_watchdog == NMI_IO_APIC) {
		/* FIXME
		 * for some reason these functions don't work
		 */
		printk("Can not enable/disable NMI on IO APIC\n");
		return -EINVAL;
#if 0
		if (nmi_watchdog_enabled)
			enable_timer_nmi_watchdog();
		else
			disable_timer_nmi_watchdog();
#endif
	} else {
		printk( KERN_WARNING
			"NMI watchdog doesn't know what hardware to touch\n");
		return -EIO;
	}
	return 0;
}

#endif

EXPORT_SYMBOL(nmi_active);
+48 −0
Original line number Diff line number Diff line
@@ -750,6 +750,54 @@ static int unknown_nmi_panic_callback(struct pt_regs *regs, int cpu)
	return 0;
}

/*
 * proc handler for /proc/sys/kernel/nmi
 */
int proc_nmi_enabled(struct ctl_table *table, int write, struct file *file,
			void __user *buffer, size_t *length, loff_t *ppos)
{
	int old_state;

	nmi_watchdog_enabled = (atomic_read(&nmi_active) > 0) ? 1 : 0;
	old_state = nmi_watchdog_enabled;
	proc_dointvec(table, write, file, buffer, length, ppos);
	if (!!old_state == !!nmi_watchdog_enabled)
		return 0;

	if (atomic_read(&nmi_active) < 0) {
		printk( KERN_WARNING "NMI watchdog is permanently disabled\n");
		return -EINVAL;
	}

	/* if nmi_watchdog is not set yet, then set it */
	nmi_watchdog_default();

	if (nmi_watchdog == NMI_LOCAL_APIC)
	{
		if (nmi_watchdog_enabled)
			enable_lapic_nmi_watchdog();
		else
			disable_lapic_nmi_watchdog();
	} else if (nmi_watchdog == NMI_IO_APIC) {
		/* FIXME
		 * for some reason these functions don't work
		 */
		printk("Can not enable/disable NMI on IO APIC\n");
		return -EIO;
#if 0
		if (nmi_watchdog_enabled)
			enable_timer_nmi_watchdog();
		else
			disable_timer_nmi_watchdog();
#endif
	} else {
		printk(KERN_WARNING
			"NMI watchdog doesn't know what hardware to touch\n");
		return -EIO;
	}
	return 0;
}

#endif

EXPORT_SYMBOL(nmi_active);
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
 */
int do_nmi_callback(struct pt_regs *regs, int cpu);

extern int nmi_watchdog_enabled;
extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
extern int avail_to_resrv_perfctr_nmi(unsigned int);
extern int reserve_perfctr_nmi(unsigned int);
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ extern void die_nmi(char *str, struct pt_regs *regs);

extern int panic_on_timeout;
extern int unknown_nmi_panic;
extern int nmi_watchdog_enabled;

extern int check_nmi_watchdog(void);
extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
+1 −0
Original line number Diff line number Diff line
@@ -150,6 +150,7 @@ enum
	KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */
	KERN_COMPAT_LOG=73,	/* int: print compat layer  messages */
	KERN_MAX_LOCK_DEPTH=74,
	KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */
};


Loading