• Russ Anderson's avatar
    [IA64] Support multiple CPUs going through OS_MCA · 1612b18c
    Russ Anderson authored
    Linux does not gracefully deal with multiple processors going
    through OS_MCA aa part of the same MCA event.  The first cpu
    into OS_MCA grabs the ia64_mca_serialize lock.  Subsequent
    cpus wait for that lock, preventing them from reporting in as
    rendezvoused.  The first cpu waits 5 seconds then complains
    that all the cpus have not rendezvoused.  The first cpu then
    handles its MCA and frees up all the rendezvoused cpus and
    releases the ia64_mca_serialize lock.  One of the subsequent
    cpus going thought OS_MCA then gets the ia64_mca_serialize
    lock, waits another 5 seconds and then complains that none of
    the other cpus have rendezvoused.
    
    This patch allows multiple CPUs to gracefully go through OS_MCA.
    
    The first CPU into ia64_mca_handler() grabs a mca_count lock.
    Subsequent CPUs into ia64_mca_handler() are added to a list of cpus
    that need to go through OS_MCA (a bit set in mca_cpu), and report
    in as rendezvoused, and but spin waiting their turn.
    
    The first CPU sees everyone rendezvous, handles his MCA, wakes up
    one of the other CPUs waiting to process their MCA (by clearing
    one mca_cpu bit), and then waits for the other cpus to complete
    their MCA handling.  The next CPU handles his MCA and the process
    repeats until all the CPUs have handled their MCA.  When the last
    CPU has handled it's MCA, it sets monarch_cpu to -1, releasing all
    the CPUs.
    
    In testing this works more reliably and faster.
    
    Thanks to Keith Owens for suggesting numerous improvements
    to this code.
    Signed-off-by: default avatarRuss Anderson <rja@sgi.com>
    Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
    1612b18c
mca.h 5.4 KB