Messages in this thread | | | Date | Mon, 16 Aug 2010 10:30:52 -0400 | From | Don Zickus <> | Subject | Re: [PATCH] fix BUG using smp_processor_id() in touch_nmi_watchdog and touch_softlockup_watchdog |
| |
cc'ing Frederic
On Mon, Aug 16, 2010 at 05:08:29PM +0300, Sergey Senozhatsky wrote: > Fix: acpi_os_stall calls touch_nmi_watchdog and touch_softlockup_watchdog > with preemption enabled causing 'BUG: using smp_processor_id() in preemptible > code'. > > Patch also removes double smp_processor_id call (smp_processor_id itself and in > __get_cpu_var) in __touch_watchdog. > > Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Acked-by: Don Zickus <dzickus@redhat.com>
> > --- > > diff --git a/kernel/watchdog.c b/kernel/watchdog.c > index 613bc1f..8822f1e 100644 > --- a/kernel/watchdog.c > +++ b/kernel/watchdog.c > @@ -116,13 +116,14 @@ static unsigned long get_sample_period(void) > static void __touch_watchdog(void) > { > int this_cpu = smp_processor_id(); > - > - __get_cpu_var(watchdog_touch_ts) = get_timestamp(this_cpu); > + per_cpu(watchdog_touch_ts, this_cpu) = get_timestamp(this_cpu); > } > > void touch_softlockup_watchdog(void) > { > - __get_cpu_var(watchdog_touch_ts) = 0; > + int this_cpu = get_cpu(); > + per_cpu(watchdog_touch_ts, this_cpu) = 0; > + put_cpu(); > } > EXPORT_SYMBOL(touch_softlockup_watchdog); > > @@ -142,7 +143,9 @@ void touch_all_softlockup_watchdogs(void) > #ifdef CONFIG_HARDLOCKUP_DETECTOR > void touch_nmi_watchdog(void) > { > - __get_cpu_var(watchdog_nmi_touch) = true; > + int this_cpu = get_cpu(); > + per_cpu(watchdog_nmi_touch, this_cpu) = true; > + put_cpu(); > touch_softlockup_watchdog(); > } > EXPORT_SYMBOL(touch_nmi_watchdog); >
| |