From: Baolin Wang <baolin.wang@linux.alibaba.com>
To: Daniel Gomez <da.gomez@samsung.com>
Cc: "akpm@linux-foundation.org" <akpm@linux-foundation.org>,
"hughd@google.com" <hughd@google.com>,
"willy@infradead.org" <willy@infradead.org>,
"david@redhat.com" <david@redhat.com>,
"21cnbao@gmail.com" <21cnbao@gmail.com>,
"ryan.roberts@arm.com" <ryan.roberts@arm.com>,
"ziy@nvidia.com" <ziy@nvidia.com>,
"ioworker0@gmail.com" <ioworker0@gmail.com>,
Pankaj Raghav <p.raghav@samsung.com>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [RFC PATCH 2/3] mm: shmem: add large folio support to the write and fallocate paths
Date: Thu, 8 Aug 2024 09:56:10 +0800 [thread overview]
Message-ID: <98cb8158-2087-4100-9789-1a45c0c04fc4@linux.alibaba.com> (raw)
In-Reply-To: <ur7tze5f7m3gfokrbux4iqlt3opbxaxtnimiqfwj7cvnppnepc@qisd76x2a5jh>
On 2024/8/5 02:46, Daniel Gomez wrote:
> On Wed, Jul 24, 2024 at 03:03:59PM GMT, Baolin Wang wrote:
>> From: Daniel Gomez <da.gomez@samsung.com>
>>
>> Add large folio support for shmem write and fallocate paths matching the
>> same high order preference mechanism used in the iomap buffered IO path
>> as used in __filemap_get_folio().
>>
>> Add shmem_mapping_size_order() to get a hint for the order of the folio
>> based on the file size which takes care of the mapping requirements.
>>
>> Swap does not support high order folios for now, so make it order-0 in
>> case swap is enabled.
>>
>> If the top level huge page (controlled by '/sys/kernel/mm/transparent_hugepage/shmem_enabled')
>> is enabled, we just allow PMD sized THP to keep interface backward
>> compatibility.
>>
>> Co-developed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
>> Signed-off-by: Daniel Gomez <da.gomez@samsung.com>
>> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
>> ---
>> include/linux/shmem_fs.h | 4 +--
>> mm/huge_memory.c | 2 +-
>> mm/shmem.c | 57 ++++++++++++++++++++++++++++++++++++----
>> 3 files changed, 55 insertions(+), 8 deletions(-)
>>
>> diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
>> index 34beaca2f853..fb0771218f1b 100644
>> --- a/include/linux/shmem_fs.h
>> +++ b/include/linux/shmem_fs.h
>> @@ -113,11 +113,11 @@ int shmem_unuse(unsigned int type);
>> #ifdef CONFIG_TRANSPARENT_HUGEPAGE
>> unsigned long shmem_allowable_huge_orders(struct inode *inode,
>> struct vm_area_struct *vma, pgoff_t index,
>> - bool shmem_huge_force);
>> + bool shmem_huge_force, size_t len);
>> #else
>> static inline unsigned long shmem_allowable_huge_orders(struct inode *inode,
>> struct vm_area_struct *vma, pgoff_t index,
>> - bool shmem_huge_force)
>> + bool shmem_huge_force, size_t len)
>> {
>> return 0;
>> }
>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
>> index e555fcdd19d4..a8fc3b9e4034 100644
>> --- a/mm/huge_memory.c
>> +++ b/mm/huge_memory.c
>> @@ -162,7 +162,7 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
>> if (!in_pf && shmem_file(vma->vm_file))
>> return shmem_allowable_huge_orders(file_inode(vma->vm_file),
>> vma, vma->vm_pgoff,
>> - !enforce_sysfs);
>> + !enforce_sysfs, PAGE_SIZE);
>>
>> if (!vma_is_anonymous(vma)) {
>> /*
>> diff --git a/mm/shmem.c b/mm/shmem.c
>> index 92ed09527682..cc0c1b790267 100644
>> --- a/mm/shmem.c
>> +++ b/mm/shmem.c
>> @@ -1630,10 +1630,47 @@ static gfp_t limit_gfp_mask(gfp_t huge_gfp, gfp_t limit_gfp)
>> return result;
>> }
>>
>> +/**
>> + * shmem_mapping_size_order - Get maximum folio order for the given file size.
>> + * @mapping: Target address_space.
>> + * @index: The page index.
>> + * @size: The suggested size of the folio to create.
>> + *
>> + * This returns a high order for folios (when supported) based on the file size
>> + * which the mapping currently allows at the given index. The index is relevant
>> + * due to alignment considerations the mapping might have. The returned order
>> + * may be less than the size passed.
>> + *
>> + * Like __filemap_get_folio order calculation.
>> + *
>> + * Return: The order.
>> + */
>> +static inline unsigned int
>> +shmem_mapping_size_order(struct address_space *mapping, pgoff_t index,
>> + size_t size, struct shmem_sb_info *sbinfo)
>> +{
>> + unsigned int order = ilog2(size);
>> +
>> + if ((order <= PAGE_SHIFT) ||
>> + (!mapping_large_folio_support(mapping) || !sbinfo->noswap))
>> + return 0;
>> +
>> + order -= PAGE_SHIFT;
>> +
>> + /* If we're not aligned, allocate a smaller folio */
>> + if (index & ((1UL << order) - 1))
>> + order = __ffs(index);
>> +
>> + order = min_t(size_t, order, MAX_PAGECACHE_ORDER);
>> +
>> + /* Order-1 not supported due to THP dependency */
>> + return (order == 1) ? 0 : order;
>> +}
>
> I have an updated version of shmem_mapping_size_order() that I didn't posted but
> uses get_order() instead as suggested in [1]:
>
> [1] https://lore.kernel.org/all/ZT7rd3CSr+VnKj7v@casper.infradead.org/
>
> /**
> * shmem_mapping_size_order - Get maximum folio order for the given file size.
> * @mapping: Target address_space.
> * @index: The page index.
> * @size: The suggested size of the folio to create.
> *
> * This returns a high order for folios (when supported) based on the file size
> * which the mapping currently allows at the given index. The index is relevant
> * due to alignment considerations the mapping might have. The returned order
> * may be less than the size passed.
> *
> * Like __filemap_get_folio order calculation.
> *
> * Return: The order.
> */
> static inline unsigned int
> shmem_mapping_size_order(struct address_space *mapping, pgoff_t index,
> size_t size)
> * Return: The order.
> */
> static inline unsigned int
> shmem_mapping_size_order(struct address_space *mapping, pgoff_t index,
> size_t size)
> {
> unsigned int order = get_order(max_t(size_t, size, PAGE_SIZE));
>
> if (!mapping_large_folio_support(mapping))
> return 0;
>
> /* If we're not aligned, allocate a smaller folio */
> if (index & ((1UL << order) - 1))
> order = __ffs(index);
>
> return min_t(size_t, order, MAX_PAGECACHE_ORDER);
> }
>
> order-1 is already supported by commit [2], so I've removed that condition as
> well.
>
> [2] 8897277acfef7f70fdecc054073bea2542fc7a1b ("mm: support order-1 folios in the
> page cache").
Great. Thanks Daniel.
I will include your new version if there are no obvious objections to
this patchset.
next prev parent reply other threads:[~2024-08-08 1:56 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-24 7:03 [RFC PATCH 0/3] Support large folios for tmpfs Baolin Wang
2024-07-24 7:03 ` [RFC PATCH 1/3] mm: shmem: add file length arg in shmem_get_folio() path Baolin Wang
2024-07-24 7:03 ` [RFC PATCH 2/3] mm: shmem: add large folio support to the write and fallocate paths Baolin Wang
2024-08-04 18:46 ` Daniel Gomez
2024-08-08 1:56 ` Baolin Wang [this message]
2024-07-24 7:04 ` [RFC PATCH 3/3] mm: shmem: use mTHP interface to control huge orders for tmpfs Baolin Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=98cb8158-2087-4100-9789-1a45c0c04fc4@linux.alibaba.com \
--to=baolin.wang@linux.alibaba.com \
--cc=21cnbao@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=da.gomez@samsung.com \
--cc=david@redhat.com \
--cc=hughd@google.com \
--cc=ioworker0@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=p.raghav@samsung.com \
--cc=ryan.roberts@arm.com \
--cc=willy@infradead.org \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®