| From 03eaa14a6821412916cdf38c54c81f9824973220 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 16 Aug 2023 14:13:55 -0400 |
| Subject: md: raid0: account for split bio in iostat accounting |
| |
| From: David Jeffery <djeffery@redhat.com> |
| |
| [ Upstream commit cc22b5407e9ca76adb7efeed843146510b1b72a5 ] |
| |
| When a bio is split by md raid0, the newly created bio will not be tracked |
| by md for I/O accounting. Only the portion of I/O still assigned to the |
| original bio which was reduced by the split will be accounted for. This |
| results in md iostat data sometimes showing I/O values far below the actual |
| amount of data being sent through md. |
| |
| md_account_bio() needs to be called for all bio generated by the bio split. |
| |
| A simple example of the issue was generated using a raid0 device on partitions |
| to the same device. Since all raid0 I/O then goes to one device, it makes it |
| easy to see a gap between the md device and its sd storage. Reading an lvm |
| device on top of the md device, the iostat output (some 0 columns and extra |
| devices removed to make the data more compact) was: |
| |
| Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read |
| md2 0.00 0.00 0.00 0.00 0 |
| sde 0.00 0.00 0.00 0.00 0 |
| md2 1364.00 411496.00 0.00 0.00 411496 |
| sde 1734.00 646144.00 0.00 0.00 646144 |
| md2 1699.00 510680.00 0.00 0.00 510680 |
| sde 2155.00 802784.00 0.00 0.00 802784 |
| md2 803.00 241480.00 0.00 0.00 241480 |
| sde 1016.00 377888.00 0.00 0.00 377888 |
| md2 0.00 0.00 0.00 0.00 0 |
| sde 0.00 0.00 0.00 0.00 0 |
| |
| I/O was generated doing large direct I/O reads (12M) with dd to a linear |
| lvm volume on top of the 4 leg raid0 device. |
| |
| The md2 reads were showing as roughly 2/3 of the reads to the sde device |
| containing all of md2's raid partitions. The sum of reads to sde was |
| 1826816 kB, which was the expected amount as it was the amount read by |
| dd. With the patch, the total reads from md will match the reads from |
| sde and be consistent with the amount of I/O generated. |
| |
| Fixes: 10764815ff47 ("md: add io accounting for raid0 and raid5") |
| Signed-off-by: David Jeffery <djeffery@redhat.com> |
| Tested-by: Laurence Oberman <loberman@redhat.com> |
| Reviewed-by: Laurence Oberman <loberman@redhat.com> |
| Reviewed-by: Yu Kuai <yukuai3@huawei.com> |
| Signed-off-by: Song Liu <song@kernel.org> |
| Link: https://lore.kernel.org/r/20230816181433.13289-1-djeffery@redhat.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/md/raid0.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c |
| index 595856948dff8..7c6a0b4437d8f 100644 |
| --- a/drivers/md/raid0.c |
| +++ b/drivers/md/raid0.c |
| @@ -565,8 +565,7 @@ static void raid0_map_submit_bio(struct mddev *mddev, struct bio *bio) |
| sector_t bio_sector = bio->bi_iter.bi_sector; |
| sector_t sector = bio_sector; |
| |
| - if (bio->bi_pool != &mddev->bio_set) |
| - md_account_bio(mddev, &bio); |
| + md_account_bio(mddev, &bio); |
| |
| zone = find_zone(mddev->private, §or); |
| switch (conf->layout) { |
| -- |
| 2.40.1 |
| |