• Vitaly Wool's avatar
    z3fold: fix page locking in z3fold_alloc() · 76e32a2a
    Vitaly Wool authored
    Stress testing of the current z3fold implementation on a 8-core system
    revealed it was possible that a z3fold page deleted from its unbuddied
    list in z3fold_alloc() would be put on another unbuddied list by
    z3fold_free() while z3fold_alloc() is still processing it.  This has
    been introduced with commit 5a27aa82 ("z3fold: add kref refcounting")
    due to the removal of special handling of a z3fold page not on any list
    in z3fold_free().
    
    To fix this, the z3fold page lock should be taken in z3fold_alloc()
    before the pool lock is released.  To avoid deadlocking, we just try to
    lock the page as soon as we get a hold of it, and if trylock fails, we
    drop this page and take the next one.
    Signed-off-by: default avatarVitaly Wool <vitalywool@gmail.com>
    Cc: Dan Streetman <ddstreet@ieee.org>
    Cc: <Oleksiy.Avramchenko@sony.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    76e32a2a
z3fold.c 23.8 KB