[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1291205949.32004.1398.camel@laptop>
Date: Wed, 01 Dec 2010 13:19:09 +0100
From: Peter Zijlstra <a.p.zijlstra@...llo.nl>
To: Heiko Carstens <heiko.carstens@...ibm.com>
Cc: Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...e.hu>,
Martin Schwidefsky <schwidefsky@...ibm.com>,
linux-kernel@...r.kernel.org,
Christof Schmitt <christof.schmitt@...ibm.com>,
Frank Blaschka <frank.blaschka@...ibm.com>,
Horst Hartmann <horsth@...ux.vnet.ibm.com>, stable@...nel.org
Subject: Re: [patch 3/3] nohz/s390: fix arch_needs_cpu() return value on
offline cpus
On Wed, 2010-12-01 at 10:11 +0100, Heiko Carstens wrote:
>
> Subject: [PATCH] nohz: fix get_next_timer_interrupt() vs cpu hotplug
>
> From: Heiko Carstens <heiko.carstens@...ibm.com>
>
> This fixes a bug as seen on 2.6.32 based kernels where timers got enqueued
> on offline cpus.
>
> If a cpu goes offline it might still have pending timers. These will be
> migrated during CPU_DEAD handling after the cpu is offline.
> However while the cpu is going offline it will schedule the idle task
> which will then call tick_nohz_stop_sched_tick().
> That function in turn will call get_next_timer_intterupt() to figure out
> if the tick of the cpu can be stopped or not. If it turns out that the
> next tick is just one jiffy off (delta_jiffies == 1)
> tick_nohz_stop_sched_tick() incorrectly assumes that the tick should not
> stop and takes an early exit and thus it won't update the load balancer
> cpu.
> Just afterwards the cpu will be killed and the load balancer cpu could
> be the offline cpu.
> On 2.6.32 based kernel get_nohz_load_balancer() gets called to decide on
> which cpu a timer should be enqueued (see __mod_timer()). Which leads
> to the possibility that timers get enqueued on an offline cpu. These will
> never expire and can cause a system hang.
>
> This has been observed 2.6.32 kernels. On current kernels __mod_timer() uses
> get_nohz_timer_target() which doesn't have that problem. However there might
> be other problems because of the too early exit tick_nohz_stop_sched_tick()
> in case a cpu goes offline.
>
> The easiest and probably safest fix seems to be to let
> get_next_timer_interrupt() just lie and let it say there isn't any pending
> timer if the current cpu is offline.
> I also thought of moving migrate_[hr]timers() from CPU_DEAD to CPU_DYING,
> but seeing that there already have been fixes at least in the hrtimer code
> in this area I'm afraid that this could add new subtle bugs.
>
> Cc: stable@...nel.org
> Signed-off-by: Heiko Carstens <heiko.carstens@...ibm.com>
> ---
Thanks Heiko, I queued this one as well.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists