From: Jonathan Derrick <jonathan.derrick@linux.dev>
To: Song Liu <song@kernel.org>, <linux-raid@vger.kernel.org>
Cc: Sushma Kalakota <sushma.kalakota@intel.com>,
Jon Derrick <jonathan.derrick@linux.dev>
Subject: [PATCH] md: Use optimal I/O size for last bitmap page
Date: Tue, 17 Jan 2023 17:53:19 -0700 [thread overview]
Message-ID: <20230118005319.147-1-jonathan.derrick@linux.dev> (raw)
From: Jon Derrick <jonathan.derrick@linux.dev>
If the bitmap space has enough room, size the I/O for the last bitmap
page write to the optimal I/O size for the storage device. The expanded
write is checked that it won't overrun the data or metadata.
This change helps increase performance by preventing unnecessary
device-side read-mod-writes due to non-atomic write unit sizes.
Ex biosnoop log. Device lba size 512, optimal size 4k:
Before:
Time Process PID Device LBA Size Lat
0.843734 md0_raid10 5267 nvme0n1 W 24 3584 1.17
0.843933 md0_raid10 5267 nvme1n1 W 24 3584 1.36
0.843968 md0_raid10 5267 nvme1n1 W 14207939968 4096 0.01
0.843979 md0_raid10 5267 nvme0n1 W 14207939968 4096 0.02
After:
Time Process PID Device LBA Size Lat
18.374244 md0_raid10 6559 nvme0n1 W 24 4096 0.01
18.374253 md0_raid10 6559 nvme1n1 W 24 4096 0.01
18.374300 md0_raid10 6559 nvme0n1 W 11020272296 4096 0.01
18.374306 md0_raid10 6559 nvme1n1 W 11020272296 4096 0.02
Signed-off-by: Jon Derrick <jonathan.derrick@linux.dev>
---
drivers/md/md-bitmap.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
index e7cc6ba1b657..569297ea9b99 100644
--- a/drivers/md/md-bitmap.c
+++ b/drivers/md/md-bitmap.c
@@ -220,6 +220,7 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
rdev = NULL;
while ((rdev = next_active_rdev(rdev, mddev)) != NULL) {
int size = PAGE_SIZE;
+ int optimal_size = PAGE_SIZE;
loff_t offset = mddev->bitmap_info.offset;
bdev = (rdev->meta_bdev) ? rdev->meta_bdev : rdev->bdev;
@@ -228,9 +229,14 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
int last_page_size = store->bytes & (PAGE_SIZE-1);
if (last_page_size == 0)
last_page_size = PAGE_SIZE;
- size = roundup(last_page_size,
- bdev_logical_block_size(bdev));
+ size = roundup(last_page_size, bdev_logical_block_size(bdev));
+ if (bdev_io_opt(bdev) > bdev_logical_block_size(bdev))
+ optimal_size = roundup(last_page_size, bdev_io_opt(bdev));
+ else
+ optimal_size = size;
}
+
+
/* Just make sure we aren't corrupting data or
* metadata
*/
@@ -246,9 +252,11 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
goto bad_alignment;
} else if (offset < 0) {
/* DATA BITMAP METADATA */
- if (offset
- + (long)(page->index * (PAGE_SIZE/512))
- + size/512 > 0)
+ loff_t off = offset + (long)(page->index * (PAGE_SIZE/512));
+ if (size != optimal_size &&
+ off + optimal_size/512 <= 0)
+ size = optimal_size;
+ else if (off + size/512 > 0)
/* bitmap runs in to metadata */
goto bad_alignment;
if (rdev->data_offset + mddev->dev_sectors
@@ -257,10 +265,11 @@ static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
goto bad_alignment;
} else if (rdev->sb_start < rdev->data_offset) {
/* METADATA BITMAP DATA */
- if (rdev->sb_start
- + offset
- + page->index*(PAGE_SIZE/512) + size/512
- > rdev->data_offset)
+ loff_t off = rdev->sb_start + offset + page->index*(PAGE_SIZE/512);
+ if (size != optimal_size &&
+ off + optimal_size/512 <= rdev->data_offset)
+ size = optimal_size;
+ else if (off + size/512 > rdev->data_offset)
/* bitmap runs in to data */
goto bad_alignment;
} else {
--
2.27.0
next reply other threads:[~2023-01-18 1:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 0:53 Jonathan Derrick [this message]
2023-02-09 20:37 ` [PATCH] md: Use optimal I/O size for last bitmap page Jonathan Derrick
2023-02-10 17:32 ` Song Liu
2023-02-16 23:52 ` Jonathan Derrick
2023-02-17 13:21 ` Paul Menzel
2023-02-17 18:22 ` Jonathan Derrick
2023-02-21 5:27 ` Song Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230118005319.147-1-jonathan.derrick@linux.dev \
--to=jonathan.derrick@linux.dev \
--cc=linux-raid@vger.kernel.org \
--cc=song@kernel.org \
--cc=sushma.kalakota@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.