Messages in this thread |  | | | Date | Thu, 6 Nov 2008 11:15:36 -0500 | | From | Neil Horman <> | | Subject | Re: [PATCH] x86: call machine_shutdown and stop all CPUs in native_machine_halt |
| |
On Thu, Nov 06, 2008 at 05:10:01PM +0100, Ivan Vecera wrote: > Any comments? > > Ivan > Acked-by: Neil Horman <nhorman@tuxdriver.com>
> --- > Ivan Vecera wrote: > > Ingo Molnar wrote: > >> the code in arch/x86/kernel/smp.c::stop_this_cpu() is very similar to > >> this and could be shared. You could move the stop_this_cpu() function to > >> arch/x86/kernel/process.c (out of smp.c), so that it can be used by > >> reboot.c. > >> > > Yes, this make sense. Here is the patch. > > > > Ivan > > > > --- > > arch/x86/kernel/process.c | 16 ++++++++++++++++ > > arch/x86/kernel/reboot.c | 5 +++++ > > arch/x86/kernel/smp.c | 13 ------------- > > include/asm-x86/system.h | 2 ++ > > 4 files changed, 23 insertions(+), 13 deletions(-) > > > > diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c > > index c622772..af6904e 100644 > > --- a/arch/x86/kernel/process.c > > +++ b/arch/x86/kernel/process.c > > @@ -8,6 +8,7 @@ > > #include <linux/pm.h> > > #include <linux/clockchips.h> > > #include <asm/system.h> > > +#include <asm/apic.h> > > > > unsigned long idle_halt; > > EXPORT_SYMBOL(idle_halt); > > @@ -122,6 +123,21 @@ void default_idle(void) > > EXPORT_SYMBOL(default_idle); > > #endif > > > > +void stop_this_cpu(void *dummy) > > +{ > > + local_irq_disable(); > > + /* > > + * Remove this CPU: > > + */ > > + cpu_clear(smp_processor_id(), cpu_online_map); > > +#ifdef CONFIG_X86_LOCAL_APIC > > + disable_local_APIC(); > > +#endif > > + if (hlt_works(smp_processor_id())) > > + for (;;) halt(); > > + for (;;); > > +} > > + > > static void do_nothing(void *unused) > > { > > } > > diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c > > index f4c93f1..3113d9e 100644 > > --- a/arch/x86/kernel/reboot.c > > +++ b/arch/x86/kernel/reboot.c > > @@ -465,6 +465,11 @@ static void native_machine_restart(char *__unused) > > > > static void native_machine_halt(void) > > { > > + /* stop other cpus and apics */ > > + machine_shutdown(); > > + > > + /* stop this cpu */ > > + stop_this_cpu(NULL); > > } > > > > static void native_machine_power_off(void) > > diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c > > index 18f9b19..3f92b13 100644 > > --- a/arch/x86/kernel/smp.c > > +++ b/arch/x86/kernel/smp.c > > @@ -140,19 +140,6 @@ void native_send_call_func_ipi(cpumask_t mask) > > send_IPI_mask(mask, CALL_FUNCTION_VECTOR); > > } > > > > -static void stop_this_cpu(void *dummy) > > -{ > > - local_irq_disable(); > > - /* > > - * Remove this CPU: > > - */ > > - cpu_clear(smp_processor_id(), cpu_online_map); > > - disable_local_APIC(); > > - if (hlt_works(smp_processor_id())) > > - for (;;) halt(); > > - for (;;); > > -} > > - > > /* > > * this function calls the 'stop' function on all other CPUs in the system. > > */ > > diff --git a/include/asm-x86/system.h b/include/asm-x86/system.h > > index b20c894..17ac753 100644 > > --- a/include/asm-x86/system.h > > +++ b/include/asm-x86/system.h > > @@ -314,6 +314,8 @@ extern void free_init_pages(char *what, unsigned long begin, unsigned long end); > > > > void default_idle(void); > > > > +void stop_this_cpu(void *dummy); > > + > > /* > > * Force strict CPU ordering. > > * And yes, this is required on UP too when we're talking >
-- /*************************************************** *Neil Horman *Senior Software Engineer *Red Hat, Inc. *nhorman@redhat.com *gpg keyid: 1024D / 0x92A74FA1 *http://pgp.mit.edu ***************************************************/
|  |