diff options
author | Isaac Huang <[email protected]> | 2016-09-29 14:13:31 -0600 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-09-29 13:13:31 -0700 |
commit | e8ac4557af67a46a2cb90bd7db4d426c0b358d51 (patch) | |
tree | 4ce1e63abedea5fc71d3dde6415cebbdf806f080 /module/zfs | |
parent | 8a1cf1a5608151635b67d89613e51427b177dab0 (diff) |
Explicit block device plugging when submitting multiple BIOs
Without plugging, the default 'noop' scheduler will not merge
the BIOs which are part of a large ZIO.
Reviewed-by: Andreas Dilger <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Isaac Huang <[email protected]>
Closes #5181
Diffstat (limited to 'module/zfs')
-rw-r--r-- | module/zfs/vdev_disk.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c index e399e6630..ce65760ee 100644 --- a/module/zfs/vdev_disk.c +++ b/module/zfs/vdev_disk.c @@ -524,6 +524,9 @@ __vdev_disk_physio(struct block_device *bdev, zio_t *zio, caddr_t kbuf_ptr, uint64_t bio_offset; int bio_size, bio_count = 16; int i = 0, error = 0; +#if defined(HAVE_BLK_QUEUE_HAVE_BLK_PLUG) + struct blk_plug plug; +#endif ASSERT3U(kbuf_offset + kbuf_size, <=, bdev->bd_inode->i_size); @@ -592,11 +595,21 @@ retry: /* Extra reference to protect dio_request during vdev_submit_bio */ vdev_disk_dio_get(dr); +#if defined(HAVE_BLK_QUEUE_HAVE_BLK_PLUG) + if (dr->dr_bio_count > 1) + blk_start_plug(&plug); +#endif + /* Submit all bio's associated with this dio */ for (i = 0; i < dr->dr_bio_count; i++) if (dr->dr_bio[i]) vdev_submit_bio(dr->dr_bio[i]); +#if defined(HAVE_BLK_QUEUE_HAVE_BLK_PLUG) + if (dr->dr_bio_count > 1) + blk_finish_plug(&plug); +#endif + (void) vdev_disk_dio_put(dr); return (error); |