From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com --- mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/mm/migrate.c b/mm/migrate.c index c93dd6a31c31..c5968021fde0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -423,8 +423,12 @@ int folio_migrate_mapping(struct address_space *mapping, if (folio_test_swapbacked(folio)) { __folio_set_swapbacked(newfolio); if (folio_test_swapcache(folio)) { + int i; + folio_set_swapcache(newfolio); - newfolio->private = folio_get_private(folio); + for (i = 0; i < nr; i++) + set_page_private(folio_page(newfolio, i), + page_private(folio_page(folio, i))); } entries = nr; } else {
On 5 Mar 2024, at 11:13, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Corresponding swapcache entries need to be updated as well. e71769ae5260 ("mm: enable thp migration for shmem thp") fixed it already.
Fixes: 616b8371539a ("mm: thp: enable thp migration in generic path")
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/mm/migrate.c b/mm/migrate.c index c93dd6a31c31..c5968021fde0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -423,8 +423,12 @@ int folio_migrate_mapping(struct address_space *mapping, if (folio_test_swapbacked(folio)) { __folio_set_swapbacked(newfolio); if (folio_test_swapcache(folio)) {
int i;
folio_set_swapcache(newfolio);
newfolio->private = folio_get_private(folio);
for (i = 0; i < nr; i++)
set_page_private(folio_page(newfolio, i),
} entries = nr; } else {page_private(folio_page(folio, i)));
-- 2.43.0
-- Best Regards, Yan, Zi
Thanks David for various inputs on this patch!!.
On 3/5/2024 9:47 PM, Zi Yan wrote:
On 5 Mar 2024, at 11:13, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Corresponding swapcache entries need to be updated as well. e71769ae5260 ("mm: enable thp migration for shmem thp") fixed it already.
Fixes: 616b8371539a ("mm: thp: enable thp migration in generic path")
Thanks Zi Yan, for posting this patch. I think below tag too applicable?
Closes: https://lore.kernel.org/linux-mm/1707814102-22682-1-git-send-email-quic_char...
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/mm/migrate.c b/mm/migrate.c index c93dd6a31c31..c5968021fde0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -423,8 +423,12 @@ int folio_migrate_mapping(struct address_space *mapping, if (folio_test_swapbacked(folio)) { __folio_set_swapbacked(newfolio); if (folio_test_swapcache(folio)) {
int i;
folio_set_swapcache(newfolio);
newfolio->private = folio_get_private(folio);
for (i = 0; i < nr; i++)
set_page_private(folio_page(newfolio, i),
} entries = nr; } else {page_private(folio_page(folio, i)));
-- 2.43.0
-- Best Regards, Yan, Zi
On 5 Mar 2024, at 11:22, Charan Teja Kalla wrote:
Thanks David for various inputs on this patch!!.
On 3/5/2024 9:47 PM, Zi Yan wrote:
On 5 Mar 2024, at 11:13, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Corresponding swapcache entries need to be updated as well. e71769ae5260 ("mm: enable thp migration for shmem thp") fixed it already.
Fixes: 616b8371539a ("mm: thp: enable thp migration in generic path")
Thanks Zi Yan, for posting this patch. I think below tag too applicable?
Closes: https://lore.kernel.org/linux-mm/1707814102-22682-1-git-send-email-quic_char...
Right. Let me add it to other stable fixes I am going to send.
Hi Greg,
Could you add the information above (text, Fixes, and Closes) to this patch? Or do you want me to resend?
Thanks.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/mm/migrate.c b/mm/migrate.c index c93dd6a31c31..c5968021fde0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -423,8 +423,12 @@ int folio_migrate_mapping(struct address_space *mapping, if (folio_test_swapbacked(folio)) { __folio_set_swapbacked(newfolio); if (folio_test_swapcache(folio)) {
int i;
folio_set_swapcache(newfolio);
newfolio->private = folio_get_private(folio);
for (i = 0; i < nr; i++)
set_page_private(folio_page(newfolio, i),
} entries = nr; } else {page_private(folio_page(folio, i)));
-- 2.43.0
-- Best Regards, Yan, Zi
-- Best Regards, Yan, Zi
On 05.03.24 17:13, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/mm/migrate.c b/mm/migrate.c index c93dd6a31c31..c5968021fde0 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -423,8 +423,12 @@ int folio_migrate_mapping(struct address_space *mapping, if (folio_test_swapbacked(folio)) { __folio_set_swapbacked(newfolio); if (folio_test_swapcache(folio)) {
int i;
folio_set_swapcache(newfolio);
newfolio->private = folio_get_private(folio);
for (i = 0; i < nr; i++)
set_page_private(folio_page(newfolio, i),
} entries = nr; } else {page_private(folio_page(folio, i)));
Hopefully Charan can run the reproducer against this.
Acked-by: David Hildenbrand david@redhat.com
On Tue, Mar 05, 2024 at 11:13:13AM -0500, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
What is the git commit id of this change in Linus's tree?
thanks,
greg k-h
On 05.03.24 23:04, Greg KH wrote:
On Tue, Mar 05, 2024 at 11:13:13AM -0500, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
What is the git commit id of this change in Linus's tree?
Unfortunately, we had to do stable-only versions, because the backport of the "accidental" fix that removes the per-subpage "private" information would be non-trivial, especially for pre-folio-converison times.
The accidental fix is
07e09c483cbef2a252f75d95670755a0607288f5
On Tue, Mar 05, 2024 at 11:09:17PM +0100, David Hildenbrand wrote:
On 05.03.24 23:04, Greg KH wrote:
On Tue, Mar 05, 2024 at 11:13:13AM -0500, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
What is the git commit id of this change in Linus's tree?
Unfortunately, we had to do stable-only versions, because the backport of the "accidental" fix that removes the per-subpage "private" information would be non-trivial, especially for pre-folio-converison times.
The accidental fix is
07e09c483cbef2a252f75d95670755a0607288f5
None of that is obvious at all here, we need loads of documentation in the changelog text that says all of that please.
thanks,
greg k-h
On 5 Mar 2024, at 17:32, Greg KH wrote:
On Tue, Mar 05, 2024 at 11:09:17PM +0100, David Hildenbrand wrote:
On 05.03.24 23:04, Greg KH wrote:
On Tue, Mar 05, 2024 at 11:13:13AM -0500, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
What is the git commit id of this change in Linus's tree?
Unfortunately, we had to do stable-only versions, because the backport of the "accidental" fix that removes the per-subpage "private" information would be non-trivial, especially for pre-folio-converison times.
The accidental fix is
07e09c483cbef2a252f75d95670755a0607288f5
None of that is obvious at all here, we need loads of documentation in the changelog text that says all of that please.
How about?
Before 07e09c483cbe ("mm/huge_memory: work on folio->swap instead of page->private when splitting folio"), when a THP is added into swapcache, each of its subpages has its own swapcache entry and need ->private pointing to the right swapcache entry. THP added to swapcache function is added in 38d8b4e6bdc87 ("mm, THP, swap: delay splitting THP during swap out"). When THP migration was added in 616b8371539a6 ("mm: thp: enable thp migration in generic path"), it did not take care of swapcached THP's subpages, neither updated subpage's ->private nor replaced subpage pointer in the swapcache. Later, e71769ae5260 ("mm: enable thp migration for shmem thp") fixed swapcache update part. Now this patch fixes the subpage ->private update part.
-- Best Regards, Yan, Zi
On Tue, Mar 05, 2024 at 06:13:39PM -0500, Zi Yan wrote:
On 5 Mar 2024, at 17:32, Greg KH wrote:
On Tue, Mar 05, 2024 at 11:09:17PM +0100, David Hildenbrand wrote:
On 05.03.24 23:04, Greg KH wrote:
On Tue, Mar 05, 2024 at 11:13:13AM -0500, Zi Yan wrote:
From: Zi Yan ziy@nvidia.com
The tail pages in a THP can have swap entry information stored in their private field. When migrating to a new page, all tail pages of the new page need to update ->private to avoid future data corruption.
Signed-off-by: Zi Yan ziy@nvidia.com
mm/migrate.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
What is the git commit id of this change in Linus's tree?
Unfortunately, we had to do stable-only versions, because the backport of the "accidental" fix that removes the per-subpage "private" information would be non-trivial, especially for pre-folio-converison times.
The accidental fix is
07e09c483cbef2a252f75d95670755a0607288f5
None of that is obvious at all here, we need loads of documentation in the changelog text that says all of that please.
How about?
Before 07e09c483cbe ("mm/huge_memory: work on folio->swap instead of page->private when splitting folio"), when a THP is added into swapcache, each of its subpages has its own swapcache entry and need ->private pointing to the right swapcache entry. THP added to swapcache function is added in 38d8b4e6bdc87 ("mm, THP, swap: delay splitting THP during swap out"). When THP migration was added in 616b8371539a6 ("mm: thp: enable thp migration in generic path"), it did not take care of swapcached THP's subpages, neither updated subpage's ->private nor replaced subpage pointer in the swapcache. Later, e71769ae5260 ("mm: enable thp migration for shmem thp") fixed swapcache update part. Now this patch fixes the subpage ->private update part.
That's better than what is there now :)
So yes, please resend all of these with the new text and then we can queue them up.
thanks,
greg k-h
linux-stable-mirror@lists.linaro.org