]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm: use zone lock guard in take_page_off_buddy()
authorDmitry Ilvokhin <d@ilvokhin.com>
Wed, 29 Apr 2026 12:02:10 +0000 (12:02 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 May 2026 04:05:05 +0000 (21:05 -0700)
Use spinlock_irqsave zone lock guard in take_page_off_buddy() to replace
the explicit lock/unlock pattern with automatic scope-based cleanup.

This also allows to return directly from the loop, removing the 'ret'
variable.

Link: https://lore.kernel.org/a981721632a981f148c63e3f7df3d1116a0c3f6d.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>
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>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page_alloc.c

index 56ba22e1a81699eb4c19925b4e9055f3b6ef3a1c..f5ad74490c5d2c15bf08e1a934e90db68765812f 100644 (file)
@@ -7644,11 +7644,9 @@ bool take_page_off_buddy(struct page *page)
 {
        struct zone *zone = page_zone(page);
        unsigned long pfn = page_to_pfn(page);
-       unsigned long flags;
        unsigned int order;
-       bool ret = false;
 
-       spin_lock_irqsave(&zone->lock, flags);
+       guard(spinlock_irqsave)(&zone->lock);
        for (order = 0; order < NR_PAGE_ORDERS; order++) {
                struct page *page_head = page - (pfn & ((1 << order) - 1));
                int page_order = buddy_order(page_head);
@@ -7663,14 +7661,12 @@ bool take_page_off_buddy(struct page *page)
                        break_down_buddy_pages(zone, page_head, page, 0,
                                                page_order, migratetype);
                        SetPageHWPoisonTakenOff(page);
-                       ret = true;
-                       break;
+                       return true;
                }
                if (page_count(page_head) > 0)
                        break;
        }
-       spin_unlock_irqrestore(&zone->lock, flags);
-       return ret;
+       return false;
 }
 
 /*