mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull core debug changes from Ingo Molnar: "This contains mostly kernel debugging related updates: - make hung_task detection more configurable to distros - add final bits for x86 UV NMI debugging, with related KGDB changes - update the mailing-list of MAINTAINERS entries I'm involved with" * 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: hung_task: Display every hung task warning sysctl: Add neg_one as a standard constraint x86/uv/nmi, kgdb/kdb: Fix UV NMI handler when KDB not configured x86/uv/nmi: Fix Sparse warnings kgdb/kdb: Fix no KDB config problem MAINTAINERS: Restore "L: linux-kernel@vger.kernel.org" entries
This commit is contained in:
		
						commit
						ab5318788c
					
				
					 11 changed files with 116 additions and 32 deletions
				
			
		| 
						 | 
					@ -33,6 +33,10 @@ show up in /proc/sys/kernel:
 | 
				
			||||||
- domainname
 | 
					- domainname
 | 
				
			||||||
- hostname
 | 
					- hostname
 | 
				
			||||||
- hotplug
 | 
					- hotplug
 | 
				
			||||||
 | 
					- hung_task_panic
 | 
				
			||||||
 | 
					- hung_task_check_count
 | 
				
			||||||
 | 
					- hung_task_timeout_secs
 | 
				
			||||||
 | 
					- hung_task_warnings
 | 
				
			||||||
- kexec_load_disabled
 | 
					- kexec_load_disabled
 | 
				
			||||||
- kptr_restrict
 | 
					- kptr_restrict
 | 
				
			||||||
- kstack_depth_to_print       [ X86 only ]
 | 
					- kstack_depth_to_print       [ X86 only ]
 | 
				
			||||||
| 
						 | 
					@ -288,6 +292,44 @@ Default value is "/sbin/hotplug".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
==============================================================
 | 
					==============================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hung_task_panic:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Controls the kernel's behavior when a hung task is detected.
 | 
				
			||||||
 | 
					This file shows up if CONFIG_DETECT_HUNG_TASK is enabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0: continue operation. This is the default behavior.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1: panic immediately.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hung_task_check_count:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The upper bound on the number of tasks that are checked.
 | 
				
			||||||
 | 
					This file shows up if CONFIG_DETECT_HUNG_TASK is enabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hung_task_timeout_secs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Check interval. When a task in D state did not get scheduled
 | 
				
			||||||
 | 
					for more than this value report a warning.
 | 
				
			||||||
 | 
					This file shows up if CONFIG_DETECT_HUNG_TASK is enabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0: means infinite timeout - no checking done.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hung_task_warning:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The maximum number of warnings to report. During a check interval
 | 
				
			||||||
 | 
					When this value is reached, no more the warnings will be reported.
 | 
				
			||||||
 | 
					This file shows up if CONFIG_DETECT_HUNG_TASK is enabled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-1: report an infinite number of warnings.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==============================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
kexec_load_disabled:
 | 
					kexec_load_disabled:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A toggle indicating if the kexec_load syscall has been disabled. This
 | 
					A toggle indicating if the kexec_load syscall has been disabled. This
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								MAINTAINERS
									
									
									
									
									
								
							| 
						 | 
					@ -2222,6 +2222,7 @@ F:	include/linux/clk.h
 | 
				
			||||||
CLOCKSOURCE, CLOCKEVENT DRIVERS
 | 
					CLOCKSOURCE, CLOCKEVENT DRIVERS
 | 
				
			||||||
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
 | 
					M:	Daniel Lezcano <daniel.lezcano@linaro.org>
 | 
				
			||||||
M:	Thomas Gleixner <tglx@linutronix.de>
 | 
					M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	drivers/clocksource
 | 
					F:	drivers/clocksource
 | 
				
			||||||
| 
						 | 
					@ -4023,6 +4024,7 @@ F:	include/uapi/linux/hid*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
 | 
					HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
 | 
				
			||||||
M:	Thomas Gleixner <tglx@linutronix.de>
 | 
					M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/timers/
 | 
					F:	Documentation/timers/
 | 
				
			||||||
| 
						 | 
					@ -4694,6 +4696,7 @@ F:	net/irda/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IRQ SUBSYSTEM
 | 
					IRQ SUBSYSTEM
 | 
				
			||||||
M:	Thomas Gleixner <tglx@linutronix.de>
 | 
					M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
 | 
				
			||||||
F:	kernel/irq/
 | 
					F:	kernel/irq/
 | 
				
			||||||
| 
						 | 
					@ -5325,6 +5328,7 @@ F:	drivers/media/usb/dvb-usb-v2/lmedm04*
 | 
				
			||||||
LOCKDEP AND LOCKSTAT
 | 
					LOCKDEP AND LOCKSTAT
 | 
				
			||||||
M:	Peter Zijlstra <peterz@infradead.org>
 | 
					M:	Peter Zijlstra <peterz@infradead.org>
 | 
				
			||||||
M:	Ingo Molnar <mingo@redhat.com>
 | 
					M:	Ingo Molnar <mingo@redhat.com>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/lockdep*.txt
 | 
					F:	Documentation/lockdep*.txt
 | 
				
			||||||
| 
						 | 
					@ -6622,6 +6626,7 @@ M:	Peter Zijlstra <a.p.zijlstra@chello.nl>
 | 
				
			||||||
M:	Paul Mackerras <paulus@samba.org>
 | 
					M:	Paul Mackerras <paulus@samba.org>
 | 
				
			||||||
M:	Ingo Molnar <mingo@redhat.com>
 | 
					M:	Ingo Molnar <mingo@redhat.com>
 | 
				
			||||||
M:	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 | 
					M:	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	kernel/events/*
 | 
					F:	kernel/events/*
 | 
				
			||||||
| 
						 | 
					@ -6745,6 +6750,7 @@ F:	drivers/scsi/pm8001/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
POSIX CLOCKS and TIMERS
 | 
					POSIX CLOCKS and TIMERS
 | 
				
			||||||
M:	Thomas Gleixner <tglx@linutronix.de>
 | 
					M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	fs/timerfd.c
 | 
					F:	fs/timerfd.c
 | 
				
			||||||
| 
						 | 
					@ -7153,6 +7159,7 @@ F:	drivers/net/wireless/ray*
 | 
				
			||||||
RCUTORTURE MODULE
 | 
					RCUTORTURE MODULE
 | 
				
			||||||
M:	Josh Triplett <josh@freedesktop.org>
 | 
					M:	Josh Triplett <josh@freedesktop.org>
 | 
				
			||||||
M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
					M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
				
			||||||
F:	Documentation/RCU/torture.txt
 | 
					F:	Documentation/RCU/torture.txt
 | 
				
			||||||
| 
						 | 
					@ -7160,6 +7167,7 @@ F:	kernel/rcu/torture.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RCUTORTURE TEST FRAMEWORK
 | 
					RCUTORTURE TEST FRAMEWORK
 | 
				
			||||||
M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
					M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
				
			||||||
F:	tools/testing/selftests/rcutorture
 | 
					F:	tools/testing/selftests/rcutorture
 | 
				
			||||||
| 
						 | 
					@ -7183,6 +7191,7 @@ F:	net/rds/
 | 
				
			||||||
READ-COPY UPDATE (RCU)
 | 
					READ-COPY UPDATE (RCU)
 | 
				
			||||||
M:	Dipankar Sarma <dipankar@in.ibm.com>
 | 
					M:	Dipankar Sarma <dipankar@in.ibm.com>
 | 
				
			||||||
M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
					M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
W:	http://www.rdrop.com/users/paulmck/RCU/
 | 
					W:	http://www.rdrop.com/users/paulmck/RCU/
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
				
			||||||
| 
						 | 
					@ -7492,6 +7501,7 @@ F:	drivers/mmc/host/dw_mmc*
 | 
				
			||||||
TIMEKEEPING, CLOCKSOURCE CORE, NTP
 | 
					TIMEKEEPING, CLOCKSOURCE CORE, NTP
 | 
				
			||||||
M:	John Stultz <john.stultz@linaro.org>
 | 
					M:	John Stultz <john.stultz@linaro.org>
 | 
				
			||||||
M:	Thomas Gleixner <tglx@linutronix.de>
 | 
					M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	include/linux/clocksource.h
 | 
					F:	include/linux/clocksource.h
 | 
				
			||||||
| 
						 | 
					@ -7517,6 +7527,7 @@ F:	drivers/watchdog/sc1200wdt.c
 | 
				
			||||||
SCHEDULER
 | 
					SCHEDULER
 | 
				
			||||||
M:	Ingo Molnar <mingo@redhat.com>
 | 
					M:	Ingo Molnar <mingo@redhat.com>
 | 
				
			||||||
M:	Peter Zijlstra <peterz@infradead.org>
 | 
					M:	Peter Zijlstra <peterz@infradead.org>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	kernel/sched/
 | 
					F:	kernel/sched/
 | 
				
			||||||
| 
						 | 
					@ -7884,6 +7895,7 @@ F:	mm/sl?b.c
 | 
				
			||||||
SLEEPABLE READ-COPY UPDATE (SRCU)
 | 
					SLEEPABLE READ-COPY UPDATE (SRCU)
 | 
				
			||||||
M:	Lai Jiangshan <laijs@cn.fujitsu.com>
 | 
					M:	Lai Jiangshan <laijs@cn.fujitsu.com>
 | 
				
			||||||
M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
					M:	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
W:	http://www.rdrop.com/users/paulmck/RCU/
 | 
					W:	http://www.rdrop.com/users/paulmck/RCU/
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 | 
				
			||||||
| 
						 | 
					@ -9587,6 +9599,7 @@ M:	Thomas Gleixner <tglx@linutronix.de>
 | 
				
			||||||
M:	Ingo Molnar <mingo@redhat.com>
 | 
					M:	Ingo Molnar <mingo@redhat.com>
 | 
				
			||||||
M:	"H. Peter Anvin" <hpa@zytor.com>
 | 
					M:	"H. Peter Anvin" <hpa@zytor.com>
 | 
				
			||||||
M:	x86@kernel.org
 | 
					M:	x86@kernel.org
 | 
				
			||||||
 | 
					L:	linux-kernel@vger.kernel.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/x86/
 | 
					F:	Documentation/x86/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,6 @@ extern enum uv_system_type get_uv_system_type(void);
 | 
				
			||||||
extern int is_uv_system(void);
 | 
					extern int is_uv_system(void);
 | 
				
			||||||
extern void uv_cpu_init(void);
 | 
					extern void uv_cpu_init(void);
 | 
				
			||||||
extern void uv_nmi_init(void);
 | 
					extern void uv_nmi_init(void);
 | 
				
			||||||
extern void uv_register_nmi_notifier(void);
 | 
					 | 
				
			||||||
extern void uv_system_init(void);
 | 
					extern void uv_system_init(void);
 | 
				
			||||||
extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 | 
					extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
 | 
				
			||||||
						 struct mm_struct *mm,
 | 
											 struct mm_struct *mm,
 | 
				
			||||||
| 
						 | 
					@ -26,7 +25,6 @@ static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; }
 | 
				
			||||||
static inline int is_uv_system(void)	{ return 0; }
 | 
					static inline int is_uv_system(void)	{ return 0; }
 | 
				
			||||||
static inline void uv_cpu_init(void)	{ }
 | 
					static inline void uv_cpu_init(void)	{ }
 | 
				
			||||||
static inline void uv_system_init(void)	{ }
 | 
					static inline void uv_system_init(void)	{ }
 | 
				
			||||||
static inline void uv_register_nmi_notifier(void) { }
 | 
					 | 
				
			||||||
static inline const struct cpumask *
 | 
					static inline const struct cpumask *
 | 
				
			||||||
uv_flush_tlb_others(const struct cpumask *cpumask, struct mm_struct *mm,
 | 
					uv_flush_tlb_others(const struct cpumask *cpumask, struct mm_struct *mm,
 | 
				
			||||||
		    unsigned long start, unsigned long end, unsigned int cpu)
 | 
							    unsigned long start, unsigned long end, unsigned int cpu)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -980,7 +980,6 @@ void __init uv_system_init(void)
 | 
				
			||||||
	uv_nmi_setup();
 | 
						uv_nmi_setup();
 | 
				
			||||||
	uv_cpu_init();
 | 
						uv_cpu_init();
 | 
				
			||||||
	uv_scir_register_cpu_notifier();
 | 
						uv_scir_register_cpu_notifier();
 | 
				
			||||||
	uv_register_nmi_notifier();
 | 
					 | 
				
			||||||
	proc_mkdir("sgi_uv", NULL);
 | 
						proc_mkdir("sgi_uv", NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* register Legacy VGA I/O redirection handler */
 | 
						/* register Legacy VGA I/O redirection handler */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,7 +74,6 @@ static atomic_t	uv_in_nmi;
 | 
				
			||||||
static atomic_t uv_nmi_cpu = ATOMIC_INIT(-1);
 | 
					static atomic_t uv_nmi_cpu = ATOMIC_INIT(-1);
 | 
				
			||||||
static atomic_t uv_nmi_cpus_in_nmi = ATOMIC_INIT(-1);
 | 
					static atomic_t uv_nmi_cpus_in_nmi = ATOMIC_INIT(-1);
 | 
				
			||||||
static atomic_t uv_nmi_slave_continue;
 | 
					static atomic_t uv_nmi_slave_continue;
 | 
				
			||||||
static atomic_t uv_nmi_kexec_failed;
 | 
					 | 
				
			||||||
static cpumask_var_t uv_nmi_cpu_mask;
 | 
					static cpumask_var_t uv_nmi_cpu_mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Values for uv_nmi_slave_continue */
 | 
					/* Values for uv_nmi_slave_continue */
 | 
				
			||||||
| 
						 | 
					@ -149,7 +148,8 @@ module_param_named(retry_count, uv_nmi_retry_count, int, 0644);
 | 
				
			||||||
 *  "dump"	- dump process stack for each cpu
 | 
					 *  "dump"	- dump process stack for each cpu
 | 
				
			||||||
 *  "ips"	- dump IP info for each cpu
 | 
					 *  "ips"	- dump IP info for each cpu
 | 
				
			||||||
 *  "kdump"	- do crash dump
 | 
					 *  "kdump"	- do crash dump
 | 
				
			||||||
 *  "kdb"	- enter KDB/KGDB (default)
 | 
					 *  "kdb"	- enter KDB (default)
 | 
				
			||||||
 | 
					 *  "kgdb"	- enter KGDB
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static char uv_nmi_action[8] = "kdb";
 | 
					static char uv_nmi_action[8] = "kdb";
 | 
				
			||||||
module_param_string(action, uv_nmi_action, sizeof(uv_nmi_action), 0644);
 | 
					module_param_string(action, uv_nmi_action, sizeof(uv_nmi_action), 0644);
 | 
				
			||||||
| 
						 | 
					@ -504,6 +504,7 @@ static void uv_nmi_touch_watchdogs(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_KEXEC)
 | 
					#if defined(CONFIG_KEXEC)
 | 
				
			||||||
 | 
					static atomic_t uv_nmi_kexec_failed;
 | 
				
			||||||
static void uv_nmi_kdump(int cpu, int master, struct pt_regs *regs)
 | 
					static void uv_nmi_kdump(int cpu, int master, struct pt_regs *regs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Call crash to dump system state */
 | 
						/* Call crash to dump system state */
 | 
				
			||||||
| 
						 | 
					@ -537,18 +538,45 @@ static inline void uv_nmi_kdump(int cpu, int master, struct pt_regs *regs)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* !CONFIG_KEXEC */
 | 
					#endif /* !CONFIG_KEXEC */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_KGDB
 | 
				
			||||||
#ifdef CONFIG_KGDB_KDB
 | 
					#ifdef CONFIG_KGDB_KDB
 | 
				
			||||||
/* Call KDB from NMI handler */
 | 
					static inline int uv_nmi_kdb_reason(void)
 | 
				
			||||||
static void uv_call_kdb(int cpu, struct pt_regs *regs, int master)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						return KDB_REASON_SYSTEM_NMI;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else /* !CONFIG_KGDB_KDB */
 | 
				
			||||||
 | 
					static inline int uv_nmi_kdb_reason(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* Insure user is expecting to attach gdb remote */
 | 
				
			||||||
 | 
						if (uv_nmi_action_is("kgdb"))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pr_err("UV: NMI error: KDB is not enabled in this kernel\n");
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* CONFIG_KGDB_KDB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Call KGDB/KDB from NMI handler
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Note that if both KGDB and KDB are configured, then the action of 'kgdb' or
 | 
				
			||||||
 | 
					 * 'kdb' has no affect on which is used.  See the KGDB documention for further
 | 
				
			||||||
 | 
					 * information.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void uv_call_kgdb_kdb(int cpu, struct pt_regs *regs, int master)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (master) {
 | 
				
			||||||
 | 
							int reason = uv_nmi_kdb_reason();
 | 
				
			||||||
		int ret;
 | 
							int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (master) {
 | 
							if (reason < 0)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* call KGDB NMI handler as MASTER */
 | 
							/* call KGDB NMI handler as MASTER */
 | 
				
			||||||
		ret = kgdb_nmicallin(cpu, X86_TRAP_NMI, regs,
 | 
							ret = kgdb_nmicallin(cpu, X86_TRAP_NMI, regs, reason,
 | 
				
			||||||
				&uv_nmi_slave_continue);
 | 
									&uv_nmi_slave_continue);
 | 
				
			||||||
		if (ret) {
 | 
							if (ret) {
 | 
				
			||||||
			pr_alert("KDB returned error, is kgdboc set?\n");
 | 
								pr_alert("KGDB returned error, is kgdboc set?\n");
 | 
				
			||||||
			atomic_set(&uv_nmi_slave_continue, SLAVE_EXIT);
 | 
								atomic_set(&uv_nmi_slave_continue, SLAVE_EXIT);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					@ -567,12 +595,12 @@ static void uv_call_kdb(int cpu, struct pt_regs *regs, int master)
 | 
				
			||||||
	uv_nmi_sync_exit(master);
 | 
						uv_nmi_sync_exit(master);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else /* !CONFIG_KGDB_KDB */
 | 
					#else /* !CONFIG_KGDB */
 | 
				
			||||||
static inline void uv_call_kdb(int cpu, struct pt_regs *regs, int master)
 | 
					static inline void uv_call_kgdb_kdb(int cpu, struct pt_regs *regs, int master)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	pr_err("UV: NMI error: KGDB/KDB is not enabled in this kernel\n");
 | 
						pr_err("UV: NMI error: KGDB is not enabled in this kernel\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif /* !CONFIG_KGDB_KDB */
 | 
					#endif /* !CONFIG_KGDB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * UV NMI handler
 | 
					 * UV NMI handler
 | 
				
			||||||
| 
						 | 
					@ -606,9 +634,9 @@ int uv_handle_nmi(unsigned int reason, struct pt_regs *regs)
 | 
				
			||||||
	if (uv_nmi_action_is("ips") || uv_nmi_action_is("dump"))
 | 
						if (uv_nmi_action_is("ips") || uv_nmi_action_is("dump"))
 | 
				
			||||||
		uv_nmi_dump_state(cpu, regs, master);
 | 
							uv_nmi_dump_state(cpu, regs, master);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Call KDB if enabled */
 | 
						/* Call KGDB/KDB if enabled */
 | 
				
			||||||
	else if (uv_nmi_action_is("kdb"))
 | 
						else if (uv_nmi_action_is("kdb") || uv_nmi_action_is("kgdb"))
 | 
				
			||||||
		uv_call_kdb(cpu, regs, master);
 | 
							uv_call_kgdb_kdb(cpu, regs, master);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Clear per_cpu "in nmi" flag */
 | 
						/* Clear per_cpu "in nmi" flag */
 | 
				
			||||||
	atomic_set(&uv_cpu_nmi.state, UV_NMI_STATE_OUT);
 | 
						atomic_set(&uv_cpu_nmi.state, UV_NMI_STATE_OUT);
 | 
				
			||||||
| 
						 | 
					@ -634,7 +662,7 @@ int uv_handle_nmi(unsigned int reason, struct pt_regs *regs)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * NMI handler for pulling in CPUs when perf events are grabbing our NMI
 | 
					 * NMI handler for pulling in CPUs when perf events are grabbing our NMI
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int uv_handle_nmi_ping(unsigned int reason, struct pt_regs *regs)
 | 
					static int uv_handle_nmi_ping(unsigned int reason, struct pt_regs *regs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -651,7 +679,7 @@ int uv_handle_nmi_ping(unsigned int reason, struct pt_regs *regs)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void uv_register_nmi_notifier(void)
 | 
					static void uv_register_nmi_notifier(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (register_nmi_handler(NMI_UNKNOWN, uv_handle_nmi, 0, "uv"))
 | 
						if (register_nmi_handler(NMI_UNKNOWN, uv_handle_nmi, 0, "uv"))
 | 
				
			||||||
		pr_warn("UV: NMI handler failed to register\n");
 | 
							pr_warn("UV: NMI handler failed to register\n");
 | 
				
			||||||
| 
						 | 
					@ -695,6 +723,5 @@ void uv_nmi_setup(void)
 | 
				
			||||||
		uv_hub_nmi_per(cpu) = uv_hub_nmi_list[nid];
 | 
							uv_hub_nmi_per(cpu) = uv_hub_nmi_list[nid];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	BUG_ON(!alloc_cpumask_var(&uv_nmi_cpu_mask, GFP_KERNEL));
 | 
						BUG_ON(!alloc_cpumask_var(&uv_nmi_cpu_mask, GFP_KERNEL));
 | 
				
			||||||
 | 
						uv_register_nmi_notifier();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -310,7 +310,8 @@ extern int
 | 
				
			||||||
kgdb_handle_exception(int ex_vector, int signo, int err_code,
 | 
					kgdb_handle_exception(int ex_vector, int signo, int err_code,
 | 
				
			||||||
		      struct pt_regs *regs);
 | 
							      struct pt_regs *regs);
 | 
				
			||||||
extern int kgdb_nmicallback(int cpu, void *regs);
 | 
					extern int kgdb_nmicallback(int cpu, void *regs);
 | 
				
			||||||
extern int kgdb_nmicallin(int cpu, int trapnr, void *regs, atomic_t *snd_rdy);
 | 
					extern int kgdb_nmicallin(int cpu, int trapnr, void *regs, int err_code,
 | 
				
			||||||
 | 
								  atomic_t *snd_rdy);
 | 
				
			||||||
extern void gdbstub_exit(int status);
 | 
					extern void gdbstub_exit(int status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int			kgdb_single_step;
 | 
					extern int			kgdb_single_step;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
extern int	     sysctl_hung_task_check_count;
 | 
					extern int	     sysctl_hung_task_check_count;
 | 
				
			||||||
extern unsigned int  sysctl_hung_task_panic;
 | 
					extern unsigned int  sysctl_hung_task_panic;
 | 
				
			||||||
extern unsigned long sysctl_hung_task_timeout_secs;
 | 
					extern unsigned long sysctl_hung_task_timeout_secs;
 | 
				
			||||||
extern unsigned long sysctl_hung_task_warnings;
 | 
					extern int sysctl_hung_task_warnings;
 | 
				
			||||||
extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write,
 | 
					extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write,
 | 
				
			||||||
					 void __user *buffer,
 | 
										 void __user *buffer,
 | 
				
			||||||
					 size_t *lenp, loff_t *ppos);
 | 
										 size_t *lenp, loff_t *ppos);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -736,7 +736,8 @@ int kgdb_nmicallback(int cpu, void *regs)
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int kgdb_nmicallin(int cpu, int trapnr, void *regs, atomic_t *send_ready)
 | 
					int kgdb_nmicallin(int cpu, int trapnr, void *regs, int err_code,
 | 
				
			||||||
 | 
												atomic_t *send_ready)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CONFIG_SMP
 | 
					#ifdef CONFIG_SMP
 | 
				
			||||||
	if (!kgdb_io_ready(0) || !send_ready)
 | 
						if (!kgdb_io_ready(0) || !send_ready)
 | 
				
			||||||
| 
						 | 
					@ -750,7 +751,7 @@ int kgdb_nmicallin(int cpu, int trapnr, void *regs, atomic_t *send_ready)
 | 
				
			||||||
		ks->cpu			= cpu;
 | 
							ks->cpu			= cpu;
 | 
				
			||||||
		ks->ex_vector		= trapnr;
 | 
							ks->ex_vector		= trapnr;
 | 
				
			||||||
		ks->signo		= SIGTRAP;
 | 
							ks->signo		= SIGTRAP;
 | 
				
			||||||
		ks->err_code		= KGDB_KDB_REASON_SYSTEM_NMI;
 | 
							ks->err_code		= err_code;
 | 
				
			||||||
		ks->linux_regs		= regs;
 | 
							ks->linux_regs		= regs;
 | 
				
			||||||
		ks->send_ready		= send_ready;
 | 
							ks->send_ready		= send_ready;
 | 
				
			||||||
		kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER);
 | 
							kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,13 +75,11 @@ extern int kdb_stub(struct kgdb_state *ks);
 | 
				
			||||||
extern int kdb_parse(const char *cmdstr);
 | 
					extern int kdb_parse(const char *cmdstr);
 | 
				
			||||||
extern int kdb_common_init_state(struct kgdb_state *ks);
 | 
					extern int kdb_common_init_state(struct kgdb_state *ks);
 | 
				
			||||||
extern int kdb_common_deinit_state(void);
 | 
					extern int kdb_common_deinit_state(void);
 | 
				
			||||||
#define KGDB_KDB_REASON_SYSTEM_NMI KDB_REASON_SYSTEM_NMI
 | 
					 | 
				
			||||||
#else /* ! CONFIG_KGDB_KDB */
 | 
					#else /* ! CONFIG_KGDB_KDB */
 | 
				
			||||||
static inline int kdb_stub(struct kgdb_state *ks)
 | 
					static inline int kdb_stub(struct kgdb_state *ks)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return DBG_PASS_EVENT;
 | 
						return DBG_PASS_EVENT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#define KGDB_KDB_REASON_SYSTEM_NMI 0
 | 
					 | 
				
			||||||
#endif /* CONFIG_KGDB_KDB */
 | 
					#endif /* CONFIG_KGDB_KDB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _DEBUG_CORE_H_ */
 | 
					#endif /* _DEBUG_CORE_H_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT;
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT;
 | 
					unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long __read_mostly sysctl_hung_task_warnings = 10;
 | 
					int __read_mostly sysctl_hung_task_warnings = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __read_mostly did_panic;
 | 
					static int __read_mostly did_panic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,6 +98,8 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!sysctl_hung_task_warnings)
 | 
						if (!sysctl_hung_task_warnings)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (sysctl_hung_task_warnings > 0)
 | 
				
			||||||
		sysctl_hung_task_warnings--;
 | 
							sysctl_hung_task_warnings--;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,6 +121,8 @@ extern int blk_iopoll_enabled;
 | 
				
			||||||
static int sixty = 60;
 | 
					static int sixty = 60;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int __maybe_unused neg_one = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int zero;
 | 
					static int zero;
 | 
				
			||||||
static int __maybe_unused one = 1;
 | 
					static int __maybe_unused one = 1;
 | 
				
			||||||
static int __maybe_unused two = 2;
 | 
					static int __maybe_unused two = 2;
 | 
				
			||||||
| 
						 | 
					@ -997,9 +999,10 @@ static struct ctl_table kern_table[] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		.procname	= "hung_task_warnings",
 | 
							.procname	= "hung_task_warnings",
 | 
				
			||||||
		.data		= &sysctl_hung_task_warnings,
 | 
							.data		= &sysctl_hung_task_warnings,
 | 
				
			||||||
		.maxlen		= sizeof(unsigned long),
 | 
							.maxlen		= sizeof(int),
 | 
				
			||||||
		.mode		= 0644,
 | 
							.mode		= 0644,
 | 
				
			||||||
		.proc_handler	= proc_doulongvec_minmax,
 | 
							.proc_handler	= proc_dointvec_minmax,
 | 
				
			||||||
 | 
							.extra1		= &neg_one,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef CONFIG_COMPAT
 | 
					#ifdef CONFIG_COMPAT
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue