Skip to content
  • Byungchul Park's avatar
    block, locking/lockdep: Assign a lock_class per gendisk used for wait_for_completion() · e319e1fb
    Byungchul Park authored
    
    
    Darrick posted the following warning and Dave Chinner analyzed it:
    
    > ======================================================
    > WARNING: possible circular locking dependency detected
    > 4.14.0-rc1-fixes #1 Tainted: G        W
    > ------------------------------------------------------
    > loop0/31693 is trying to acquire lock:
    >  (&(&ip->i_mmaplock)->mr_lock){++++}, at: [<ffffffffa00f1b0c>] xfs_ilock+0x23c/0x330 [xfs]
    >
    > but now in release context of a crosslock acquired at the following:
    >  ((complete)&ret.event){+.+.}, at: [<ffffffff81326c1f>] submit_bio_wait+0x7f/0xb0
    >
    > which lock already depends on the new lock.
    >
    > the existing dependency chain (in reverse order) is:
    >
    > -> #2 ((complete)&ret.event){+.+.}:
    >        lock_acquire+0xab/0x200
    >        wait_for_completion_io+0x4e/0x1a0
    >        submit_bio_wait+0x7f/0xb0
    >        blkdev_issue_zeroout+0x71/0xa0
    >        xfs_bmapi_convert_unwritten+0x11f/0x1d0 [xfs]
    >        xfs_bmapi_write+0x374/0x11f0 [xfs]
    >        xfs_iomap_write_direct+0x2ac/0x430 [xfs]
    >        xfs_file_iomap_begin+0x20d/0xd50 [xfs]
    >        iomap_apply+0x43/0xe0
    >        dax_iomap_rw+0x89/0xf0
    >        xfs_file_dax_write+0xcc/0x220 [xfs]
    >        xfs_file_write_iter+0xf0/0x130 [xfs]
    >        __vfs_write+0xd9/0x150
    >        vfs_write+0xc8/0x1c0
    >        SyS_write+0x45/0xa0
    >        entry_SYSCALL_64_fastpath+0x1f/0xbe
    >
    > -> #1 (&xfs_nondir_ilock_class){++++}:
    >        lock_acquire+0xab/0x200
    >        down_write_nested+0x4a/0xb0
    >        xfs_ilock+0x263/0x330 [xfs]
    >        xfs_setattr_size+0x152/0x370 [xfs]
    >        xfs_vn_setattr+0x6b/0x90 [xfs]
    >        notify_change+0x27d/0x3f0
    >        do_truncate+0x5b/0x90
    >        path_openat+0x237/0xa90
    >        do_filp_open+0x8a/0xf0
    >        do_sys_open+0x11c/0x1f0
    >        entry_SYSCALL_64_fastpath+0x1f/0xbe
    >
    > -> #0 (&(&ip->i_mmaplock)->mr_lock){++++}:
    >        up_write+0x1c/0x40
    >        xfs_iunlock+0x1d0/0x310 [xfs]
    >        xfs_file_fallocate+0x8a/0x310 [xfs]
    >        loop_queue_work+0xb7/0x8d0
    >        kthread_worker_fn+0xb9/0x1f0
    >
    > Chain exists of:
    >   &(&ip->i_mmaplock)->mr_lock --> &xfs_nondir_ilock_class --> (complete)&ret.event
    >
    >  Possible unsafe locking scenario by crosslock:
    >
    >        CPU0                    CPU1
    >        ----                    ----
    >   lock(&xfs_nondir_ilock_class);
    >   lock((complete)&ret.event);
    >                                lock(&(&ip->i_mmaplock)->mr_lock);
    >                                unlock((complete)&ret.event);
    >
    >                *** DEADLOCK ***
    
    The warning is a false positive, caused by the fact that all
    wait_for_completion()s in submit_bio_wait() are waiting with the same
    lock class.
    
    However, some bios have nothing to do with others, for example in the case
    of loop devices, there's no direct connection between the bios of an upper
    device and the bios of a lower device(=loop device).
    
    The safest way to assign different lock classes to different devices is
    to do it for each gendisk. In other words, this patch assigns a
    lockdep_map per gendisk and uses it when initializing completion in
    submit_bio_wait().
    
    Analyzed-by: default avatarDave Chinner <david@fromorbit.com>
    Reported-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarByungchul Park <byungchul.park@lge.com>
    Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: amir73il@gmail.com
    Cc: axboe@kernel.dk
    Cc: david@fromorbit.com
    Cc: hch@infradead.org
    Cc: idryomov@gmail.com
    Cc: johan@kernel.org
    Cc: johannes.berg@intel.com
    Cc: kernel-team@lge.com
    Cc: linux-block@vger.kernel.org
    Cc: linux-fsdevel@vger.kernel.org
    Cc: linux-mm@kvack.org
    Cc: linux-xfs@vger.kernel.org
    Cc: oleg@redhat.com
    Cc: tj@kernel.org
    Link: http://lkml.kernel.org/r/1508921765-15396-10-git-send-email-byungchul.park@lge.com
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    e319e1fb