Re: [PATCH] hugetlbfs: zero partial pages during fallocate hole punch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jun 13, 2022 at 11:08:58AM -0700, Mike Kravetz wrote:
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index eca1d0fabd7e..b0d0947a7e9b 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -584,41 +584,79 @@ static void hugetlb_vmtruncate(struct inode *inode, loff_t offset)
>  	remove_inode_hugepages(inode, offset, LLONG_MAX);
>  }
>  
> +static void hugetlbfs_zero_partial_page(struct hstate *h,
> +					struct address_space *mapping,
> +					unsigned long start,

This should be loff_t.  Otherwise we can truncate on 32-bit machines.

> +					unsigned long end)
> +{
> +	pgoff_t idx = start >> huge_page_shift(h);
> +	struct page *page;
> +
> +	page = find_lock_page(mapping, idx);
> +	if (!page)
> +		return;
> +
> +	start = start & ~huge_page_mask(h);
> +	end = end & ~huge_page_mask(h);
> +	if (!end)
> +		end = huge_page_size(h);
> +
> +	zero_user_segment(page, (unsigned int)start, (unsigned int)end);
> +
> +	unlock_page(page);
> +	put_page(page);

We haven't started converting hugetlbfs to folios yet, but here's how
that would look (which will save us converting it later):

	folio = filemap_lock_folio(mapping, idx);
	if (!folio)
		return;
...
	folio_zero_segment(folio, start, end);
	folio_unlock(folio);
	folio_put(folio);

Pretty much a 1-for-1 replacement.




[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux