From: Pankaj Raghav
Date: Mon, 11 Aug 2025 08:41:13 +0000 (+0200)
Subject: block: use largest_zero_folio in __blkdev_issue_zero_pages()
X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=9ff8e0bb92b6abd2ccf538f0caf847b232b26521;p=users%2Fjedix%2Flinux-maple.git
block: use largest_zero_folio in __blkdev_issue_zero_pages()
Use largest_zero_folio() in __blkdev_issue_zero_pages(). On systems with
CONFIG_PERSISTENT_HUGE_ZERO_FOLIO enabled, we will end up sending larger
bvecs instead of multiple small ones.
Noticed a 4% increase in performance on a commercial NVMe SSD which does
not support OP_WRITE_ZEROES. The device's MDTS was 128K. The performance
gains might be bigger if the device supports bigger MDTS.
Link: https://lkml.kernel.org/r/20250811084113.647267-6-kernel@pankajraghav.com
Signed-off-by: Pankaj Raghav
Acked-by: Lorenzo Stoakes
Acked-by: David Hildenbrand
Reviewed-by: Hannes Reinecke
Cc: Kiryl Shutsemau
Cc: Baolin Wang
Cc: Christoph Hellwig
Cc: "Darrick J. Wong"
Cc: Dev Jain
Cc: Jens Axboe
Cc: Liam Howlett
Cc: Luis Chamberalin
Cc: Mariano Pache
Cc: Matthew Wilcox (Oracle)
Cc: Michal Hocko
Cc: Mike Rapoport
Cc: "Ritesh Harjani (IBM)"
Cc: Ryan Roberts
Cc: Suren Baghdasaryan
Cc: Thomas Gleinxer
Cc: Vlastimil Babka
Cc: Zi Yan
Signed-off-by: Andrew Morton
---
diff --git a/block/blk-lib.c b/block/blk-lib.c
index 4c9f20a689f7..3030a772d3aa 100644
--- a/block/blk-lib.c
+++ b/block/blk-lib.c
@@ -196,6 +196,8 @@ static void __blkdev_issue_zero_pages(struct block_device *bdev,
sector_t sector, sector_t nr_sects, gfp_t gfp_mask,
struct bio **biop, unsigned int flags)
{
+ struct folio *zero_folio = largest_zero_folio();
+
while (nr_sects) {
unsigned int nr_vecs = __blkdev_sectors_to_bio_pages(nr_sects);
struct bio *bio;
@@ -208,15 +210,14 @@ static void __blkdev_issue_zero_pages(struct block_device *bdev,
break;
do {
- unsigned int len, added;
+ unsigned int len;
- len = min_t(sector_t,
- PAGE_SIZE, nr_sects << SECTOR_SHIFT);
- added = bio_add_page(bio, ZERO_PAGE(0), len, 0);
- if (added < len)
+ len = min_t(sector_t, folio_size(zero_folio),
+ nr_sects << SECTOR_SHIFT);
+ if (!bio_add_folio(bio, zero_folio, len, 0))
break;
- nr_sects -= added >> SECTOR_SHIFT;
- sector += added >> SECTOR_SHIFT;
+ nr_sects -= len >> SECTOR_SHIFT;
+ sector += len >> SECTOR_SHIFT;
} while (nr_sects);
*biop = bio_chain_and_submit(*biop, bio);