diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-11-30 11:07:35 +0000 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-12-20 15:09:10 +0000 | 
| commit | 3c030beabf937b1d3b4ecaedfd1fb2f1e2aa0c70 (patch) | |
| tree | 3cac64838c83ecc2d0d070be268fb087dffd8d4b | |
| parent | 2c0136dba4e43b0916ccc9ecc7f11e6d6b73f046 (diff) | |
| download | olio-linux-3.10-3c030beabf937b1d3b4ecaedfd1fb2f1e2aa0c70.tar.xz olio-linux-3.10-3c030beabf937b1d3b4ecaedfd1fb2f1e2aa0c70.zip | |
ARM: CPU hotplug: move cpu_killed completion to core code
We always need to wait for the dying CPU to reach a safe state before
taking it down, irrespective of the requirements of the platform.
Move the completion code into the ARM SMP hotplug code rather than
having each platform re-implement this.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/kernel/smp.c | 14 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-hotplug.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-realview/hotplug.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-s5pv310/hotplug.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-tegra/hotplug.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-ux500/hotplug.c | 8 | 
6 files changed, 19 insertions, 35 deletions
| diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index a30c4094db3..8c81ff9b373 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -24,6 +24,7 @@  #include <linux/irq.h>  #include <linux/percpu.h>  #include <linux/clockchips.h> +#include <linux/completion.h>  #include <asm/atomic.h>  #include <asm/cacheflush.h> @@ -238,12 +239,20 @@ int __cpu_disable(void)  	return 0;  } +static DECLARE_COMPLETION(cpu_died); +  /*   * called on the thread which is asking for a CPU to be shutdown -   * waits until shutdown has completed, or it is timed out.   */  void __cpu_die(unsigned int cpu)  { +	if (!wait_for_completion_timeout(&cpu_died, msecs_to_jiffies(5000))) { +		pr_err("CPU%u: cpu didn't die\n", cpu); +		return; +	} +	printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); +  	if (!platform_cpu_kill(cpu))  		printk("CPU%u: unable to kill\n", cpu);  } @@ -263,9 +272,12 @@ void __ref cpu_die(void)  	local_irq_disable();  	idle_task_exit(); +	/* Tell __cpu_die() that this CPU is now safe to dispose of */ +	complete(&cpu_died); +  	/*  	 * actual CPU shutdown procedure is at least platform (if not -	 * CPU) specific +	 * CPU) specific.  	 */  	platform_cpu_die(cpu); diff --git a/arch/arm/mach-omap2/omap-hotplug.c b/arch/arm/mach-omap2/omap-hotplug.c index 6cee456ca54..ace979d74bf 100644 --- a/arch/arm/mach-omap2/omap-hotplug.c +++ b/arch/arm/mach-omap2/omap-hotplug.c @@ -17,16 +17,13 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> -#include <linux/completion.h>  #include <asm/cacheflush.h>  #include <mach/omap4-common.h> -static DECLARE_COMPLETION(cpu_killed); -  int platform_cpu_kill(unsigned int cpu)  { -	return wait_for_completion_timeout(&cpu_killed, 5000); +	return 1;  }  /* @@ -42,8 +39,7 @@ void platform_cpu_die(unsigned int cpu)  			   this_cpu, cpu);  		BUG();  	} -	pr_notice("CPU%u: shutdown\n", cpu); -	complete(&cpu_killed); +  	flush_cache_all();  	dsb(); diff --git a/arch/arm/mach-realview/hotplug.c b/arch/arm/mach-realview/hotplug.c index f95521a5e5c..7d58c16c83a 100644 --- a/arch/arm/mach-realview/hotplug.c +++ b/arch/arm/mach-realview/hotplug.c @@ -11,14 +11,11 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> -#include <linux/completion.h>  #include <asm/cacheflush.h>  extern volatile int pen_release; -static DECLARE_COMPLETION(cpu_killed); -  static inline void cpu_enter_lowpower(void)  {  	unsigned int v; @@ -95,7 +92,7 @@ static inline void platform_do_lowpower(unsigned int cpu)  int platform_cpu_kill(unsigned int cpu)  { -	return wait_for_completion_timeout(&cpu_killed, 5000); +	return 1;  }  /* @@ -115,9 +112,6 @@ void platform_cpu_die(unsigned int cpu)  	}  #endif -	printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); -	complete(&cpu_killed); -  	/*  	 * we're ready for shutdown now, so do it  	 */ diff --git a/arch/arm/mach-s5pv310/hotplug.c b/arch/arm/mach-s5pv310/hotplug.c index 03652c3605f..d7be70ac753 100644 --- a/arch/arm/mach-s5pv310/hotplug.c +++ b/arch/arm/mach-s5pv310/hotplug.c @@ -13,14 +13,11 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> -#include <linux/completion.h>  #include <asm/cacheflush.h>  extern volatile int pen_release; -static DECLARE_COMPLETION(cpu_killed); -  static inline void cpu_enter_lowpower(void)  {  	unsigned int v; @@ -98,7 +95,7 @@ static inline void platform_do_lowpower(unsigned int cpu)  int platform_cpu_kill(unsigned int cpu)  { -	return wait_for_completion_timeout(&cpu_killed, 5000); +	return 1;  }  /* @@ -118,9 +115,6 @@ void platform_cpu_die(unsigned int cpu)  	}  #endif -	printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); -	complete(&cpu_killed); -  	/*  	 * we're ready for shutdown now, so do it  	 */ diff --git a/arch/arm/mach-tegra/hotplug.c b/arch/arm/mach-tegra/hotplug.c index 8e7f115aa21..ecaa41ce497 100644 --- a/arch/arm/mach-tegra/hotplug.c +++ b/arch/arm/mach-tegra/hotplug.c @@ -11,12 +11,9 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> -#include <linux/completion.h>  #include <asm/cacheflush.h> -static DECLARE_COMPLETION(cpu_killed); -  static inline void cpu_enter_lowpower(void)  {  	unsigned int v; @@ -94,7 +91,7 @@ static inline void platform_do_lowpower(unsigned int cpu)  int platform_cpu_kill(unsigned int cpu)  { -	return wait_for_completion_timeout(&cpu_killed, 5000); +	return 1;  }  /* @@ -114,9 +111,6 @@ void platform_cpu_die(unsigned int cpu)  	}  #endif -	printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); -	complete(&cpu_killed); -  	/*  	 * we're ready for shutdown now, so do it  	 */ diff --git a/arch/arm/mach-ux500/hotplug.c b/arch/arm/mach-ux500/hotplug.c index b782a03024b..7a4890b96e5 100644 --- a/arch/arm/mach-ux500/hotplug.c +++ b/arch/arm/mach-ux500/hotplug.c @@ -11,14 +11,11 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/smp.h> -#include <linux/completion.h>  #include <asm/cacheflush.h>  extern volatile int pen_release; -static DECLARE_COMPLETION(cpu_killed); -  static inline void platform_do_lowpower(unsigned int cpu)  {  	flush_cache_all(); @@ -38,7 +35,7 @@ static inline void platform_do_lowpower(unsigned int cpu)  int platform_cpu_kill(unsigned int cpu)  { -	return wait_for_completion_timeout(&cpu_killed, 5000); +	return 1;  }  /* @@ -58,9 +55,6 @@ void platform_cpu_die(unsigned int cpu)  	}  #endif -	printk(KERN_NOTICE "CPU%u: shutdown\n", cpu); -	complete(&cpu_killed); -  	/* directly enter low power state, skipping secure registers */  	platform_do_lowpower(cpu);  } |