From: David Hildenbrand <david@redhat.com>
To: Matthew Wilcox <willy@infradead.org>,
Charan Teja Kalla <quic_charante@quicinc.com>
Cc: gregkh@linuxfoundation.org, akpm@linux-foundation.org,
vbabka@suse.cz, dhowells@redhat.com, surenb@google.com,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
# see patch description <stable@vger.kernel.org>,
Huang Ying <ying.huang@intel.com>
Subject: Re: [PATCH] mm/huge_memory: fix swap entry values of tail pages of THP
Date: Wed, 14 Feb 2024 15:34:24 +0100 [thread overview]
Message-ID: <f2ad5918-7e36-4a7c-a619-c6807cfca5ec@redhat.com> (raw)
In-Reply-To: <ZczLoOqdpMJpkO5N@casper.infradead.org>
On 14.02.24 15:18, Matthew Wilcox wrote:
> On Wed, Feb 14, 2024 at 12:04:10PM +0530, Charan Teja Kalla wrote:
>>> 1) Is it broken in 5.15? Did you actually try to reproduce or is this
>>> just a guess?
>>>
>>
>> We didn't run the tests with THP enabled on 5.15, __so we didn't
>> encounter this issue__ on older to 6.1 kernels.
>>
>> I mentioned that issue exists is based on my understanding after code
>> walk through. To be specific, I just looked to the
>> migrate_pages()->..->migrate_page_move_mapping() &
>> __split_huge_page_tail() where the ->private field of thp sub-pages is
>> not filled with swap entry. If it could have set, I think these are the
>> only places where it would have done, per my understanding. CMIW.
>
> I think you have a misunderstanding. David's patch cfeed8ffe55b (part
> of 6.6) _stopped_ us using the tail ->private entries. So in 6.1, these
> tail pages should already have page->private set, and I don't understand
> what you're fixing.
I think the issue is, that migrate_page_move_mapping() /
folio_migrate_mapping() would update ->private for a folio in the
swapcache (head page)
newfolio->private = folio_get_private(folio);
but not the ->private of the tail pages.
So once you migrate a THP that is in the swapcache, ->private of the
tail pages would not be migrated and, therefore, be stale/wrong.
Even before your patch that was the case.
Looking at migrate_page_move_mapping(), we had:
if (PageSwapBacked(page)) {
__SetPageSwapBacked(newpage);
if (PageSwapCache(page)) {
SetPageSwapCache(newpage);
set_page_private(newpage, page_private(page));
}
} else {
VM_BUG_ON_PAGE(PageSwapCache(page), page);
}
I don't immediately see where the tail pages would similarly get updated
(via set_page_private).
With my patch the problem is gone, because the tail page entries don't
have to be migrated, because they are unused.
Maybe this was an oversight from THP_SWAP -- 38d8b4e6bdc8 ("mm, THP,
swap: delay splitting THP during swap out").
It did update __add_to_swap_cache():
for (i = 0; i < nr; i++) {
set_page_private(page + i, entry.val + i);
error = radix_tree_insert(&address_space->page_tree,
idx + i, page + i);
if (unlikely(error))
break;
}
and similarly __delete_from_swap_cache().
But I don't see any updates to migration code.
Now, it could be that THP migration was added later (post 2017), in that
case the introducing commit would not have been 38d8b4e6bdc8.
--
Cheers,
David / dhildenb
next prev parent reply other threads:[~2024-02-14 14:34 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-13 8:48 [PATCH] mm/huge_memory: fix swap entry values of tail pages of THP Charan Teja Kalla
2024-02-13 8:54 ` Matthew Wilcox
2024-02-13 9:10 ` Charan Teja Kalla
2024-02-13 9:25 ` David Hildenbrand
2024-02-13 16:27 ` Charan Teja Kalla
2024-02-13 18:36 ` David Hildenbrand
2024-02-14 6:34 ` Charan Teja Kalla
2024-02-14 14:18 ` Matthew Wilcox
2024-02-14 14:34 ` David Hildenbrand [this message]
2024-02-27 14:11 ` David Hildenbrand
2024-02-27 14:52 ` Zi Yan
2024-02-27 15:01 ` David Hildenbrand
2024-02-27 15:20 ` Zi Yan
2024-02-27 16:15 ` Zi Yan
2024-02-28 15:36 ` Charan Teja Kalla
2024-03-04 10:48 ` Greg KH
2024-02-13 9:41 ` Greg KH
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=f2ad5918-7e36-4a7c-a619-c6807cfca5ec@redhat.com \
--to=david@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=quic_charante@quicinc.com \
--cc=stable@vger.kernel.org \
--cc=surenb@google.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
--cc=ying.huang@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.