]> www.infradead.org Git - users/jedix/linux-maple.git/commit
mm/migrate: fix kernel BUG at mm/compaction.c:2761!
authorHugh Dickins <hughd@google.com>
Wed, 12 Jun 2024 05:06:20 +0000 (22:06 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 15 Jun 2024 17:43:07 +0000 (10:43 -0700)
commit8e279f970b5cb0628f856b6735e2e47b4da9f76e
tree4c30ff4e50f1cb6fc4fbc5b248be7901f1d90a23
parente7d2a28bd0b27e43bff3f516ee0607d776b019f4
mm/migrate: fix kernel BUG at mm/compaction.c:2761!

I hit the VM_BUG_ON(!list_empty(&cc->migratepages)) in compact_zone(); and
if DEBUG_VM were off, then pages would be lost on a local list.

Our convention is that if migrate_pages() reports complete success (0),
then the migratepages list will be empty; but if it reports an error or
some pages remaining, then its caller must putback_movable_pages().

There's a new case in which migrate_pages() has been reporting complete
success, but returning with pages left on the migratepages list: when
migrate_pages_batch() successfully split a folio on the deferred list, but
then the "Failure isn't counted" call does not dispose of them all.

Since that block is expecting the large folio to have been counted as 1
failure already, and since the return code is later adjusted to success
whenever the returned list is found empty, the simple way to fix this
safely is to count splitting the deferred folio as "a failure".

Link: https://lkml.kernel.org/r/46c948b4-4dd8-6e03-4c7b-ce4e81cfa536@google.com
Fixes: 7262f208ca68 ("mm/migrate: split source folio if it is on deferred split list")
Signed-off-by: Hugh Dickins <hughd@google.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: "Huang, Ying" <ying.huang@intel.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/migrate.c