]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm: use zone lock guard in set_migratetype_isolate()
authorDmitry Ilvokhin <d@ilvokhin.com>
Wed, 29 Apr 2026 12:02:09 +0000 (12:02 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 May 2026 04:05:05 +0000 (21:05 -0700)
Use spinlock_irqsave scoped lock guard in set_migratetype_isolate() to
replace the explicit lock/unlock pattern with automatic scope-based
cleanup.  The scoped variant is used to keep dump_page() outside the
locked section to avoid a lockdep splat.

Link: https://lore.kernel.org/6883351ad7f74d20875fff30e0e3214a089cea97.1777462630.git.d@ilvokhin.com
Signed-off-by: Dmitry Ilvokhin <d@ilvokhin.com>
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: Zi Yan <ziy@nvidia.com>
Cc: Brendan Jackman <jackmanb@google.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page_isolation.c

index 9d606052dd809f168712712d1b4751a47a5258fa..7a9d631945a34fe743a0b581257c30441b5ecca6 100644 (file)
@@ -167,48 +167,40 @@ static int set_migratetype_isolate(struct page *page, enum pb_isolate_mode mode,
 {
        struct zone *zone = page_zone(page);
        struct page *unmovable;
-       unsigned long flags;
        unsigned long check_unmovable_start, check_unmovable_end;
 
        if (PageUnaccepted(page))
                accept_page(page);
 
-       spin_lock_irqsave(&zone->lock, flags);
-
-       /*
-        * We assume the caller intended to SET migrate type to isolate.
-        * If it is already set, then someone else must have raced and
-        * set it before us.
-        */
-       if (is_migrate_isolate_page(page)) {
-               spin_unlock_irqrestore(&zone->lock, flags);
-               return -EBUSY;
-       }
-
-       /*
-        * FIXME: Now, memory hotplug doesn't call shrink_slab() by itself.
-        * We just check MOVABLE pages.
-        *
-        * Pass the intersection of [start_pfn, end_pfn) and the page's pageblock
-        * to avoid redundant checks.
-        */
-       check_unmovable_start = max(page_to_pfn(page), start_pfn);
-       check_unmovable_end = min(pageblock_end_pfn(page_to_pfn(page)),
-                                 end_pfn);
-
-       unmovable = has_unmovable_pages(check_unmovable_start, check_unmovable_end,
-                       mode);
-       if (!unmovable) {
-               if (!pageblock_isolate_and_move_free_pages(zone, page)) {
-                       spin_unlock_irqrestore(&zone->lock, flags);
+       scoped_guard(spinlock_irqsave, &zone->lock) {
+               /*
+                * We assume the caller intended to SET migrate type to
+                * isolate. If it is already set, then someone else must have
+                * raced and set it before us.
+                */
+               if (is_migrate_isolate_page(page))
                        return -EBUSY;
+
+               /*
+                * FIXME: Now, memory hotplug doesn't call shrink_slab() by
+                * itself. We just check MOVABLE pages.
+                *
+                * Pass the intersection of [start_pfn, end_pfn) and the page's
+                * pageblock to avoid redundant checks.
+                */
+               check_unmovable_start = max(page_to_pfn(page), start_pfn);
+               check_unmovable_end = min(pageblock_end_pfn(page_to_pfn(page)),
+                                         end_pfn);
+
+               unmovable = has_unmovable_pages(check_unmovable_start,
+                               check_unmovable_end, mode);
+               if (!unmovable) {
+                       if (!pageblock_isolate_and_move_free_pages(zone, page))
+                               return -EBUSY;
+                       zone->nr_isolate_pageblock++;
+                       return 0;
                }
-               zone->nr_isolate_pageblock++;
-               spin_unlock_irqrestore(&zone->lock, flags);
-               return 0;
        }
-
-       spin_unlock_irqrestore(&zone->lock, flags);
        if (mode == PB_ISOLATE_MODE_MEM_OFFLINE) {
                /*
                 * printk() with zone->lock held will likely trigger a