x86, mce: fix a race condition in mce_read()
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:  Huang Ying <ying.huang@intel.com>
Signed-off-by:
Huang Ying <ying.huang@intel.com>
Signed-off-by:  Andi Kleen <ak@linux.intel.com>
Acked-by:
Andi Kleen <ak@linux.intel.com>
Acked-by:  Thomas Gleixner <tglx@linutronix.de>
Signed-off-by:
Thomas Gleixner <tglx@linutronix.de>
Signed-off-by:  H. Peter Anvin <hpa@zytor.com>
H. Peter Anvin <hpa@zytor.com>
Loading
Please register or sign in to comment
