diff options
author | Brian Behlendorf <[email protected]> | 2015-09-24 16:32:25 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-09-25 12:47:31 -0700 |
commit | 5592404784d3125cbeb6df002674867c009c8b48 (patch) | |
tree | 4ae2c1d2e180906e718138b5680c7ca996aeba99 /config | |
parent | ef5b2e1048eeeb7a81d932d38e52d897b33fca54 (diff) |
Fix synchronous behavior in __vdev_disk_physio()
Commit b39c22b set the READ_SYNC and WRITE_SYNC flags for a bio
based on the ZIO_PRIORITY_* flag passed in. This had the unnoticed
side-effect of making the vdev_disk_io_start() synchronous for
certain I/Os.
This in turn resulted in vdev_disk_io_start() being able to
re-dispatch zio's which would result in a RCU stalls when a disk
was removed from the system. Additionally, this could negatively
impact performance and explains the performance regressions reported
in both #3829 and #3780.
This patch resolves the issue by making the blocking behavior
dependent on a 'wait' flag being passed rather than overloading
the passed bio flags.
Finally, the WRITE_SYNC and READ_SYNC behavior is restricted to
non-rotational devices where there is no benefit to queuing to
aggregate the I/O.
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #3652
Issue #3780
Issue #3785
Issue #3817
Issue #3821
Issue #3829
Issue #3832
Issue #3870
Diffstat (limited to 'config')
-rw-r--r-- | config/kernel-bio-rw-syncio.m4 | 50 | ||||
-rw-r--r-- | config/kernel.m4 | 3 |
2 files changed, 0 insertions, 53 deletions
diff --git a/config/kernel-bio-rw-syncio.m4 b/config/kernel-bio-rw-syncio.m4 deleted file mode 100644 index 4bff80a8f..000000000 --- a/config/kernel-bio-rw-syncio.m4 +++ /dev/null @@ -1,50 +0,0 @@ -dnl # -dnl # Preferred interface for flagging a synchronous bio: -dnl # 2.6.12-2.6.29: BIO_RW_SYNC -dnl # 2.6.30-2.6.35: BIO_RW_SYNCIO -dnl # 2.6.36-2.6.xx: REQ_SYNC -dnl # -AC_DEFUN([ZFS_AC_KERNEL_BIO_RW_SYNC], [ - AC_MSG_CHECKING([whether BIO_RW_SYNC is defined]) - ZFS_LINUX_TRY_COMPILE([ - #include <linux/bio.h> - ],[ - int flags __attribute__ ((unused)); - flags = BIO_RW_SYNC; - ],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_BIO_RW_SYNC, 1, [BIO_RW_SYNC is defined]) - ],[ - AC_MSG_RESULT(no) - ]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_BIO_RW_SYNCIO], [ - AC_MSG_CHECKING([whether BIO_RW_SYNCIO is defined]) - ZFS_LINUX_TRY_COMPILE([ - #include <linux/bio.h> - ],[ - int flags __attribute__ ((unused)); - flags = BIO_RW_SYNCIO; - ],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_BIO_RW_SYNCIO, 1, [BIO_RW_SYNCIO is defined]) - ],[ - AC_MSG_RESULT(no) - ]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_REQ_SYNC], [ - AC_MSG_CHECKING([whether REQ_SYNC is defined]) - ZFS_LINUX_TRY_COMPILE([ - #include <linux/bio.h> - ],[ - int flags __attribute__ ((unused)); - flags = REQ_SYNC; - ],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_REQ_SYNC, 1, [REQ_SYNC is defined]) - ],[ - AC_MSG_RESULT(no) - ]) -]) diff --git a/config/kernel.m4 b/config/kernel.m4 index e088c4da3..0a65f39ef 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -25,9 +25,6 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_BIO_END_IO_T_ARGS ZFS_AC_KERNEL_BIO_RW_BARRIER ZFS_AC_KERNEL_BIO_RW_DISCARD - ZFS_AC_KERNEL_BIO_RW_SYNC - ZFS_AC_KERNEL_BIO_RW_SYNCIO - ZFS_AC_KERNEL_REQ_SYNC ZFS_AC_KERNEL_BLK_QUEUE_FLUSH ZFS_AC_KERNEL_BLK_QUEUE_MAX_HW_SECTORS ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS |