From 63dcfcd88564ee50a8553cb61c13c3856a0af759 Mon Sep 17 00:00:00 2001
From: Pankaj Raghav
Date: Mon, 11 Aug 2025 10:41:13 +0200
Subject: [PATCH] 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
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
---
block/blk-lib.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
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);
--
2.51.0