lkml.org 
[lkml]   [2010]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [tip:x86/idle] x86, hotplug: Move WBINVD back outside the play_dead loop
    On 09/20/2010 11:20 AM, H. Peter Anvin wrote:
    > On 09/17/2010 05:48 PM, Venkatesh Pallipadi wrote:
    >>>
    >>> + wbinvd();
    >>> +
    >>> while (1) {
    >>> - mb();
    >>> - wbinvd();
    >>> __monitor(&current_thread_info()->flags, 0, 0);
    >>> mb();
    >>
    >>
    >> Just one observation. There are some CPUs with errata that need
    >> clflush before monitor. So, if that CPU wakesup spuriously it may have
    >> problem reentering idle. Not sure whether that will be a problem as
    >> that errata also depended on read happening on the flag. May be its
    >> better to do monitor (0, 0, 0).
    >>
    >
    > It seems the easy way to deal with that would be to just add clflush
    > before monitor... it is *probably* redundant, but it should be safe to
    > do. It means depending on X86_FEATURE_CLFLUSH as well as
    > X86_FEATURE_MWAIT, but I don't think there is any x86 processor which
    > has MWAIT and not CLFLUSH, and I highly doubt there ever will be.
    >
    > Does anyone see any downside?
    >

    Patch for review... anyone see any problem with it?

    -hpa

    From 83c70ace9aad19ba7c41986f3c34a0808fbaf78f Mon Sep 17 00:00:00 2001
    From: H. Peter Anvin <hpa@linux.intel.com>
    Date: Mon, 20 Sep 2010 13:04:45 -0700
    Subject: [PATCH] x86, hotplug: In the MWAIT case of play_dead, CLFLUSH the cache line

    When we're using MWAIT for play_dead, explicitly CLFLUSH the cache
    line before executing MONITOR. This is a potential workaround for the
    Xeon 7400 erratum AAI65 after having a spurious wakeup and returning
    around the loop. "Potential" here because it is not certain that that
    erratum could actually trigger; however, the CLFLUSH should be
    harmless.

    Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
    Cc: Asit Mallick <asit.k.mallick@intel.com>
    Cc: Arjan van de Ven <arjan@linux.kernel.org>
    Cc: Len Brown <lenb@kernel.org>
    Cc: Venkatesh Pallipadi <venki@google.com>
    ---
    arch/x86/kernel/smpboot.c | 20 +++++++++++++++++++-
    1 files changed, 19 insertions(+), 1 deletions(-)

    diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
    index 55c80ffb..fdccfe9 100644
    --- a/arch/x86/kernel/smpboot.c
    +++ b/arch/x86/kernel/smpboot.c
    @@ -1394,9 +1394,12 @@ static inline void mwait_play_dead(void)
    unsigned int highest_cstate = 0;
    unsigned int highest_subcstate = 0;
    int i;
    + void *mwait_ptr;

    if (!cpu_has(&current_cpu_data, X86_FEATURE_MWAIT))
    return;
    + if (!cpu_has(&current_cpu_data, X86_FEATURE_CLFLSH))
    + return;
    if (current_cpu_data.cpuid_level < CPUID_MWAIT_LEAF)
    return;

    @@ -1422,10 +1425,25 @@ static inline void mwait_play_dead(void)
    (highest_subcstate - 1);
    }

    + /*
    + * This should be a memory location in a cache line which is
    + * unlikely to be touched by other processors. The actual
    + * content is immaterial as it is not actually modified in any way.
    + */
    + mwait_ptr = &current_thread_info()->flags;
    +
    wbinvd();

    while (1) {
    - __monitor(&current_thread_info()->flags, 0, 0);
    + /*
    + * The CLFLUSH is a workaround for erratum AAI65 for
    + * the Xeon 7400 series. It's not clear it is actually
    + * needed, but it should be harmless in either case.
    + * The WBINVD is insufficient due to the spurious-wakeup
    + * case where we return around the loop.
    + */
    + clflush(mwait_ptr);
    + __monitor(mwait_ptr, 0, 0);
    mb();
    __mwait(eax, 0);
    }
    --
    1.7.2
    \
     
     \ /
      Last update: 2010-09-20 22:15    [W:0.023 / U:29.660 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site