On 7 May 2024, at 10:58, Pankaj Raghav (Samsung) wrote:
> From: Pankaj Raghav
>
> Instead of looping with ZERO_PAGE, use a huge zero folio to zero pad the
> block. Fallback to ZERO_PAGE if mm_get_huge_zero_folio() fails.
>
> Suggested-by: Christoph Hellwig
> Signed-off-by: Pankaj Raghav
> ---
> I rebased on top of mm-unstable to get mm_get_huge_zero_folio().
>
> @Christoph is this inline with what you had in mind?
>
> fs/iomap/direct-io.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
> index 5f481068de5b..7f584f9ff2c5 100644
> --- a/fs/iomap/direct-io.c
> +++ b/fs/iomap/direct-io.c
> @@ -236,11 +236,18 @@ static void iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio,
> loff_t pos, unsigned len)
> {
> struct inode *inode = file_inode(dio->iocb->ki_filp);
> - struct page *page = ZERO_PAGE(0);
> + struct folio *zero_page_folio = page_folio(ZERO_PAGE(0));
> + struct folio *folio = zero_page_folio;
> struct bio *bio;
>
> WARN_ON_ONCE(len > (BIO_MAX_VECS * PAGE_SIZE));
>
> + if (len > PAGE_SIZE) {
> + folio = mm_get_huge_zero_folio(current->mm);
The huge zero folio is order-9, but it seems here you only require len to be
bigger than PAGE_SIZE. I am not sure if it works when len is smaller than
HPAGE_PMD_SIZE.
> + if (!folio)
> + folio = zero_page_folio;
> + }
> +
> bio = iomap_dio_alloc_bio(iter, dio, BIO_MAX_VECS,
> REQ_OP_WRITE | REQ_SYNC | REQ_IDLE);
> fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits,
> @@ -251,10 +258,10 @@ static void iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio,
> bio->bi_end_io = iomap_dio_bio_end_io;
>
> while (len) {
> - unsigned int io_len = min_t(unsigned int, len, PAGE_SIZE);
> + unsigned int size = min(len, folio_size(folio));
>
> - __bio_add_page(bio, page, io_len, 0);
> - len -= io_len;
> + bio_add_folio_nofail(bio, folio, size, 0);
> + len -= size;
Maybe use huge zero folio when len > HPAGE_PMD_SIZE and use ZERO_PAGE(0)
for len % HPAGE_PMD_SIZE.
> }
> iomap_dio_submit_bio(iter, dio, bio, pos);
> }
> --
> 2.34.1
--
Best Regards,
Yan, Zi