• Brian Foster's avatar
    xfs: fix soft lockup via spinning in filestream ag selection loop · f650df71
    Brian Foster authored
    The filestream AG selection loop uses pagf data to aid in AG
    selection, which depends on pagf initialization. If the in-core
    structure is not initialized, the caller invokes the AGF read path
    to do so and carries on. If another task enters the loop and finds
    a pagf init already in progress, the AGF read returns -EAGAIN and
    the task continues the loop. This does not increment the current ag
    index, however, which means the task spins on the current AGF buffer
    until unlocked.
    
    If the AGF read I/O submitted by the initial task happens to be
    delayed for whatever reason, this results in soft lockup warnings
    via the spinning task. This is reproduced by xfs/170. To avoid this
    problem, fix the AGF trylock failure path to properly iterate to the
    next AG. If a task iterates all AGs without making progress, the
    trylock behavior is dropped in favor of blocking locks and thus a
    soft lockup is no longer possible.
    
    Fixes: f48e2df8 ("xfs: make xfs_*read_agf return EAGAIN to ALLOC_FLAG_TRYLOCK callers")
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    f650df71
xfs_filestream.c 8.68 KB