Messages in this thread | | | Date | Wed, 10 Dec 2014 01:12:39 +0100 | From | Oleg Nesterov <> | Subject | Re: [PATCH v3] CPU hotplug: active_writer not woken up in some cases - deadlock |
| |
(sorry if this was already discussed, I ignored most of my emails I got this week)
On 12/09, David Hildenbrand wrote: > > @@ -116,7 +118,13 @@ void put_online_cpus(void) > if (cpu_hotplug.active_writer == current) > return; > if (!mutex_trylock(&cpu_hotplug.lock)) { > + /* inc before testing for active_writer to not lose wake ups */ > atomic_inc(&cpu_hotplug.puts_pending); > + spin_lock(&cpu_hotplug.awr_lock); > + /* we might be the last one */ > + if (unlikely(cpu_hotplug.active_writer)) > + wake_up_process(cpu_hotplug.active_writer); > + spin_unlock(&cpu_hotplug.awr_lock);
Not sure I understand. awr_lock can only ensure that active_writer can't go away.
Why active_writer should see .puts_pending != 0 if this is called right after cpu_hotplug_begin() takes cpu_hotplug.lock but before it sets TASK_UNINTERRUPTIBLE?
IOW,
> void cpu_hotplug_begin(void) > { > + spin_lock(&cpu_hotplug.awr_lock); > cpu_hotplug.active_writer = current; > + spin_unlock(&cpu_hotplug.awr_lock); > > cpuhp_lock_acquire(); > for (;;) { > mutex_lock(&cpu_hotplug.lock); > + __set_current_state(TASK_UNINTERRUPTIBLE);
don't we need set_current_state() here ?
Oleg.
| |