• Dave Chinner's avatar
    xfs: use __GFP_NOLOCKDEP instead of GFP_NOFS · 94a69db2
    Dave Chinner authored
    In the past we've had problems with lockdep false positives stemming
    from inode locking occurring in memory reclaim contexts (e.g. from
    superblock shrinkers). Lockdep doesn't know that inodes access from
    above memory reclaim cannot be accessed from below memory reclaim
    (and vice versa) but there has never been a good solution to solving
    this problem with lockdep annotations.
    
    This situation isn't unique to inode locks - buffers are also locked
    above and below memory reclaim, and we have to maintain lock
    ordering for them - and against inodes - appropriately. IOWs, the
    same code paths and locks are taken both above and below memory
    reclaim and so we always need to make sure the lock orders are
    consistent. We are spared the lockdep problems this might cause
    by the fact that semaphores and bit locks aren't covered by lockdep.
    
    In general, this sort of lockdep false positive detection is cause
    by code that runs GFP_KERNEL memory allocation with an actively
    referenced inode locked. When it is run from a transaction, memory
    allocation is automatically GFP_NOFS, so we don't have reclaim
    recursion issues. So in the places where we do memory allocation
    with inodes locked outside of a transaction, we have explicitly set
    them to use GFP_NOFS allocations to prevent lockdep false positives
    from being reported if the allocation dips into direct memory
    reclaim.
    
    More recently, __GFP_NOLOCKDEP was added to the memory allocation
    flags to tell lockdep not to track that particular allocation for
    the purposes of reclaim recursion detection. This is a much better
    way of preventing false positives - it allows us to use GFP_KERNEL
    context outside of transactions, and allows direct memory reclaim to
    proceed normally without throwing out false positive deadlock
    warnings.
    
    The obvious places that lock inodes and do memory allocation are the
    lookup paths and inode extent list initialisation. These occur in
    non-transactional GFP_KERNEL contexts, and so can run direct reclaim
    and lock inodes.
    
    This patch makes a first path through all the explicit GFP_NOFS
    allocations in XFS and converts the obvious ones to GFP_KERNEL |
    __GFP_NOLOCKDEP as a first step towards removing explicit GFP_NOFS
    allocations from the XFS code.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: default avatarChandan Babu R <chandanbabu@kernel.org>
    94a69db2
xfs_iext_tree.c 23.3 KB