• Hugh Dickins's avatar
    mm/migrate: fix kernel BUG at mm/compaction.c:2761! · 8e279f97
    Hugh Dickins authored
    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: 7262f208 ("mm/migrate: split source folio if it is on deferred split list")
    Signed-off-by: default avatarHugh 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: default avatarAndrew Morton <akpm@linux-foundation.org>
    8e279f97
migrate.c 70.5 KB