• Olof Johansson's avatar
    [PATCH] PPC64: Remove hot busy-wait loop in __hash_page · d03853d5
    Olof Johansson authored
    It turns out that our current __hash_page code will do a very hot busy-wait
    loop waiting on _PAGE_BUSY to be cleared.  It even does ldarx/stdcx in the
    loop, which will bounce reservations around like crazy if there's more than
    one CPU spinning on the same PTE (or even another PTE in the same
    reservation granule).  The end result is that each fault takes longer when
    there's contention, which in turn increases the chance of another thread
    hitting the same fault and also piling up.  Not pretty.
    
    There's two options here:
    1. Do an out-of-line busy loop a'la spinlocks with just loads (no
       reserves)
    2. Just bail and refault if needed.
    
    (2) makes sense here: If the PTE is busy, chances are it's in flux anyway
    and the other code path making a change might just be ready to hash it.
    
    This fixes a stampede seen on a large-ish system where a multithreaded
    HPC app faults in the same text pages on several cpus at the same time.
    Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
    Cc: Paul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    d03853d5
hash_low.S 7.26 KB