On Fri, Dec 12, 2025 at 09:09:55PM +0800, Yongpeng Yang wrote: > From: Yongpeng Yang <[email protected]> > > 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 <[email protected]>
Reviewed-by: Benjamin Marzinski <[email protected]>
