]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
deadlock between mm_sem and tx assign in zfs_write() and page fault
authorilbsmart <wgqimut@gmail.com>
Tue, 16 Oct 2018 18:11:24 +0000 (02:11 +0800)
committerMatthew Ahrens <mahrens@delphix.com>
Tue, 16 Oct 2018 18:11:24 +0000 (11:11 -0700)
commit779a6c0bf6df76e0dd92c1ccf81f48512b835bb0
treeafd6c82c91daeb96b9d0a9b6d48e757f4d0e5c81
parentb2030e5d51ec23fced9f54536d97ac09db4e0552
deadlock between mm_sem and tx assign in zfs_write() and page fault

The bug time sequence:
1. thread #1, `zfs_write` assign a txg "n".
2. In a same process, thread #2, mmap page fault (which means the
   `mm_sem` is hold) occurred, `zfs_dirty_inode` open a txg failed,
   and wait previous txg "n" completed.
3. thread #1 call `uiomove` to write, however page fault is occurred
   in `uiomove`, which means it need `mm_sem`, but `mm_sem` is hold by
   thread #2, so it stuck and can't complete,  then txg "n" will
   not complete.

So thread #1 and thread #2 are deadlocked.

Reviewed-by: Chunwei Chen <tuxoko@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Signed-off-by: Grady Wong <grady.w@xtaotech.com>
Closes #7939
include/spl/sys/uio.h
include/sys/uio_impl.h
module/zcommon/zfs_uio.c
module/zfs/zfs_vnops.c
tests/zfs-tests/cmd/mmapwrite/mmapwrite.c
tests/zfs-tests/tests/functional/mmap/mmap_write_001_pos.ksh