Re: [patch 3/3] nohz/s390: fix arch_needs_cpu() return value onoffline cpus
From: Peter Zijlstra
Date: Wed Dec 01 2010 - 07:20:23 EST
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@xxxxxxxxxx>
>
> 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@xxxxxxxxxx
> Signed-off-by: Heiko Carstens <heiko.carstens@xxxxxxxxxx>
> ---
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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/