Fix softlockup_thresh unaligned access and disable detection at runtime
Subsystems (2)
PATCH 1/1 Fix softlockup_thresh unaligned access and disable detection at runtime
Fix unaligned access errors when setting softlockup_thresh on 64 bit platforms.
Allow softlockup detection to be disabled by setting softlockup_thresh <= 0.
Detect that boot time softlockup detection has been disabled earlier in softlockup_tick.
Signed-off-by Dimitri Sivanich <[email protected]>
--- include/linux/sched.h | 2 +- kernel/softlockup.c | 12 ++++++++++-- kernel/sysctl.c | 9 +++++---- 3 files changed, 16 insertions(+), 7 deletions(-)
include/linux/sched.h +1 -1
@@ -292,10 +292,10 @@ extern void softlockup_tick(void);extern void spawn_softlockup_task (void );extern void touch_softlockup_watchdog (void );extern void touch_all_softlockup_watchdogs (void ); -extern unsigned long softlockup_thresh;extern unsigned long sysctl_hung_task_check_count;extern unsigned long sysctl_hung_task_timeout_secs;extern unsigned long sysctl_hung_task_warnings; +extern int softlockup_thresh;#else static inline void softlockup_tick (void ) {
kernel/softlockup.c +10 -2
@@ -25,7 +25,7 @@ static DEFINE_PER_CPU(unsigned long, print_timestamp); static DEFINE_PER_CPU(struct task_struct *, watchdog_task);static int __read_mostly did_panic; -unsigned long __read_mostly softlockup_thresh =60 ; +int __read_mostly softlockup_thresh =60 ;static int softlock_panic (struct notifier_block *this,unsigned long event,void *ptr)
@@ -79,6 +79,14 @@ void softlockup_tick(void)struct pt_regs *regs =get_irq_regs ();unsigned long now; +/* Is detection switched off? */ +if (!per_cpu (watchdog_task, this_cpu) || softlockup_thresh <=0 ) { +/* Be sure we don't false trigger if switched back on */ +if (touch_timestamp) +per_cpu (touch_timestamp, this_cpu) =0 ; +return ; + } +if (touch_timestamp ==0 ) {touch_softlockup_watchdog ();return ;
@@ -89,7 +97,7 @@ void softlockup_tick(void)/* report at most once a second */ if ((print_timestamp >= touch_timestamp && print_timestamp < (touch_timestamp +1 )) || - did_panic || !per_cpu (watchdog_task, this_cpu)) { + did_panic) {return ; }
kernel/sysctl.c +5 -4
@@ -83,12 +83,13 @@ extern int sysctl_stat_interval;extern int latencytop_enabled;/* Constants used for minimum and maximum */ -#if defined(CONFIG_DETECT_SOFTLOCKUP ) || defined(CONFIG_HIGHMEM ) +#ifdef CONFIG_HIGHMEM static int one =1 ;#endif #ifdef CONFIG_DETECT_SOFTLOCKUP static int sixty =60 ; +static int neg_one =-1 ;#endif #ifdef CONFIG_MMU
@@ -730,11 +731,11 @@ static struct ctl_table kern_table[] = { .ctl_name = CTL_UNNUMBERED, .procname = "softlockup_thresh", .data = &softlockup_thresh, - .maxlen = sizeof(unsigned long), + .maxlen = sizeof(int), .mode = 0644, - .proc_handler = &proc_doulongvec_minmax, + .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, - .extra1 = &one, + .extra1 = &neg_one, .extra2 = &sixty, }, {
Signature · 1 line
1.5.4.rc3
Ingo Molnar
AppliedQuoted 10 lines · Dimitri Sivanich
Fix unaligned access errors when setting
softlockup_threshon 64 bit platforms.Allow softlockup detection to be disabled by setting
softlockup_thresh<= 0.Detect that boot time softlockup detection has been disabled earlier in
softlockup_tick.Signed-off-by Dimitri Sivanich <[email protected]>
applied, thanks Dimitri.
Ingo