Messages in this thread |  | | | Date | Wed, 13 Aug 2008 19:38:12 +0200 | | From | Ingo Molnar <> | | Subject | Re: invalidate caches before going into suspend |
| |
* Mark Langsdorf <mark.langsdorf@amd.com> wrote:
> > to make sure the compiler doesnt ever insert something into this > > codepath? [ And note the double cli which would be further > > robustification - in theory we could get a spurious interrupt > > straight after the wbinvd. ] Hm? > > I don't think it's necessary. I can submit a delta patch later if you > think it's really necessary.
this sequence:
> diff -r 1e74a821dd00 arch/x86/kernel/process_32.c > --- a/arch/x86/kernel/process_32.c Tue Aug 12 12:04:12 2008 -0500 > +++ b/arch/x86/kernel/process_32.c Wed Aug 13 06:40:00 2008 -0500 > @@ -95,11 +95,11 @@ static inline void play_dead(void) > { > /* This must be done before dead CPU ack */ > cpu_exit_clear(); > - wbinvd(); > mb(); > /* Ack it */ > __get_cpu_var(cpu_state) = CPU_DEAD; > > + wbinvd(); > /* > * With physical CPU hotplug, we should halt the cpu > */
is still unsafe somewhat, as the cli only comes afterwards:
local_irq_disable(); while (1) halt(); so there's a small race open for some stray irq to come before the CLI.
Also, any of the primitives could be instrumented in theory and more code could be inserted - it's really the best approach to unify them into a single primitive, like the wbinvd_halt() API i suggested in the previous mail.
And it deserves a few comments as well.
Ingo
|  |