Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 830eec24 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Russell King
Browse files

ARM: versatile: convert boot_lock to raw



The arm boot_lock is used by the secondary processor startup code.  The locking
task is the idle thread, which has idle->sched_class == &idle_sched_class.
idle_sched_class->enqueue_task == NULL, so if the idle task blocks on the
lock, the attempt to wake it when the lock becomes available will fail:

try_to_wake_up()
   ...
      activate_task()
         enqueue_task()
            p->sched_class->enqueue_task(rq, p, flags)

Fix by converting boot_lock to a raw spin lock.

Cc: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarFrank Rowand <frank.rowand@am.sony.com>
Link: http://lkml.kernel.org/r/4E77B952.3010606@am.sony.com


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 4fb68e12
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ static void write_pen_release(int val)
	sync_cache_w(&pen_release);
}

static DEFINE_SPINLOCK(boot_lock);
static DEFINE_RAW_SPINLOCK(boot_lock);

void versatile_secondary_init(unsigned int cpu)
{
@@ -45,8 +45,8 @@ void versatile_secondary_init(unsigned int cpu)
	/*
	 * Synchronise with the boot thread.
	 */
	spin_lock(&boot_lock);
	spin_unlock(&boot_lock);
	raw_spin_lock(&boot_lock);
	raw_spin_unlock(&boot_lock);
}

int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
@@ -57,7 +57,7 @@ int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
	 * Set synchronisation state between this boot processor
	 * and the secondary one
	 */
	spin_lock(&boot_lock);
	raw_spin_lock(&boot_lock);

	/*
	 * This is really belt and braces; we hold unintended secondary
@@ -87,7 +87,7 @@ int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
	 * now the secondary core is starting up let it run its
	 * calibrations, then wait for it to finish
	 */
	spin_unlock(&boot_lock);
	raw_spin_unlock(&boot_lock);

	return pen_release != -1 ? -ENOSYS : 0;
}