• Nikolay Borisov's avatar
    btrfs: Relax memory barrier in btrfs_tree_unlock · 2e32ef87
    Nikolay Borisov authored
    When performing an unlock on an extent buffer we'd like to order the
    decrement of extent_buffer::blocking_writers with waking up any
    waiters. In such situations it's sufficient to use smp_mb__after_atomic
    rather than the heavy smp_mb. On architectures where atomic operations
    are fully ordered (such as x86 or s390) unconditionally executing
    a heavyweight smp_mb instruction causes a severe hit to performance
    while bringin no improvements in terms of correctness.
    
    The better thing is to use the appropriate smp_mb__after_atomic routine
    which will do the correct thing (invoke a full smp_mb or in the case
    of ordered atomics insert a compiler barrier). Put another way,
    an RMW atomic op + smp_load__after_atomic equals, in terms of
    semantics, to a full smp_mb. This ensures that none of the problems
    described in the accompanying comment of waitqueue_active occur.
    No functional changes.
    Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    2e32ef87
locking.c 8.35 KB