On 05/05/2013 02:20 AM, tip-bot for Thomas Gleixner wrote: > Commit-ID: ae7868e241c015aadc8632d9fe633a102a5918f6 > Gitweb: http://git.kernel.org/tip/ae7868e241c015aadc8632d9fe633a102a5918f6 > Author: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > AuthorDate: Fri, 3 May 2013 15:02:50 +0200 > Committer: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > CommitDate: Sun, 5 May 2013 08:15:11 +0200 > > tick: Cleanup NOHZ per cpu data on cpu down > > Prarit reported a crash on CPU offline/online. The reason is that on > CPU down the NOHZ related per cpu data of the dead cpu is not cleaned > up. If at cpu online an interrupt happens before the per cpu tick > device is registered the irq_enter() check potentially sees stale data > and dereferences a NULL pointer. > > Cleanup the data after the cpu is dead. > > Reported-by: Prarit Bhargava <prarit@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1305031451561.2886@ionos > Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > --- > kernel/time/tick-common.c | 1 + > kernel/time/tick-internal.h | 6 ++++++ > kernel/time/tick-sched.c | 7 +++++++ > 3 files changed, 14 insertions(+) Whoa -- I thought I said I'll test this first. It doesn't work :( so that means something else is wrong ... I'm in the middle of debug ATM. P. > > diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c > index 6176a3e..29b765d 100644 > --- a/kernel/time/tick-common.c > +++ b/kernel/time/tick-common.c > @@ -387,6 +387,7 @@ static int tick_notify(struct notifier_block *nb, unsigned long reason, > tick_shutdown_broadcast_oneshot(dev); > tick_shutdown_broadcast(dev); > tick_shutdown(dev); > + tick_shutdown_nohz(dev); > break; > > case CLOCK_EVT_NOTIFY_SUSPEND: > diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h > index f0299ea..9644b29 100644 > --- a/kernel/time/tick-internal.h > +++ b/kernel/time/tick-internal.h > @@ -144,3 +144,9 @@ static inline int tick_device_is_functional(struct clock_event_device *dev) > #endif > > extern void do_timer(unsigned long ticks); > + > +#ifdef CONFIG_NO_HZ > +extern void tick_shutdown_nohz(unsigned int *cpup); > +#else > +static inline void tick_shutdown_nohz(unsigned int *cpup) { } > +#endif > diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c > index 225f8bf..e985ccd 100644 > --- a/kernel/time/tick-sched.c > +++ b/kernel/time/tick-sched.c > @@ -797,6 +797,13 @@ static inline void tick_check_nohz(int cpu) > } > } > > +void tick_shutdown_nohz(unsigned int *cpup) > +{ > + struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); > + > + memset(ts, 0, sizeof(*ts)); > +} > + > #else > > static inline void tick_nohz_switch_to_nohz(void) { } -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html