362 lines
10 KiB
Diff
362 lines
10 KiB
Diff
From: Frank Rowand <frank.rowand@am.sony.com>
|
|
Date: Mon, 19 Sep 2011 14:51:14 -0700
|
|
Subject: [PATCH] preempt-rt: Convert arm boot_lock to raw
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/3.12/patches-3.12.6-rt9.tar.xz
|
|
|
|
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.
|
|
|
|
Signed-off-by: Frank Rowand <frank.rowand@am.sony.com>
|
|
Link: http://lkml.kernel.org/r/4E77B952.3010606@am.sony.com
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
arch/arm/mach-exynos/platsmp.c | 12 ++++++------
|
|
arch/arm/mach-msm/platsmp.c | 10 +++++-----
|
|
arch/arm/mach-omap2/omap-smp.c | 10 +++++-----
|
|
arch/arm/mach-prima2/platsmp.c | 10 +++++-----
|
|
arch/arm/mach-spear/platsmp.c | 10 +++++-----
|
|
arch/arm/mach-sti/platsmp.c | 10 +++++-----
|
|
arch/arm/mach-ux500/platsmp.c | 10 +++++-----
|
|
arch/arm/plat-versatile/platsmp.c | 10 +++++-----
|
|
8 files changed, 41 insertions(+), 41 deletions(-)
|
|
|
|
--- a/arch/arm/mach-exynos/platsmp.c
|
|
+++ b/arch/arm/mach-exynos/platsmp.c
|
|
@@ -73,7 +73,7 @@ static void __iomem *scu_base_addr(void)
|
|
return (void __iomem *)(S5P_VA_SCU);
|
|
}
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static void exynos_secondary_init(unsigned int cpu)
|
|
{
|
|
@@ -86,8 +86,8 @@ static void exynos_secondary_init(unsign
|
|
/*
|
|
* Synchronise with the boot thread.
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|
@@ -99,7 +99,7 @@ static int exynos_boot_secondary(unsigne
|
|
* Set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* The secondary processor is waiting to be released from
|
|
@@ -128,7 +128,7 @@ static int exynos_boot_secondary(unsigne
|
|
|
|
if (timeout == 0) {
|
|
printk(KERN_ERR "cpu1 power enable failed");
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
return -ETIMEDOUT;
|
|
}
|
|
}
|
|
@@ -167,7 +167,7 @@ static int exynos_boot_secondary(unsigne
|
|
* 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;
|
|
}
|
|
--- a/arch/arm/mach-msm/platsmp.c
|
|
+++ b/arch/arm/mach-msm/platsmp.c
|
|
@@ -30,7 +30,7 @@
|
|
|
|
extern void msm_secondary_startup(void);
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static inline int get_core_count(void)
|
|
{
|
|
@@ -50,8 +50,8 @@ static void msm_secondary_init(unsigned
|
|
/*
|
|
* Synchronise with the boot thread.
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static void prepare_cold_cpu(unsigned int cpu)
|
|
@@ -88,7 +88,7 @@ static int msm_boot_secondary(unsigned i
|
|
* set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* The secondary processor is waiting to be released from
|
|
@@ -122,7 +122,7 @@ static int msm_boot_secondary(unsigned i
|
|
* 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;
|
|
}
|
|
--- a/arch/arm/mach-omap2/omap-smp.c
|
|
+++ b/arch/arm/mach-omap2/omap-smp.c
|
|
@@ -44,7 +44,7 @@ u16 pm44xx_errata;
|
|
/* SCU base address */
|
|
static void __iomem *scu_base;
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
void __iomem *omap4_get_scu_base(void)
|
|
{
|
|
@@ -68,8 +68,8 @@ static void omap4_secondary_init(unsigne
|
|
/*
|
|
* Synchronise with the boot thread.
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static int omap4_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|
@@ -83,7 +83,7 @@ static int omap4_boot_secondary(unsigned
|
|
* Set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* Update the AuxCoreBoot0 with boot state for secondary core.
|
|
@@ -160,7 +160,7 @@ static int omap4_boot_secondary(unsigned
|
|
* 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 0;
|
|
}
|
|
--- a/arch/arm/mach-prima2/platsmp.c
|
|
+++ b/arch/arm/mach-prima2/platsmp.c
|
|
@@ -23,7 +23,7 @@
|
|
static void __iomem *scu_base;
|
|
static void __iomem *rsc_base;
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static struct map_desc scu_io_desc __initdata = {
|
|
.length = SZ_4K,
|
|
@@ -56,8 +56,8 @@ static void sirfsoc_secondary_init(unsig
|
|
/*
|
|
* Synchronise with the boot thread.
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static struct of_device_id rsc_ids[] = {
|
|
@@ -95,7 +95,7 @@ static int sirfsoc_boot_secondary(unsign
|
|
/* make sure write buffer is drained */
|
|
mb();
|
|
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* The secondary processor is waiting to be released from
|
|
@@ -128,7 +128,7 @@ static int sirfsoc_boot_secondary(unsign
|
|
* 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;
|
|
}
|
|
--- a/arch/arm/mach-spear/platsmp.c
|
|
+++ b/arch/arm/mach-spear/platsmp.c
|
|
@@ -20,7 +20,7 @@
|
|
#include <mach/spear.h>
|
|
#include "generic.h"
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static void __iomem *scu_base = IOMEM(VA_SCU_BASE);
|
|
|
|
@@ -36,8 +36,8 @@ static void spear13xx_secondary_init(uns
|
|
/*
|
|
* Synchronise with the boot thread.
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|
@@ -48,7 +48,7 @@ static int spear13xx_boot_secondary(unsi
|
|
* set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* The secondary processor is waiting to be released from
|
|
@@ -75,7 +75,7 @@ static int spear13xx_boot_secondary(unsi
|
|
* 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;
|
|
}
|
|
--- a/arch/arm/mach-sti/platsmp.c
|
|
+++ b/arch/arm/mach-sti/platsmp.c
|
|
@@ -35,7 +35,7 @@ static void write_pen_release(int val)
|
|
outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1));
|
|
}
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
void sti_secondary_init(unsigned int cpu)
|
|
{
|
|
@@ -50,8 +50,8 @@ void sti_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 sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|
@@ -62,7 +62,7 @@ int sti_boot_secondary(unsigned int cpu,
|
|
* set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* The secondary processor is waiting to be released from
|
|
@@ -93,7 +93,7 @@ int sti_boot_secondary(unsigned int cpu,
|
|
* 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;
|
|
}
|
|
--- a/arch/arm/mach-ux500/platsmp.c
|
|
+++ b/arch/arm/mach-ux500/platsmp.c
|
|
@@ -52,7 +52,7 @@ static void __iomem *scu_base_addr(void)
|
|
return NULL;
|
|
}
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static void ux500_secondary_init(unsigned int cpu)
|
|
{
|
|
@@ -65,8 +65,8 @@ static void ux500_secondary_init(unsigne
|
|
/*
|
|
* Synchronise with the boot thread.
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static int ux500_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|
@@ -77,7 +77,7 @@ static int ux500_boot_secondary(unsigned
|
|
* set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* The secondary processor is waiting to be released from
|
|
@@ -98,7 +98,7 @@ static int ux500_boot_secondary(unsigned
|
|
* 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;
|
|
}
|
|
--- a/arch/arm/plat-versatile/platsmp.c
|
|
+++ b/arch/arm/plat-versatile/platsmp.c
|
|
@@ -31,7 +31,7 @@ static void write_pen_release(int val)
|
|
outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1));
|
|
}
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
void versatile_secondary_init(unsigned int cpu)
|
|
{
|
|
@@ -44,8 +44,8 @@ void versatile_secondary_init(unsigned i
|
|
/*
|
|
* 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)
|
|
@@ -56,7 +56,7 @@ int versatile_boot_secondary(unsigned in
|
|
* 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
|
|
@@ -86,7 +86,7 @@ int versatile_boot_secondary(unsigned in
|
|
* 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;
|
|
}
|