|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Re: [PATCH] Fix cache flush bug of cpu offline
On 11/03/2011 14:34, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> wrote:
> Fix cache flush bug of cpu offline
>
> Current xen cpu offline logic flush cache too early, which potentially break
> cache coherency.
> wbinvd should be the last ops before cpu going into dead, otherwise cache may
> be dirty,
> i.e, something like setting an A bit on page tables. Pointed out by Arjan van
> de Ven.
The position still seems a bit arbitrary. In the first hunk below, why is it
safe to wbinvd() outside the for-loop and before reading cx->entry_method,
but not before reading from processor_powers[]? It would be neater if we
could put the wbinvd() in a wrapper function for calling *dead_idle.
-- Keir
> Signed-off-by: Liu, Jinsong <jinsong.liu@xxxxxxxxx>
>
> diff -r 2dc3c1cc1bba xen/arch/x86/acpi/cpu_idle.c
> --- a/xen/arch/x86/acpi/cpu_idle.c Mon Mar 07 05:31:46 2022 +0800
> +++ b/xen/arch/x86/acpi/cpu_idle.c Thu Mar 10 23:40:51 2022 +0800
> @@ -562,11 +562,14 @@ static void acpi_dead_idle(void)
> if ( (cx = &power->states[power->count-1]) == NULL )
> goto default_halt;
>
> + /*
> + * cache must be flashed as the last ops before cpu going into dead,
> + * otherwise, cpu may dead with dirty data breaking cache coherency,
> + * leading to strange errors.
> + */
> + wbinvd();
> for ( ; ; )
> {
> - if ( !power->flags.bm_check && cx->type == ACPI_STATE_C3 )
> - ACPI_FLUSH_CPU_CACHE();
> -
> switch ( cx->entry_method )
> {
> case ACPI_CSTATE_EM_FFH:
> @@ -584,6 +587,7 @@ static void acpi_dead_idle(void)
> }
>
> default_halt:
> + wbinvd();
> for ( ; ; )
> halt();
> }
> diff -r 2dc3c1cc1bba xen/arch/x86/domain.c
> --- a/xen/arch/x86/domain.c Mon Mar 07 05:31:46 2022 +0800
> +++ b/xen/arch/x86/domain.c Thu Mar 10 23:40:51 2022 +0800
> @@ -93,6 +93,12 @@ static void default_idle(void)
>
> static void default_dead_idle(void)
> {
> + /*
> + * cache must be flashed as the last ops before cpu going into dead,
> + * otherwise, cpu may dead with dirty data breaking cache coherency,
> + * leading to strange errors.
> + */
> + wbinvd();
> for ( ; ; )
> halt();
> }
> @@ -100,7 +106,6 @@ static void play_dead(void)
> static void play_dead(void)
> {
> local_irq_disable();
> - wbinvd();
>
> /*
> * NOTE: After cpu_exit_clear, per-cpu variables are no longer
> accessible,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |