Commit 213268869301 for kernel

commit 213268869301f747d19ca00a391757a6cf2d4fa8
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Tue Nov 3 17:16:49 2026 +0100

    mm: page_isolation: do not take slab pages for free

    page_is_unmovable() regards a page with a reference count of zero as free
    or about to be freed. Since slab allocates frozen pages, they will
    be wrongly considered to be freed if order 0 (higher-order compound
    pages are caught earlier).

    If such slabs are the only unmovable pages of a memory block, memory
    offlining now isolates the block, this can lead to offline_pages()
    looping without progress.

    Thus detect the slab pages as removable to return -EBUSY, as would
    happen before commit 9aec2fb0fd5e ("slab: allocate frozen pages").

    Fixes: 9aec2fb0fd5e ("slab: allocate frozen pages")
    Cc: stable@vger.kernel.org
    Assisted-by: LLM
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
    Reviewed-by: Zi Yan <ziy@nvidia.com>
    Reviewed-by: Johannes Weiner <hannes@cmpxchg.org>
    Link: https://patch.msgid.link/20261103-pgalloc-ai-hotfixes-v2-3-e0d2890ab74f@kernel.org
    Signed-off-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>

diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index c9cc42e54f05..0ab9a6e09222 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1832,6 +1832,13 @@ static int scan_movable_pages(unsigned long start, unsigned long end,
 		if (PageOffline(page) && page_count(page))
 			return -EBUSY;

+		/*
+		 * A page that was allocated, but was not a slab page yet, when
+		 * its pageblock was isolated.
+		 */
+		if (PageSlab(page))
+			return -EBUSY;
+
 		folio = page_folio(page);
 		if (!folio_test_hugetlb(folio))
 			continue;
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 5aaad037384e..f4f0571607ab 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -74,6 +74,13 @@ bool page_is_unmovable(struct zone *zone, struct page *page,
 		return false;
 	}

+	/*
+	 * Slab pages are frozen: do not take their reference count of zero
+	 * for that of a free page.
+	 */
+	if (PageSlab(page))
+		return true;
+
 	/*
 	 * We can't use page_count without pin a page
 	 * because another CPU can free compound page.