Re: [PATCH] x86: call machine_shutdown and stop all CPUs in native_machine_halt

From: Neil Horman
Date: Thu Nov 06 2008 - 11:16:16 EST


On Thu, Nov 06, 2008 at 05:10:01PM +0100, Ivan Vecera wrote:
> Any comments?
>
> Ivan
>
Acked-by: Neil Horman <nhorman@xxxxxxxxxxxxx>

> ---
> 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@xxxxxxxxxx
*gpg keyid: 1024D / 0x92A74FA1
*http://pgp.mit.edu
***************************************************/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/