• David Chinner's avatar
    [XFS] Use KM_NOFS for incore inode extent tree allocation V2 · 6785073b
    David Chinner authored
    If we allow incore extent tree allocations to recurse into the
    filesystem under memory pressure, new delayed allocations through
    xfs_iomap_write_delay() can deadlock on themselves if memory
    reclaim tries to write back dirty pages from that inode.
    
    It will deadlock in xfs_iomap_write_allocate() trying to take the
    ilock we already hold. This can also show up as complex ABBA deadlocks
    when multiple threads are triggering memory reclaim when trying to
    allocate extents.
    
    The main cause of this is the fact that delayed allocation is not done in
    a transaction, so KM_NOFS is not automatically added to the allocations to
    prevent this recursion.
    
    Mark all allocations done for the incore inode extent tree as KM_NOFS to
    ensure they never recurse back into the filesystem.
    
    Version 2: o KM_NOFS implies KM_SLEEP, so just use KM_NOFS
    
    SGI-PV: 981498
    
    SGI-Modid: xfs-linux-melb:xfs-kern:31726a
    Signed-off-by: default avatarDavid Chinner <david@fromorbit.com>
    Signed-off-by: default avatarNiv Sardi <xaiki@sgi.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
    Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
    6785073b
xfs_inode.c 134 KB