| From: Frank Rowand <frank.rowand@am.sony.com> |
| Date: Mon, 19 Sep 2011 14:51:14 -0700 |
| Subject: arm: Convert arm 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. |
| |
| 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 |
| @@ -231,7 +231,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) |
| { |
| @@ -244,8 +244,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) |
| @@ -259,7 +259,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 |
| @@ -286,7 +286,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; |
| } |
| } |
| @@ -342,7 +342,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; |
| } |