mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
mm: use zone lock guard in set_migratetype_isolate()
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>
This commit is contained in:
parent
055526c21e
commit
feb0df835f
|
|
@ -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;
|
||||
}
|
||||
zone->nr_isolate_pageblock++;
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
if (mode == PB_ISOLATE_MODE_MEM_OFFLINE) {
|
||||
/*
|
||||
* printk() with zone->lock held will likely trigger a
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user