* [PATCH v3 1/1] dm-stripe: adjust max_hw_discard_sectors to avoid unnecessary discard bio splitting
@ 2025-12-12 13:09 Yongpeng Yang
2025-12-15 22:03 ` Benjamin Marzinski
0 siblings, 1 reply; 2+ messages in thread
From: Yongpeng Yang @ 2025-12-12 13:09 UTC (permalink / raw)
To: Alasdair Kergon, Mike Snitzer, Mikulas Patocka,
Benjamin Marzinski
Cc: dm-devel, Yongpeng Yang, Yongpeng Yang
From: Yongpeng Yang <yangyongpeng@xiaomi.com>
Currently, the max_hw_discard_sectors of a stripe target is set to the
minimum max_hw_discard_sectors among all sub devices. When the discard
bio is larger than max_hw_discard_sectors, this may cause the stripe
device to split discard bios unnecessarily, because the value of
max_hw_discard_sectors affects max_discard_sectors, which equal to
min(max_hw_discard_sectors, max_user_discard_sectors).
For example:
root@vm:~# echo '0 33554432 striped 2 256 /dev/vdd 0 /dev/vde 0' | dmsetup create stripe_dev
root@vm:~# cat /sys/block/dm-1/queue/discard_max_bytes
536870912
root@vm:~# cat /sys/block/dm-1/slaves/vdd/queue/discard_max_bytes
536870912
root@vm:~# blkdiscard -o 0 -l 1073741824 -p 1073741824 /dev/mapper/stripe_dev
dm-1 is the stripe device, and its discard_max_bytes is equal to
each sub device’s discard_max_bytes. Since the requested discard
length exceeds discard_max_bytes, the block layer splits the discard bio:
block_bio_queue: 252,1 DS 0 + 2097152 [blkdiscard]
block_split: 252,1 DS 0 / 1048576 [blkdiscard]
block_rq_issue: 253,48 DS 268435456 () 0 + 524288 be,0,4 [blkdiscard]
block_bio_queue: 253,64 DS 524288 + 524288 [blkdiscard]
However, both vdd and vde can actually handle a discard bio of 536870912
bytes, so this split is not necessary.
This patch updates the stripe target’s q->limits.max_hw_discard_sectors
to be the minimum max_hw_discard_sectors of the sub devices multiplied
by the # of stripe devices, and max_hw_discard_sectors must round down to
chunk size multiply # of stripe devices to avoid issue discard bio to sub
devices which is larger than max_hw_discard_sectors.
This patch enables the stripe device to handle larger discard bios
without incurring unnecessary splitting.
Signed-off-by: Yongpeng Yang <yangyongpeng@xiaomi.com>
---
v3:
- Rounding stipe device's max_hw_discard_sectors down to a multiple of
chunk_size.
- Drop sc->max_discard_sectors code.
v2:
- When an overflow occurs, assign (UINT_MAX >> SECTOR_SHIFT) to
limits->max_hw_discard_sectors.
---
drivers/md/dm-stripe.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c
index 1461dc740dae..8a872f5d633e 100644
--- a/drivers/md/dm-stripe.c
+++ b/drivers/md/dm-stripe.c
@@ -456,7 +456,7 @@ static void stripe_io_hints(struct dm_target *ti,
struct queue_limits *limits)
{
struct stripe_c *sc = ti->private;
- unsigned int io_min, io_opt;
+ unsigned int io_min, io_opt, max_hw_discard_sectors = limits->max_hw_discard_sectors;
limits->chunk_sectors = sc->chunk_size;
@@ -465,6 +465,14 @@ static void stripe_io_hints(struct dm_target *ti,
limits->io_min = io_min;
limits->io_opt = io_opt;
}
+ if (max_hw_discard_sectors >= sc->chunk_size) {
+ if (!check_mul_overflow(max_hw_discard_sectors, sc->stripes, &max_hw_discard_sectors)) {
+ max_hw_discard_sectors = rounddown(max_hw_discard_sectors,
+ sc->chunk_size * sc->stripes);
+ limits->max_hw_discard_sectors = max_hw_discard_sectors;
+ } else
+ limits->max_hw_discard_sectors = UINT_MAX >> SECTOR_SHIFT;
+ }
}
static struct target_type stripe_target = {
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH v3 1/1] dm-stripe: adjust max_hw_discard_sectors to avoid unnecessary discard bio splitting
2025-12-12 13:09 [PATCH v3 1/1] dm-stripe: adjust max_hw_discard_sectors to avoid unnecessary discard bio splitting Yongpeng Yang
@ 2025-12-15 22:03 ` Benjamin Marzinski
0 siblings, 0 replies; 2+ messages in thread
From: Benjamin Marzinski @ 2025-12-15 22:03 UTC (permalink / raw)
To: Yongpeng Yang
Cc: Alasdair Kergon, Mike Snitzer, Mikulas Patocka, dm-devel,
Yongpeng Yang, Yongpeng Yang
On Fri, Dec 12, 2025 at 09:09:55PM +0800, Yongpeng Yang wrote:
> From: Yongpeng Yang <yangyongpeng@xiaomi.com>
>
> Currently, the max_hw_discard_sectors of a stripe target is set to the
> minimum max_hw_discard_sectors among all sub devices. When the discard
> bio is larger than max_hw_discard_sectors, this may cause the stripe
> device to split discard bios unnecessarily, because the value of
> max_hw_discard_sectors affects max_discard_sectors, which equal to
> min(max_hw_discard_sectors, max_user_discard_sectors).
>
> For example:
> root@vm:~# echo '0 33554432 striped 2 256 /dev/vdd 0 /dev/vde 0' | dmsetup create stripe_dev
> root@vm:~# cat /sys/block/dm-1/queue/discard_max_bytes
> 536870912
> root@vm:~# cat /sys/block/dm-1/slaves/vdd/queue/discard_max_bytes
> 536870912
> root@vm:~# blkdiscard -o 0 -l 1073741824 -p 1073741824 /dev/mapper/stripe_dev
>
> dm-1 is the stripe device, and its discard_max_bytes is equal to
> each sub device’s discard_max_bytes. Since the requested discard
> length exceeds discard_max_bytes, the block layer splits the discard bio:
>
> block_bio_queue: 252,1 DS 0 + 2097152 [blkdiscard]
> block_split: 252,1 DS 0 / 1048576 [blkdiscard]
> block_rq_issue: 253,48 DS 268435456 () 0 + 524288 be,0,4 [blkdiscard]
> block_bio_queue: 253,64 DS 524288 + 524288 [blkdiscard]
>
> However, both vdd and vde can actually handle a discard bio of 536870912
> bytes, so this split is not necessary.
>
> This patch updates the stripe target’s q->limits.max_hw_discard_sectors
> to be the minimum max_hw_discard_sectors of the sub devices multiplied
> by the # of stripe devices, and max_hw_discard_sectors must round down to
> chunk size multiply # of stripe devices to avoid issue discard bio to sub
> devices which is larger than max_hw_discard_sectors.
>
> This patch enables the stripe device to handle larger discard bios
> without incurring unnecessary splitting.
>
> Signed-off-by: Yongpeng Yang <yangyongpeng@xiaomi.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-12-15 22:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-12 13:09 [PATCH v3 1/1] dm-stripe: adjust max_hw_discard_sectors to avoid unnecessary discard bio splitting Yongpeng Yang
2025-12-15 22:03 ` Benjamin Marzinski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox