467 lines
13 KiB
Diff
467 lines
13 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/4.0/patches-4.0.5-rt3.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-hisi/platmcpm.c | 26 +++++++++++++-------------
|
|
arch/arm/mach-omap2/omap-smp.c | 10 +++++-----
|
|
arch/arm/mach-prima2/platsmp.c | 10 +++++-----
|
|
arch/arm/mach-qcom/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 +++++-----
|
|
9 files changed, 54 insertions(+), 54 deletions(-)
|
|
|
|
--- a/arch/arm/mach-exynos/platsmp.c
|
|
+++ b/arch/arm/mach-exynos/platsmp.c
|
|
@@ -251,7 +251,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)
|
|
{
|
|
@@ -264,8 +264,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)
|
|
@@ -279,7 +279,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
|
|
@@ -306,7 +306,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;
|
|
}
|
|
}
|
|
@@ -362,7 +362,7 @@ static int exynos_boot_secondary(unsigne
|
|
* calibrations, then wait for it to finish
|
|
*/
|
|
fail:
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
|
|
return pen_release != -1 ? ret : 0;
|
|
}
|
|
--- a/arch/arm/mach-hisi/platmcpm.c
|
|
+++ b/arch/arm/mach-hisi/platmcpm.c
|
|
@@ -57,7 +57,7 @@
|
|
|
|
static void __iomem *sysctrl, *fabric;
|
|
static int hip04_cpu_table[HIP04_MAX_CLUSTERS][HIP04_MAX_CPUS_PER_CLUSTER];
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
static u32 fabric_phys_addr;
|
|
/*
|
|
* [0]: bootwrapper physical address
|
|
@@ -104,7 +104,7 @@ static int hip04_mcpm_power_up(unsigned
|
|
if (cluster >= HIP04_MAX_CLUSTERS || cpu >= HIP04_MAX_CPUS_PER_CLUSTER)
|
|
return -EINVAL;
|
|
|
|
- spin_lock_irq(&boot_lock);
|
|
+ raw_spin_lock_irq(&boot_lock);
|
|
|
|
if (hip04_cpu_table[cluster][cpu])
|
|
goto out;
|
|
@@ -133,7 +133,7 @@ static int hip04_mcpm_power_up(unsigned
|
|
udelay(20);
|
|
out:
|
|
hip04_cpu_table[cluster][cpu]++;
|
|
- spin_unlock_irq(&boot_lock);
|
|
+ raw_spin_unlock_irq(&boot_lock);
|
|
|
|
return 0;
|
|
}
|
|
@@ -149,7 +149,7 @@ static void hip04_mcpm_power_down(void)
|
|
|
|
__mcpm_cpu_going_down(cpu, cluster);
|
|
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
BUG_ON(__mcpm_cluster_state(cluster) != CLUSTER_UP);
|
|
hip04_cpu_table[cluster][cpu]--;
|
|
if (hip04_cpu_table[cluster][cpu] == 1) {
|
|
@@ -162,7 +162,7 @@ static void hip04_mcpm_power_down(void)
|
|
|
|
last_man = hip04_cluster_is_down(cluster);
|
|
if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) {
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
/* Since it's Cortex A15, disable L2 prefetching. */
|
|
asm volatile(
|
|
"mcr p15, 1, %0, c15, c0, 3 \n\t"
|
|
@@ -173,7 +173,7 @@ static void hip04_mcpm_power_down(void)
|
|
hip04_set_snoop_filter(cluster, 0);
|
|
__mcpm_outbound_leave_critical(cluster, CLUSTER_DOWN);
|
|
} else {
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
v7_exit_coherency_flush(louis);
|
|
}
|
|
|
|
@@ -192,7 +192,7 @@ static int hip04_mcpm_wait_for_powerdown
|
|
cpu >= HIP04_MAX_CPUS_PER_CLUSTER);
|
|
|
|
count = TIMEOUT_MSEC / POLL_MSEC;
|
|
- spin_lock_irq(&boot_lock);
|
|
+ raw_spin_lock_irq(&boot_lock);
|
|
for (tries = 0; tries < count; tries++) {
|
|
if (hip04_cpu_table[cluster][cpu]) {
|
|
ret = -EBUSY;
|
|
@@ -202,10 +202,10 @@ static int hip04_mcpm_wait_for_powerdown
|
|
data = readl_relaxed(sysctrl + SC_CPU_RESET_STATUS(cluster));
|
|
if (data & CORE_WFI_STATUS(cpu))
|
|
break;
|
|
- spin_unlock_irq(&boot_lock);
|
|
+ raw_spin_unlock_irq(&boot_lock);
|
|
/* Wait for clean L2 when the whole cluster is down. */
|
|
msleep(POLL_MSEC);
|
|
- spin_lock_irq(&boot_lock);
|
|
+ raw_spin_lock_irq(&boot_lock);
|
|
}
|
|
if (tries >= count)
|
|
goto err;
|
|
@@ -220,10 +220,10 @@ static int hip04_mcpm_wait_for_powerdown
|
|
}
|
|
if (tries >= count)
|
|
goto err;
|
|
- spin_unlock_irq(&boot_lock);
|
|
+ raw_spin_unlock_irq(&boot_lock);
|
|
return 0;
|
|
err:
|
|
- spin_unlock_irq(&boot_lock);
|
|
+ raw_spin_unlock_irq(&boot_lock);
|
|
return ret;
|
|
}
|
|
|
|
@@ -235,10 +235,10 @@ static void hip04_mcpm_powered_up(void)
|
|
cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
|
|
cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
|
|
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
if (!hip04_cpu_table[cluster][cpu])
|
|
hip04_cpu_table[cluster][cpu] = 1;
|
|
- spin_unlock(&boot_lock);
|
|
+ raw_spin_unlock(&boot_lock);
|
|
}
|
|
|
|
static void __naked hip04_mcpm_power_up_setup(unsigned int affinity_level)
|
|
--- a/arch/arm/mach-omap2/omap-smp.c
|
|
+++ b/arch/arm/mach-omap2/omap-smp.c
|
|
@@ -43,7 +43,7 @@
|
|
/* 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)
|
|
{
|
|
@@ -74,8 +74,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)
|
|
@@ -89,7 +89,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.
|
|
@@ -166,7 +166,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
|
|
@@ -22,7 +22,7 @@
|
|
|
|
static void __iomem *clk_base;
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static void sirfsoc_secondary_init(unsigned int cpu)
|
|
{
|
|
@@ -36,8 +36,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 const struct of_device_id clk_ids[] = {
|
|
@@ -75,7 +75,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
|
|
@@ -107,7 +107,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-qcom/platsmp.c
|
|
+++ b/arch/arm/mach-qcom/platsmp.c
|
|
@@ -46,7 +46,7 @@
|
|
|
|
extern void secondary_startup_arm(void);
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
static void __ref qcom_cpu_die(unsigned int cpu)
|
|
@@ -60,8 +60,8 @@ static void qcom_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 int scss_release_secondary(unsigned int cpu)
|
|
@@ -284,7 +284,7 @@ static int qcom_boot_secondary(unsigned
|
|
* set synchronisation state between this boot processor
|
|
* and the secondary one
|
|
*/
|
|
- spin_lock(&boot_lock);
|
|
+ raw_spin_lock(&boot_lock);
|
|
|
|
/*
|
|
* Send the secondary CPU a soft interrupt, thereby causing
|
|
@@ -297,7 +297,7 @@ static int qcom_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 ret;
|
|
}
|
|
--- a/arch/arm/mach-spear/platsmp.c
|
|
+++ b/arch/arm/mach-spear/platsmp.c
|
|
@@ -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);
|
|
|
|
static void __iomem *scu_base = IOMEM(VA_SCU_BASE);
|
|
|
|
@@ -47,8 +47,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)
|
|
@@ -59,7 +59,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
|
|
@@ -84,7 +84,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
|
|
@@ -34,7 +34,7 @@ static void write_pen_release(int val)
|
|
sync_cache_w(&pen_release);
|
|
}
|
|
|
|
-static DEFINE_SPINLOCK(boot_lock);
|
|
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
|
|
|
static void sti_secondary_init(unsigned int cpu)
|
|
{
|
|
@@ -49,8 +49,8 @@ static void sti_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 int sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|
@@ -61,7 +61,7 @@ static int sti_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
|
|
@@ -92,7 +92,7 @@ static int sti_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-ux500/platsmp.c
|
|
+++ b/arch/arm/mach-ux500/platsmp.c
|
|
@@ -51,7 +51,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)
|
|
{
|
|
@@ -64,8 +64,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)
|
|
@@ -76,7 +76,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
|
|
@@ -97,7 +97,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
|
|
@@ -30,7 +30,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)
|
|
{
|
|
@@ -43,8 +43,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)
|
|
@@ -55,7 +55,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
|
|
@@ -85,7 +85,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;
|
|
}
|