• H
    x86, mce: fix a race condition in mce_read() · ef41df43
    Huang Ying 提交于
    Impact: bugfix
    
    Considering the situation as follow:
    
    before: mcelog.next == 1, mcelog.entry[0].finished = 1
    
    +--------------------------------------------------------------------------
    R                   W1                  W2                  W3
    
    read mcelog.next (1)
                        mcelog.next++ (2)
                        (working on entry 1,
                        finished == 0)
    
    mcelog.next = 0
                                            mcelog.next++ (1)
                                            (working on entry 0)
                                                               mcelog.next++ (2)
                                                               (working on entry 1)
                            <----------------- race ---------------->
                        (done on entry 1,
                        finished = 1)
                                                               (done on entry 1,
                                                               finished = 1)
    
    To fix the race condition, a cmpxchg loop is added to mce_read() to
    ensure no new MCE record can be added between mcelog.next reading and
    mcelog.next = 0.
    Signed-off-by: NHuang Ying <ying.huang@intel.com>
    Signed-off-by: NAndi Kleen <ak@linux.intel.com>
    Acked-by: NThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: NH. Peter Anvin <hpa@zytor.com>
    ef41df43
mce_64.c 23.4 KB