Re: [2.6.33-rc5] Weird deadlock when shutting down

From: AmÃrico Wang
Date: Mon Feb 22 2010 - 03:34:46 EST


On Sun, Feb 21, 2010 at 7:22 PM, Johannes Berg
<johannes@xxxxxxxxxxxxxxxx> wrote:
> On Sun, 2010-02-21 at 12:14 +0100, Johannes Berg wrote:
>
>> Â Â Â Â printk("got cpu\n");
>> Â Â Â Â for_each_online_cpu(i) {
>> Â Â Â Â Â Â Â Â sm_work = per_cpu_ptr(stop_machine_work, i);
>> Â Â Â Â Â Â Â Â INIT_WORK(sm_work, stop_cpu);
>> Â Â Â Â Â Â Â Â queue_work_on(i, stop_machine_wq, sm_work);
>> Â Â Â Â }
>> Â Â Â Â /* This will release the thread on our CPU. */
>> Â Â Â Â put_cpu();
>> Â Â Â Â printk("put cpu\n");
>
> As odd as that may be, it hangs in put_cpu() here.
>

Hmm, does adding synchronize_sched() in _cpu_down() help?

Something like this:

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 677f253..681f5c5 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -228,6 +228,7 @@ static int __ref _cpu_down(unsigned int cpu, int
tasks_frozen)
cpumask_copy(old_allowed, &current->cpus_allowed);
set_cpus_allowed_ptr(current, cpu_active_mask);

+ synchronize_sched();
err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu));
if (err) {
set_cpu_active(cpu, true);
--
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/