lkml.org 
[lkml]   [2018]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 14/74] Prevent timer value 0 for MWAITX
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com>

    commit 88d879d29f9cc0de2d930b584285638cdada6625 upstream.

    Newer hardware has uncovered a bug in the software implementation of
    using MWAITX for the delay function. A value of 0 for the timer is meant
    to indicate that a timeout will not be used to exit MWAITX. On newer
    hardware this can result in MWAITX never returning, resulting in NMI
    soft lockup messages being printed. On older hardware, some of the other
    conditions under which MWAITX can exit masked this issue. The AMD APM
    does not currently document this and will be updated.

    Please refer to http://marc.info/?l=kvm&m=148950623231140 for
    information regarding NMI soft lockup messages on an AMD Ryzen 1800X.
    This has been root-caused as a 0 passed to MWAITX causing it to wait
    indefinitely.

    This change has the added benefit of avoiding the unnecessary setup of
    MONITORX/MWAITX when the delay value is zero.

    Signed-off-by: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com>
    Link: http://lkml.kernel.org/r/1493156643-29366-1-git-send-email-Janakarajan.Natarajan@amd.com
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/lib/delay.c | 7 +++++++
    1 file changed, 7 insertions(+)

    --- a/arch/x86/lib/delay.c
    +++ b/arch/x86/lib/delay.c
    @@ -93,6 +93,13 @@ static void delay_mwaitx(unsigned long _
    {
    u64 start, end, delay, loops = __loops;

    + /*
    + * Timer value of 0 causes MWAITX to wait indefinitely, unless there
    + * is a store on the memory monitored by MONITORX.
    + */
    + if (loops == 0)
    + return;
    +
    start = rdtsc_ordered();

    for (;;) {

    \
     
     \ /
      Last update: 2018-01-29 22:15    [W:4.131 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site