lkml.org 
[lkml]   [2014]   [Dec]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [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.



\
 
 \ /
  Last update: 2014-12-10 01:41    [W:0.092 / U:0.152 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site