twx-linux/drivers/md
Jan Kara fc05e06e60 md/raid5: Improve performance for sequential IO
Commit 7e55c60acfbb ("md/raid5: Pivot raid5_make_request()") changed the
order in which requests for underlying disks are created. Since for
large sequential IO adding of requests frequently races with md_raid5
thread submitting bios to underlying disks, this results in a change in
IO pattern because intermediate states of new order of request creation
result in more smaller discontiguous requests. For RAID5 on top of three
rotational disks our performance testing revealed this results in
regression in write throughput:

iozone -a -s 131072000 -y 4 -q 8 -i 0 -i 1 -R

before 7e55c60acfbb:
              KB  reclen   write rewrite    read    reread
       131072000       4  493670  525964   524575   513384
       131072000       8  540467  532880   512028   513703

after 7e55c60acfbb:
              KB  reclen   write rewrite    read    reread
       131072000       4  421785  456184   531278   509248
       131072000       8  459283  456354   528449   543834

To reduce the amount of discontiguous requests we can start generating
requests with the stripe with the lowest chunk offset as that has the
best chance of being adjacent to IO queued previously. This improves the
performance to:
              KB  reclen   write rewrite    read    reread
       131072000       4  497682  506317   518043   514559
       131072000       8  514048  501886   506453   504319

restoring big part of the regression.

Fixes: 7e55c60acfbb ("md/raid5: Pivot raid5_make_request()")
Cc: stable@vger.kernel.org # v6.0+
Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230417171537.17899-1-jack@suse.cz
2023-04-28 09:19:02 -07:00
..
bcache block/drivers: remove dead clear of random flag 2023-04-25 08:02:11 -06:00
persistent-data dm: add missing blank line after declarations/fix those 2023-02-14 14:23:07 -05:00
dm-audit.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-audit.h
dm-bio-prison-v1.c dm: don't indent labels 2023-02-14 14:23:07 -05:00
dm-bio-prison-v1.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-bio-prison-v2.c dm: address space issues relative to switch/while/for/... 2023-02-14 14:23:06 -05:00
dm-bio-prison-v2.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-bio-record.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-bufio.c dm: fix use of sizeof() macro 2023-02-14 14:23:07 -05:00
dm-builtin.c dm: adjust EXPORT_SYMBOL() to follow functions immediately 2023-02-14 14:23:07 -05:00
dm-cache-background-tracker.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-cache-background-tracker.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-cache-block-types.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-cache-metadata.c dm: prefer '"%s...", __func__' 2023-02-14 14:23:07 -05:00
dm-cache-metadata.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-cache-policy-internal.h dm: add missing empty lines 2023-02-14 14:23:06 -05:00
dm-cache-policy-smq.c dm: add missing empty lines 2023-02-14 14:23:06 -05:00
dm-cache-policy.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-cache-policy.h dm: address indent/space issues 2023-02-14 14:23:06 -05:00
dm-cache-target.c dm cache: add cond_resched() to various workqueue loops 2023-02-17 14:49:12 -05:00
dm-clone-metadata.c
dm-clone-metadata.h
dm-clone-target.c dm clone: prefer kvmalloc_array() 2023-02-14 14:23:08 -05:00
dm-core.h dm: add argument identifier names 2023-02-14 14:23:06 -05:00
dm-crypt.c - Fix DM cache target to free background tracker work items, otherwise 2023-02-22 13:21:31 -08:00
dm-delay.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-dust.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-ebs-target.c dm: avoid spaces before function arguments or in favour of tabs 2023-02-14 14:23:06 -05:00
dm-era-target.c dm: prefer '"%s...", __func__' 2023-02-14 14:23:07 -05:00
dm-exception-store.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-exception-store.h dm: avoid spaces before function arguments or in favour of tabs 2023-02-14 14:23:06 -05:00
dm-flakey.c dm: add missing empty lines 2023-02-14 14:23:06 -05:00
dm-ima.c dm: avoid inline filenames 2023-02-14 14:23:07 -05:00
dm-ima.h dm: avoid inline filenames 2023-02-14 14:23:07 -05:00
dm-init.c dm: avoid inline filenames 2023-02-14 14:23:07 -05:00
dm-integrity.c - Fix DM cache target to free background tracker work items, otherwise 2023-02-22 13:21:31 -08:00
dm-io-rewind.c dm: avoid void function return statements 2023-02-14 14:23:07 -05:00
dm-io-tracker.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-io.c dm: don't indent labels 2023-02-14 14:23:07 -05:00
dm-ioctl.c dm ioctl: remove unnecessary check when using dm_get_mdptr() 2023-02-17 14:49:21 -05:00
dm-kcopyd.c dm: fix use of sizeof() macro 2023-02-14 14:23:07 -05:00
dm-linear.c dm: don't indent labels 2023-02-14 14:23:07 -05:00
dm-log-userspace-base.c dm: avoid void function return statements 2023-02-14 14:23:07 -05:00
dm-log-userspace-transfer.c dm: avoid split of quoted strings where possible 2023-02-14 14:23:07 -05:00
dm-log-userspace-transfer.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-log-writes.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-log.c dm log: avoid multiple line dereference 2023-02-14 14:23:07 -05:00
dm-mpath.c dm: update targets using system workqueues to use a local workqueue 2023-02-14 14:23:08 -05:00
dm-mpath.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-path-selector.c dm: adjust EXPORT_SYMBOL() to follow functions immediately 2023-02-14 14:23:07 -05:00
dm-path-selector.h dm: avoid spaces before function arguments or in favour of tabs 2023-02-14 14:23:06 -05:00
dm-ps-historical-service-time.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-ps-io-affinity.c dm: address space issues relative to switch/while/for/... 2023-02-14 14:23:06 -05:00
dm-ps-queue-length.c dm: avoid spaces before function arguments or in favour of tabs 2023-02-14 14:23:06 -05:00
dm-ps-round-robin.c dm: correct block comments format. 2023-02-14 14:23:06 -05:00
dm-ps-service-time.c dm: avoid spaces before function arguments or in favour of tabs 2023-02-14 14:23:06 -05:00
dm-raid1.c dm: update targets using system workqueues to use a local workqueue 2023-02-14 14:23:08 -05:00
dm-raid.c dm: fix suspect indent whitespace 2023-02-14 14:23:07 -05:00
dm-region-hash.c dm: correct block comments format. 2023-02-14 14:23:06 -05:00
dm-rq.c dm: avoid using symbolic permissions 2023-02-14 14:23:07 -05:00
dm-rq.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-snap-persistent.c dm: avoid split of quoted strings where possible 2023-02-14 14:23:07 -05:00
dm-snap-transient.c dm: avoid split of quoted strings where possible 2023-02-14 14:23:07 -05:00
dm-snap.c dm: avoid split of quoted strings where possible 2023-02-14 14:23:07 -05:00
dm-stats.c dm: avoid using symbolic permissions 2023-02-14 14:23:07 -05:00
dm-stats.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-stripe.c dm: update targets using system workqueues to use a local workqueue 2023-02-14 14:23:08 -05:00
dm-switch.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-sysfs.c dm sysfs: make kobj_type structure constant 2023-02-14 14:23:08 -05:00
dm-table.c blk-crypto: make blk_crypto_evict_key() return void 2023-03-16 09:35:09 -06:00
dm-target.c dm: adjust EXPORT_SYMBOL() to follow functions immediately 2023-02-14 14:23:07 -05:00
dm-thin-metadata.c dm: avoid useless 'else' after 'break' or return' 2023-02-14 14:23:07 -05:00
dm-thin-metadata.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-thin.c dm thin: add cond_resched() to various workqueue loops 2023-02-17 14:46:27 -05:00
dm-uevent.c dm: avoid spaces before function arguments or in favour of tabs 2023-02-14 14:23:06 -05:00
dm-uevent.h dm: fix undue/missing spaces 2023-02-14 14:23:06 -05:00
dm-unstripe.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-verity-fec.c dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-verity-fec.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-verity-loadpin.c dm: verity-loadpin: Only trust verity targets with enforcement 2022-09-07 16:37:27 -07:00
dm-verity-target.c dm: avoid useless 'else' after 'break' or return' 2023-02-14 14:23:07 -05:00
dm-verity-verify-sig.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-verity-verify-sig.h dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-verity.h dm: change "unsigned" to "unsigned int" 2023-02-14 14:23:06 -05:00
dm-writecache.c dm: fix use of sizeof() macro 2023-02-14 14:23:07 -05:00
dm-zero.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-zone.c dm: add missing SPDX-License-Indentifiers 2023-02-14 14:23:06 -05:00
dm-zoned-metadata.c dm: don't indent labels 2023-02-14 14:23:07 -05:00
dm-zoned-reclaim.c
dm-zoned-target.c dm: avoid void function return statements 2023-02-14 14:23:07 -05:00
dm-zoned.h dm/dm-zoned: Use the enum req_op type 2022-07-14 12:14:31 -06:00
dm.c dm: remove unnecessary (void*) conversion in event_callback() 2023-02-20 11:52:49 -05:00
dm.h dm: correct block comments format. 2023-02-14 14:23:06 -05:00
Kconfig drivers/md: Remove "select SRCU" 2023-02-02 16:26:05 -08:00
Makefile hardening updates for v5.20-rc1 2022-08-02 14:38:59 -07:00
md-autodetect.c md: return the allocated devices from md_alloc 2022-08-02 17:22:46 -06:00
md-bitmap.c md: Use optimal I/O size for last bitmap page 2023-04-13 22:20:24 -07:00
md-bitmap.h
md-cluster.c fs: dlm: remove DLM_LSFL_FS from uapi 2022-08-23 14:54:54 -05:00
md-cluster.h
md-faulty.c block: pass a block_device to bio_clone_fast 2022-02-04 07:43:18 -07:00
md-linear.c md: add error_handlers for raid0 and linear 2023-04-13 22:20:24 -07:00
md-linear.h
md-multipath.c md: remove most calls to bdevname 2022-05-22 23:07:21 -07:00
md-multipath.h
md.c md: fix soft lockup in status_resync 2023-04-13 22:20:24 -07:00
md.h md: add error_handlers for raid0 and linear 2023-04-13 22:20:24 -07:00
raid0.c md: add error_handlers for raid0 and linear 2023-04-13 22:20:24 -07:00
raid0.h
raid1-10.c md: raid1/raid10: drop pending_cnt 2022-03-08 15:16:54 -08:00
raid1.c block: remove bio_set_op_attrs 2022-12-07 09:43:12 -07:00
raid1.h md: raid1/raid10: drop pending_cnt 2022-03-08 15:16:54 -08:00
raid5-cache.c md/raid5: use bdev_write_cache instead of open coding it 2022-11-14 10:15:35 -08:00
raid5-log.h md/raid5-ppl: Drop unused argument from ppl_handle_flush_request() 2022-08-02 17:14:31 -06:00
raid5-ppl.c md/raid5: use bdev_write_cache instead of open coding it 2022-11-14 10:15:35 -08:00
raid5.c md/raid5: Improve performance for sequential IO 2023-04-28 09:19:02 -07:00
raid5.h md/raid5: Cleanup prototype of raid5_get_active_stripe() 2022-09-22 00:05:04 -07:00
raid10.c md/raid10: don't call bio_start_io_acct twice for bio which experienced read error 2023-04-14 00:42:03 -07:00
raid10.h md/raid10: convert resync_lock to use seqlock 2022-09-22 00:05:05 -07:00