• Sebastian Andrzej Siewior's avatar
    fs/dcache: Move wakeup out of i_seq_dir write held region. · 50417d22
    Sebastian Andrzej Siewior authored
    __d_add() and __d_move() wake up waiters on dentry::d_wait from within
    the i_seq_dir write held region.  This violates the PREEMPT_RT
    constraints as the wake up acquires wait_queue_head::lock which is a
    "sleeping" spinlock on RT.
    
    There is no requirement to do so. __d_lookup_unhash() has cleared
    DCACHE_PAR_LOOKUP and dentry::d_wait and returned the now unreachable wait
    queue head pointer to the caller, so the actual wake up can be postponed
    until the i_dir_seq write side critical section is left. The only
    requirement is that dentry::lock is held across the whole sequence
    including the wake up. The previous commit includes an analysis why this
    is considered safe.
    
    Move the wake up past end_dir_add() which leaves the i_dir_seq write side
    critical section and enables preemption.
    
    For non RT kernels there is no difference because preemption is still
    disabled due to dentry::lock being held, but it shortens the time between
    wake up and unlocking dentry::lock, which reduces the contention for the
    woken up waiter.
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    50417d22
dcache.c 87 KB