diff mbox series

[resend,1/2] mm: always use base address when clear gigantic page

Message ID 20241025004456.3435808-1-wangkefeng.wang@huawei.com (mailing list archive)
State New
Headers show
Series [resend,1/2] mm: always use base address when clear gigantic page | expand

Commit Message

Kefeng Wang Oct. 25, 2024, 12:44 a.m. UTC
When clear gigantic page, it zeros page from the first subpage to
the last subpage, that is, aligned base address is needed in it,
and we don't need to aligned down the address in the caller as the
real address will be passed to process_huge_page().

Fixes: 78fefd04c123 ("mm: memory: convert clear_huge_page() to folio_zero_user()")
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
 fs/hugetlbfs/inode.c | 2 +-
 mm/memory.c          | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

Comments

Andrew Morton Oct. 25, 2024, 10:56 p.m. UTC | #1
On Fri, 25 Oct 2024 08:44:55 +0800 Kefeng Wang <wangkefeng.wang@huawei.com> wrote:

> When clear gigantic page, it zeros page from the first subpage to
> the last subpage, that is, aligned base address is needed in it,
> and we don't need to aligned down the address in the caller as the
> real address will be passed to process_huge_page().

Matthew just told us that folios con't have subpages
(https://lkml.kernel.org/r/ZxsRCyBSO-C27Uzn@casper.infradead.org).

Please carefully describe the impact of this change.  I think it's
"small cleanup and optimization?"

Also, I find the changelog rather hard to follow.  I think we're adding
the alignment operation to the callee and hence removing it from the
caller?
Kefeng Wang Oct. 26, 2024, 1:34 a.m. UTC | #2
On 2024/10/26 6:56, Andrew Morton wrote:
> On Fri, 25 Oct 2024 08:44:55 +0800 Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
> 
>> When clear gigantic page, it zeros page from the first subpage to
>> the last subpage, that is, aligned base address is needed in it,
>> and we don't need to aligned down the address in the caller as the
>> real address will be passed to process_huge_page().
> 
> Matthew just told us that folios con't have subpages
> (https://lkml.kernel.org/r/ZxsRCyBSO-C27Uzn@casper.infradead.org).
> 

OK, will change subpage to page.

> Please carefully describe the impact of this change.  I think it's
> "small cleanup and optimization?"
> 
> Also, I find the changelog rather hard to follow.  I think we're adding
> the alignment operation to the callee and hence removing it from the
> caller?
> 

Sorry for the confuse, there is some different between gigantic
page(nr_pages > MAX_ORDER_NR_PAGE) and non-gigantic page,

1) for gigantic page, it always clear/copy page from the fist page to
the last page, see copy_user_gigantic_page/clear_gigantic_page, but if 
directly pass addr_hint which maybe not the address of the first page,
then if arch's code use this addr_hint to flush cache, it may flush the 
wrong cache.

2) for non-gigantic page, it calculate the base address inside, see 
process_huge_page, if we passed the wrong addr_hint, it only has 
performance impact(not sure, but at least no different on arm64), no
function impact.

Will update the change and resend.
diff mbox series

Patch

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index a4441fb77f7c..a5ea006f403e 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -825,7 +825,7 @@  static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
 			error = PTR_ERR(folio);
 			goto out;
 		}
-		folio_zero_user(folio, ALIGN_DOWN(addr, hpage_size));
+		folio_zero_user(folio, addr);
 		__folio_mark_uptodate(folio);
 		error = hugetlb_add_to_page_cache(folio, mapping, index);
 		if (unlikely(error)) {
diff --git a/mm/memory.c b/mm/memory.c
index 48e534aa939c..934ab5fff537 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -6802,6 +6802,7 @@  static void clear_gigantic_page(struct folio *folio, unsigned long addr,
 	int i;
 
 	might_sleep();
+	addr = ALIGN_DOWN(addr, folio_size(folio));
 	for (i = 0; i < nr_pages; i++) {
 		cond_resched();
 		clear_user_highpage(folio_page(folio, i), addr + i * PAGE_SIZE);