 
	
| [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 16:50, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> wrote:
> we did experiment, if did wbinvd at current position (at play_dead), sometimes
> it bring strange issue when repeatly cpu offline/online.
> so for cpu dead, the near wbinvd to last step, the safer.
> wbinvd would better be the last ops before cpu dead, to avoid potential cache
> coherency break.
Okay, I applied your patches. However in a follow-up patch (c/s 23025) I
have removed the WBINVD instructions from the default paths (i.e., the HLT
loops) as the CPU still does cache coherency while in HLT/C1 state.
Does that look okay to you?
 -- Keir
> In fact, it can do wbinvd inside loop, but as cpu_offline_3.patch said,
> at Xen 7400 when hyperthreading, the offlined thread may be spuriously waken
> up by its brother, and frequently waken inside the dead loop.
> In such case, considering heavy workload of wbinvd, we add a light-weight
> clflush instruction inside loop.
> 
> Thanks,
> Jinsong
> 
> 
>> 
>>> 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 |