LCOV - code coverage report
Current view: top level - mm - compaction.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 38 1000 3.8 %
Date: 2023-08-24 13:40:31 Functions: 5 52 9.6 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * linux/mm/compaction.c
       4             :  *
       5             :  * Memory compaction for the reduction of external fragmentation. Note that
       6             :  * this heavily depends upon page migration to do all the real heavy
       7             :  * lifting
       8             :  *
       9             :  * Copyright IBM Corp. 2007-2010 Mel Gorman <mel@csn.ul.ie>
      10             :  */
      11             : #include <linux/cpu.h>
      12             : #include <linux/swap.h>
      13             : #include <linux/migrate.h>
      14             : #include <linux/compaction.h>
      15             : #include <linux/mm_inline.h>
      16             : #include <linux/sched/signal.h>
      17             : #include <linux/backing-dev.h>
      18             : #include <linux/sysctl.h>
      19             : #include <linux/sysfs.h>
      20             : #include <linux/page-isolation.h>
      21             : #include <linux/kasan.h>
      22             : #include <linux/kthread.h>
      23             : #include <linux/freezer.h>
      24             : #include <linux/page_owner.h>
      25             : #include <linux/psi.h>
      26             : #include "internal.h"
      27             : 
      28             : #ifdef CONFIG_COMPACTION
      29             : /*
      30             :  * Fragmentation score check interval for proactive compaction purposes.
      31             :  */
      32             : #define HPAGE_FRAG_CHECK_INTERVAL_MSEC  (500)
      33             : 
      34             : static inline void count_compact_event(enum vm_event_item item)
      35             : {
      36           0 :         count_vm_event(item);
      37             : }
      38             : 
      39             : static inline void count_compact_events(enum vm_event_item item, long delta)
      40             : {
      41           0 :         count_vm_events(item, delta);
      42             : }
      43             : #else
      44             : #define count_compact_event(item) do { } while (0)
      45             : #define count_compact_events(item, delta) do { } while (0)
      46             : #endif
      47             : 
      48             : #if defined CONFIG_COMPACTION || defined CONFIG_CMA
      49             : 
      50             : #define CREATE_TRACE_POINTS
      51             : #include <trace/events/compaction.h>
      52             : 
      53             : #define block_start_pfn(pfn, order)     round_down(pfn, 1UL << (order))
      54             : #define block_end_pfn(pfn, order)       ALIGN((pfn) + 1, 1UL << (order))
      55             : 
      56             : /*
      57             :  * Page order with-respect-to which proactive compaction
      58             :  * calculates external fragmentation, which is used as
      59             :  * the "fragmentation score" of a node/zone.
      60             :  */
      61             : #if defined CONFIG_TRANSPARENT_HUGEPAGE
      62             : #define COMPACTION_HPAGE_ORDER  HPAGE_PMD_ORDER
      63             : #elif defined CONFIG_HUGETLBFS
      64             : #define COMPACTION_HPAGE_ORDER  HUGETLB_PAGE_ORDER
      65             : #else
      66             : #define COMPACTION_HPAGE_ORDER  (PMD_SHIFT - PAGE_SHIFT)
      67             : #endif
      68             : 
      69           0 : static unsigned long release_freepages(struct list_head *freelist)
      70             : {
      71             :         struct page *page, *next;
      72           0 :         unsigned long high_pfn = 0;
      73             : 
      74           0 :         list_for_each_entry_safe(page, next, freelist, lru) {
      75           0 :                 unsigned long pfn = page_to_pfn(page);
      76           0 :                 list_del(&page->lru);
      77           0 :                 __free_page(page);
      78           0 :                 if (pfn > high_pfn)
      79           0 :                         high_pfn = pfn;
      80             :         }
      81             : 
      82           0 :         return high_pfn;
      83             : }
      84             : 
      85           0 : static void split_map_pages(struct list_head *list)
      86             : {
      87             :         unsigned int i, order, nr_pages;
      88             :         struct page *page, *next;
      89           0 :         LIST_HEAD(tmp_list);
      90             : 
      91           0 :         list_for_each_entry_safe(page, next, list, lru) {
      92           0 :                 list_del(&page->lru);
      93             : 
      94           0 :                 order = page_private(page);
      95           0 :                 nr_pages = 1 << order;
      96             : 
      97           0 :                 post_alloc_hook(page, order, __GFP_MOVABLE);
      98           0 :                 if (order)
      99           0 :                         split_page(page, order);
     100             : 
     101           0 :                 for (i = 0; i < nr_pages; i++) {
     102           0 :                         list_add(&page->lru, &tmp_list);
     103           0 :                         page++;
     104             :                 }
     105             :         }
     106             : 
     107           0 :         list_splice(&tmp_list, list);
     108           0 : }
     109             : 
     110             : #ifdef CONFIG_COMPACTION
     111           0 : bool PageMovable(struct page *page)
     112             : {
     113             :         const struct movable_operations *mops;
     114             : 
     115             :         VM_BUG_ON_PAGE(!PageLocked(page), page);
     116           0 :         if (!__PageMovable(page))
     117             :                 return false;
     118             : 
     119           0 :         mops = page_movable_ops(page);
     120           0 :         if (mops)
     121             :                 return true;
     122             : 
     123           0 :         return false;
     124             : }
     125             : 
     126           0 : void __SetPageMovable(struct page *page, const struct movable_operations *mops)
     127             : {
     128             :         VM_BUG_ON_PAGE(!PageLocked(page), page);
     129             :         VM_BUG_ON_PAGE((unsigned long)mops & PAGE_MAPPING_MOVABLE, page);
     130           0 :         page->mapping = (void *)((unsigned long)mops | PAGE_MAPPING_MOVABLE);
     131           0 : }
     132             : EXPORT_SYMBOL(__SetPageMovable);
     133             : 
     134           0 : void __ClearPageMovable(struct page *page)
     135             : {
     136             :         VM_BUG_ON_PAGE(!PageMovable(page), page);
     137             :         /*
     138             :          * This page still has the type of a movable page, but it's
     139             :          * actually not movable any more.
     140             :          */
     141           0 :         page->mapping = (void *)PAGE_MAPPING_MOVABLE;
     142           0 : }
     143             : EXPORT_SYMBOL(__ClearPageMovable);
     144             : 
     145             : /* Do not skip compaction more than 64 times */
     146             : #define COMPACT_MAX_DEFER_SHIFT 6
     147             : 
     148             : /*
     149             :  * Compaction is deferred when compaction fails to result in a page
     150             :  * allocation success. 1 << compact_defer_shift, compactions are skipped up
     151             :  * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
     152             :  */
     153             : static void defer_compaction(struct zone *zone, int order)
     154             : {
     155           0 :         zone->compact_considered = 0;
     156           0 :         zone->compact_defer_shift++;
     157             : 
     158           0 :         if (order < zone->compact_order_failed)
     159           0 :                 zone->compact_order_failed = order;
     160             : 
     161           0 :         if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
     162           0 :                 zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
     163             : 
     164             :         trace_mm_compaction_defer_compaction(zone, order);
     165             : }
     166             : 
     167             : /* Returns true if compaction should be skipped this time */
     168             : static bool compaction_deferred(struct zone *zone, int order)
     169             : {
     170           0 :         unsigned long defer_limit = 1UL << zone->compact_defer_shift;
     171             : 
     172           0 :         if (order < zone->compact_order_failed)
     173             :                 return false;
     174             : 
     175             :         /* Avoid possible overflow */
     176           0 :         if (++zone->compact_considered >= defer_limit) {
     177           0 :                 zone->compact_considered = defer_limit;
     178             :                 return false;
     179             :         }
     180             : 
     181             :         trace_mm_compaction_deferred(zone, order);
     182             : 
     183             :         return true;
     184             : }
     185             : 
     186             : /*
     187             :  * Update defer tracking counters after successful compaction of given order,
     188             :  * which means an allocation either succeeded (alloc_success == true) or is
     189             :  * expected to succeed.
     190             :  */
     191           0 : void compaction_defer_reset(struct zone *zone, int order,
     192             :                 bool alloc_success)
     193             : {
     194           0 :         if (alloc_success) {
     195           0 :                 zone->compact_considered = 0;
     196           0 :                 zone->compact_defer_shift = 0;
     197             :         }
     198           0 :         if (order >= zone->compact_order_failed)
     199           0 :                 zone->compact_order_failed = order + 1;
     200             : 
     201           0 :         trace_mm_compaction_defer_reset(zone, order);
     202           0 : }
     203             : 
     204             : /* Returns true if restarting compaction after many failures */
     205             : static bool compaction_restarting(struct zone *zone, int order)
     206             : {
     207           0 :         if (order < zone->compact_order_failed)
     208             :                 return false;
     209             : 
     210           0 :         return zone->compact_defer_shift == COMPACT_MAX_DEFER_SHIFT &&
     211           0 :                 zone->compact_considered >= 1UL << zone->compact_defer_shift;
     212             : }
     213             : 
     214             : /* Returns true if the pageblock should be scanned for pages to isolate. */
     215             : static inline bool isolation_suitable(struct compact_control *cc,
     216             :                                         struct page *page)
     217             : {
     218           0 :         if (cc->ignore_skip_hint)
     219             :                 return true;
     220             : 
     221           0 :         return !get_pageblock_skip(page);
     222             : }
     223             : 
     224             : static void reset_cached_positions(struct zone *zone)
     225             : {
     226           0 :         zone->compact_cached_migrate_pfn[0] = zone->zone_start_pfn;
     227           0 :         zone->compact_cached_migrate_pfn[1] = zone->zone_start_pfn;
     228           0 :         zone->compact_cached_free_pfn =
     229           0 :                                 pageblock_start_pfn(zone_end_pfn(zone) - 1);
     230             : }
     231             : 
     232             : #ifdef CONFIG_SPARSEMEM
     233             : /*
     234             :  * If the PFN falls into an offline section, return the start PFN of the
     235             :  * next online section. If the PFN falls into an online section or if
     236             :  * there is no next online section, return 0.
     237             :  */
     238             : static unsigned long skip_offline_sections(unsigned long start_pfn)
     239             : {
     240             :         unsigned long start_nr = pfn_to_section_nr(start_pfn);
     241             : 
     242             :         if (online_section_nr(start_nr))
     243             :                 return 0;
     244             : 
     245             :         while (++start_nr <= __highest_present_section_nr) {
     246             :                 if (online_section_nr(start_nr))
     247             :                         return section_nr_to_pfn(start_nr);
     248             :         }
     249             : 
     250             :         return 0;
     251             : }
     252             : #else
     253             : static unsigned long skip_offline_sections(unsigned long start_pfn)
     254             : {
     255             :         return 0;
     256             : }
     257             : #endif
     258             : 
     259             : /*
     260             :  * Compound pages of >= pageblock_order should consistently be skipped until
     261             :  * released. It is always pointless to compact pages of such order (if they are
     262             :  * migratable), and the pageblocks they occupy cannot contain any free pages.
     263             :  */
     264           0 : static bool pageblock_skip_persistent(struct page *page)
     265             : {
     266           0 :         if (!PageCompound(page))
     267             :                 return false;
     268             : 
     269           0 :         page = compound_head(page);
     270             : 
     271           0 :         if (compound_order(page) >= pageblock_order)
     272             :                 return true;
     273             : 
     274           0 :         return false;
     275             : }
     276             : 
     277             : static bool
     278           0 : __reset_isolation_pfn(struct zone *zone, unsigned long pfn, bool check_source,
     279             :                                                         bool check_target)
     280             : {
     281           0 :         struct page *page = pfn_to_online_page(pfn);
     282             :         struct page *block_page;
     283             :         struct page *end_page;
     284             :         unsigned long block_pfn;
     285             : 
     286           0 :         if (!page)
     287             :                 return false;
     288           0 :         if (zone != page_zone(page))
     289             :                 return false;
     290           0 :         if (pageblock_skip_persistent(page))
     291             :                 return false;
     292             : 
     293             :         /*
     294             :          * If skip is already cleared do no further checking once the
     295             :          * restart points have been set.
     296             :          */
     297           0 :         if (check_source && check_target && !get_pageblock_skip(page))
     298             :                 return true;
     299             : 
     300             :         /*
     301             :          * If clearing skip for the target scanner, do not select a
     302             :          * non-movable pageblock as the starting point.
     303             :          */
     304           0 :         if (!check_source && check_target &&
     305           0 :             get_pageblock_migratetype(page) != MIGRATE_MOVABLE)
     306             :                 return false;
     307             : 
     308             :         /* Ensure the start of the pageblock or zone is online and valid */
     309           0 :         block_pfn = pageblock_start_pfn(pfn);
     310           0 :         block_pfn = max(block_pfn, zone->zone_start_pfn);
     311           0 :         block_page = pfn_to_online_page(block_pfn);
     312           0 :         if (block_page) {
     313           0 :                 page = block_page;
     314           0 :                 pfn = block_pfn;
     315             :         }
     316             : 
     317             :         /* Ensure the end of the pageblock or zone is online and valid */
     318           0 :         block_pfn = pageblock_end_pfn(pfn) - 1;
     319           0 :         block_pfn = min(block_pfn, zone_end_pfn(zone) - 1);
     320           0 :         end_page = pfn_to_online_page(block_pfn);
     321           0 :         if (!end_page)
     322             :                 return false;
     323             : 
     324             :         /*
     325             :          * Only clear the hint if a sample indicates there is either a
     326             :          * free page or an LRU page in the block. One or other condition
     327             :          * is necessary for the block to be a migration source/target.
     328             :          */
     329             :         do {
     330           0 :                 if (check_source && PageLRU(page)) {
     331           0 :                         clear_pageblock_skip(page);
     332           0 :                         return true;
     333             :                 }
     334             : 
     335           0 :                 if (check_target && PageBuddy(page)) {
     336           0 :                         clear_pageblock_skip(page);
     337           0 :                         return true;
     338             :                 }
     339             : 
     340           0 :                 page += (1 << PAGE_ALLOC_COSTLY_ORDER);
     341           0 :         } while (page <= end_page);
     342             : 
     343             :         return false;
     344             : }
     345             : 
     346             : /*
     347             :  * This function is called to clear all cached information on pageblocks that
     348             :  * should be skipped for page isolation when the migrate and free page scanner
     349             :  * meet.
     350             :  */
     351           0 : static void __reset_isolation_suitable(struct zone *zone)
     352             : {
     353           0 :         unsigned long migrate_pfn = zone->zone_start_pfn;
     354           0 :         unsigned long free_pfn = zone_end_pfn(zone) - 1;
     355           0 :         unsigned long reset_migrate = free_pfn;
     356           0 :         unsigned long reset_free = migrate_pfn;
     357           0 :         bool source_set = false;
     358           0 :         bool free_set = false;
     359             : 
     360           0 :         if (!zone->compact_blockskip_flush)
     361             :                 return;
     362             : 
     363           0 :         zone->compact_blockskip_flush = false;
     364             : 
     365             :         /*
     366             :          * Walk the zone and update pageblock skip information. Source looks
     367             :          * for PageLRU while target looks for PageBuddy. When the scanner
     368             :          * is found, both PageBuddy and PageLRU are checked as the pageblock
     369             :          * is suitable as both source and target.
     370             :          */
     371           0 :         for (; migrate_pfn < free_pfn; migrate_pfn += pageblock_nr_pages,
     372           0 :                                         free_pfn -= pageblock_nr_pages) {
     373           0 :                 cond_resched();
     374             : 
     375             :                 /* Update the migrate PFN */
     376           0 :                 if (__reset_isolation_pfn(zone, migrate_pfn, true, source_set) &&
     377             :                     migrate_pfn < reset_migrate) {
     378           0 :                         source_set = true;
     379           0 :                         reset_migrate = migrate_pfn;
     380           0 :                         zone->compact_init_migrate_pfn = reset_migrate;
     381           0 :                         zone->compact_cached_migrate_pfn[0] = reset_migrate;
     382           0 :                         zone->compact_cached_migrate_pfn[1] = reset_migrate;
     383             :                 }
     384             : 
     385             :                 /* Update the free PFN */
     386           0 :                 if (__reset_isolation_pfn(zone, free_pfn, free_set, true) &&
     387             :                     free_pfn > reset_free) {
     388           0 :                         free_set = true;
     389           0 :                         reset_free = free_pfn;
     390           0 :                         zone->compact_init_free_pfn = reset_free;
     391           0 :                         zone->compact_cached_free_pfn = reset_free;
     392             :                 }
     393             :         }
     394             : 
     395             :         /* Leave no distance if no suitable block was reset */
     396           0 :         if (reset_migrate >= reset_free) {
     397           0 :                 zone->compact_cached_migrate_pfn[0] = migrate_pfn;
     398           0 :                 zone->compact_cached_migrate_pfn[1] = migrate_pfn;
     399           0 :                 zone->compact_cached_free_pfn = free_pfn;
     400             :         }
     401             : }
     402             : 
     403           1 : void reset_isolation_suitable(pg_data_t *pgdat)
     404             : {
     405             :         int zoneid;
     406             : 
     407           3 :         for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
     408           2 :                 struct zone *zone = &pgdat->node_zones[zoneid];
     409           2 :                 if (!populated_zone(zone))
     410           1 :                         continue;
     411             : 
     412             :                 /* Only flush if a full compaction finished recently */
     413           1 :                 if (zone->compact_blockskip_flush)
     414           0 :                         __reset_isolation_suitable(zone);
     415             :         }
     416           1 : }
     417             : 
     418             : /*
     419             :  * Sets the pageblock skip bit if it was clear. Note that this is a hint as
     420             :  * locks are not required for read/writers. Returns true if it was already set.
     421             :  */
     422           0 : static bool test_and_set_skip(struct compact_control *cc, struct page *page)
     423             : {
     424             :         bool skip;
     425             : 
     426             :         /* Do not update if skip hint is being ignored */
     427           0 :         if (cc->ignore_skip_hint)
     428             :                 return false;
     429             : 
     430           0 :         skip = get_pageblock_skip(page);
     431           0 :         if (!skip && !cc->no_set_skip_hint)
     432           0 :                 set_pageblock_skip(page);
     433             : 
     434             :         return skip;
     435             : }
     436             : 
     437             : static void update_cached_migrate(struct compact_control *cc, unsigned long pfn)
     438             : {
     439           0 :         struct zone *zone = cc->zone;
     440             : 
     441           0 :         pfn = pageblock_end_pfn(pfn);
     442             : 
     443             :         /* Set for isolation rather than compaction */
     444           0 :         if (cc->no_set_skip_hint)
     445             :                 return;
     446             : 
     447           0 :         if (pfn > zone->compact_cached_migrate_pfn[0])
     448           0 :                 zone->compact_cached_migrate_pfn[0] = pfn;
     449           0 :         if (cc->mode != MIGRATE_ASYNC &&
     450           0 :             pfn > zone->compact_cached_migrate_pfn[1])
     451           0 :                 zone->compact_cached_migrate_pfn[1] = pfn;
     452             : }
     453             : 
     454             : /*
     455             :  * If no pages were isolated then mark this pageblock to be skipped in the
     456             :  * future. The information is later cleared by __reset_isolation_suitable().
     457             :  */
     458           0 : static void update_pageblock_skip(struct compact_control *cc,
     459             :                         struct page *page, unsigned long pfn)
     460             : {
     461           0 :         struct zone *zone = cc->zone;
     462             : 
     463           0 :         if (cc->no_set_skip_hint)
     464             :                 return;
     465             : 
     466           0 :         set_pageblock_skip(page);
     467             : 
     468             :         /* Update where async and sync compaction should restart */
     469           0 :         if (pfn < zone->compact_cached_free_pfn)
     470           0 :                 zone->compact_cached_free_pfn = pfn;
     471             : }
     472             : #else
     473             : static inline bool isolation_suitable(struct compact_control *cc,
     474             :                                         struct page *page)
     475             : {
     476             :         return true;
     477             : }
     478             : 
     479             : static inline bool pageblock_skip_persistent(struct page *page)
     480             : {
     481             :         return false;
     482             : }
     483             : 
     484             : static inline void update_pageblock_skip(struct compact_control *cc,
     485             :                         struct page *page, unsigned long pfn)
     486             : {
     487             : }
     488             : 
     489             : static void update_cached_migrate(struct compact_control *cc, unsigned long pfn)
     490             : {
     491             : }
     492             : 
     493             : static bool test_and_set_skip(struct compact_control *cc, struct page *page)
     494             : {
     495             :         return false;
     496             : }
     497             : #endif /* CONFIG_COMPACTION */
     498             : 
     499             : /*
     500             :  * Compaction requires the taking of some coarse locks that are potentially
     501             :  * very heavily contended. For async compaction, trylock and record if the
     502             :  * lock is contended. The lock will still be acquired but compaction will
     503             :  * abort when the current block is finished regardless of success rate.
     504             :  * Sync compaction acquires the lock.
     505             :  *
     506             :  * Always returns true which makes it easier to track lock state in callers.
     507             :  */
     508           0 : static bool compact_lock_irqsave(spinlock_t *lock, unsigned long *flags,
     509             :                                                 struct compact_control *cc)
     510             :         __acquires(lock)
     511             : {
     512             :         /* Track if the lock is contended in async mode */
     513           0 :         if (cc->mode == MIGRATE_ASYNC && !cc->contended) {
     514           0 :                 if (spin_trylock_irqsave(lock, *flags))
     515             :                         return true;
     516             : 
     517             :                 cc->contended = true;
     518             :         }
     519             : 
     520           0 :         spin_lock_irqsave(lock, *flags);
     521             :         return true;
     522             : }
     523             : 
     524             : /*
     525             :  * Compaction requires the taking of some coarse locks that are potentially
     526             :  * very heavily contended. The lock should be periodically unlocked to avoid
     527             :  * having disabled IRQs for a long time, even when there is nobody waiting on
     528             :  * the lock. It might also be that allowing the IRQs will result in
     529             :  * need_resched() becoming true. If scheduling is needed, compaction schedules.
     530             :  * Either compaction type will also abort if a fatal signal is pending.
     531             :  * In either case if the lock was locked, it is dropped and not regained.
     532             :  *
     533             :  * Returns true if compaction should abort due to fatal signal pending.
     534             :  * Returns false when compaction can continue.
     535             :  */
     536           0 : static bool compact_unlock_should_abort(spinlock_t *lock,
     537             :                 unsigned long flags, bool *locked, struct compact_control *cc)
     538             : {
     539           0 :         if (*locked) {
     540           0 :                 spin_unlock_irqrestore(lock, flags);
     541           0 :                 *locked = false;
     542             :         }
     543             : 
     544           0 :         if (fatal_signal_pending(current)) {
     545           0 :                 cc->contended = true;
     546             :                 return true;
     547             :         }
     548             : 
     549           0 :         cond_resched();
     550             : 
     551             :         return false;
     552             : }
     553             : 
     554             : /*
     555             :  * Isolate free pages onto a private freelist. If @strict is true, will abort
     556             :  * returning 0 on any invalid PFNs or non-free pages inside of the pageblock
     557             :  * (even though it may still end up isolating some pages).
     558             :  */
     559           0 : static unsigned long isolate_freepages_block(struct compact_control *cc,
     560             :                                 unsigned long *start_pfn,
     561             :                                 unsigned long end_pfn,
     562             :                                 struct list_head *freelist,
     563             :                                 unsigned int stride,
     564             :                                 bool strict)
     565             : {
     566           0 :         int nr_scanned = 0, total_isolated = 0;
     567             :         struct page *cursor;
     568           0 :         unsigned long flags = 0;
     569           0 :         bool locked = false;
     570           0 :         unsigned long blockpfn = *start_pfn;
     571             :         unsigned int order;
     572             : 
     573             :         /* Strict mode is for isolation, speed is secondary */
     574           0 :         if (strict)
     575           0 :                 stride = 1;
     576             : 
     577           0 :         cursor = pfn_to_page(blockpfn);
     578             : 
     579             :         /* Isolate free pages. */
     580           0 :         for (; blockpfn < end_pfn; blockpfn += stride, cursor += stride) {
     581             :                 int isolated;
     582           0 :                 struct page *page = cursor;
     583             : 
     584             :                 /*
     585             :                  * Periodically drop the lock (if held) regardless of its
     586             :                  * contention, to give chance to IRQs. Abort if fatal signal
     587             :                  * pending.
     588             :                  */
     589           0 :                 if (!(blockpfn % COMPACT_CLUSTER_MAX)
     590           0 :                     && compact_unlock_should_abort(&cc->zone->lock, flags,
     591             :                                                                 &locked, cc))
     592             :                         break;
     593             : 
     594           0 :                 nr_scanned++;
     595             : 
     596             :                 /*
     597             :                  * For compound pages such as THP and hugetlbfs, we can save
     598             :                  * potentially a lot of iterations if we skip them at once.
     599             :                  * The check is racy, but we can consider only valid values
     600             :                  * and the only danger is skipping too much.
     601             :                  */
     602           0 :                 if (PageCompound(page)) {
     603           0 :                         const unsigned int order = compound_order(page);
     604             : 
     605           0 :                         if (likely(order <= MAX_ORDER)) {
     606           0 :                                 blockpfn += (1UL << order) - 1;
     607           0 :                                 cursor += (1UL << order) - 1;
     608           0 :                                 nr_scanned += (1UL << order) - 1;
     609             :                         }
     610             :                         goto isolate_fail;
     611             :                 }
     612             : 
     613           0 :                 if (!PageBuddy(page))
     614             :                         goto isolate_fail;
     615             : 
     616             :                 /* If we already hold the lock, we can skip some rechecking. */
     617           0 :                 if (!locked) {
     618           0 :                         locked = compact_lock_irqsave(&cc->zone->lock,
     619             :                                                                 &flags, cc);
     620             : 
     621             :                         /* Recheck this is a buddy page under lock */
     622           0 :                         if (!PageBuddy(page))
     623             :                                 goto isolate_fail;
     624             :                 }
     625             : 
     626             :                 /* Found a free page, will break it into order-0 pages */
     627           0 :                 order = buddy_order(page);
     628           0 :                 isolated = __isolate_free_page(page, order);
     629           0 :                 if (!isolated)
     630             :                         break;
     631           0 :                 set_page_private(page, order);
     632             : 
     633           0 :                 nr_scanned += isolated - 1;
     634           0 :                 total_isolated += isolated;
     635           0 :                 cc->nr_freepages += isolated;
     636           0 :                 list_add_tail(&page->lru, freelist);
     637             : 
     638           0 :                 if (!strict && cc->nr_migratepages <= cc->nr_freepages) {
     639           0 :                         blockpfn += isolated;
     640           0 :                         break;
     641             :                 }
     642             :                 /* Advance to the end of split page */
     643           0 :                 blockpfn += isolated - 1;
     644           0 :                 cursor += isolated - 1;
     645           0 :                 continue;
     646             : 
     647             : isolate_fail:
     648           0 :                 if (strict)
     649             :                         break;
     650             :                 else
     651           0 :                         continue;
     652             : 
     653             :         }
     654             : 
     655           0 :         if (locked)
     656           0 :                 spin_unlock_irqrestore(&cc->zone->lock, flags);
     657             : 
     658             :         /*
     659             :          * There is a tiny chance that we have read bogus compound_order(),
     660             :          * so be careful to not go outside of the pageblock.
     661             :          */
     662           0 :         if (unlikely(blockpfn > end_pfn))
     663           0 :                 blockpfn = end_pfn;
     664             : 
     665           0 :         trace_mm_compaction_isolate_freepages(*start_pfn, blockpfn,
     666             :                                         nr_scanned, total_isolated);
     667             : 
     668             :         /* Record how far we have got within the block */
     669           0 :         *start_pfn = blockpfn;
     670             : 
     671             :         /*
     672             :          * If strict isolation is requested by CMA then check that all the
     673             :          * pages requested were isolated. If there were any failures, 0 is
     674             :          * returned and CMA will fail.
     675             :          */
     676           0 :         if (strict && blockpfn < end_pfn)
     677           0 :                 total_isolated = 0;
     678             : 
     679           0 :         cc->total_free_scanned += nr_scanned;
     680           0 :         if (total_isolated)
     681           0 :                 count_compact_events(COMPACTISOLATED, total_isolated);
     682           0 :         return total_isolated;
     683             : }
     684             : 
     685             : /**
     686             :  * isolate_freepages_range() - isolate free pages.
     687             :  * @cc:        Compaction control structure.
     688             :  * @start_pfn: The first PFN to start isolating.
     689             :  * @end_pfn:   The one-past-last PFN.
     690             :  *
     691             :  * Non-free pages, invalid PFNs, or zone boundaries within the
     692             :  * [start_pfn, end_pfn) range are considered errors, cause function to
     693             :  * undo its actions and return zero.
     694             :  *
     695             :  * Otherwise, function returns one-past-the-last PFN of isolated page
     696             :  * (which may be greater then end_pfn if end fell in a middle of
     697             :  * a free page).
     698             :  */
     699             : unsigned long
     700           0 : isolate_freepages_range(struct compact_control *cc,
     701             :                         unsigned long start_pfn, unsigned long end_pfn)
     702             : {
     703             :         unsigned long isolated, pfn, block_start_pfn, block_end_pfn;
     704           0 :         LIST_HEAD(freelist);
     705             : 
     706           0 :         pfn = start_pfn;
     707           0 :         block_start_pfn = pageblock_start_pfn(pfn);
     708           0 :         if (block_start_pfn < cc->zone->zone_start_pfn)
     709           0 :                 block_start_pfn = cc->zone->zone_start_pfn;
     710           0 :         block_end_pfn = pageblock_end_pfn(pfn);
     711             : 
     712           0 :         for (; pfn < end_pfn; pfn += isolated,
     713           0 :                                 block_start_pfn = block_end_pfn,
     714           0 :                                 block_end_pfn += pageblock_nr_pages) {
     715             :                 /* Protect pfn from changing by isolate_freepages_block */
     716           0 :                 unsigned long isolate_start_pfn = pfn;
     717             : 
     718           0 :                 block_end_pfn = min(block_end_pfn, end_pfn);
     719             : 
     720             :                 /*
     721             :                  * pfn could pass the block_end_pfn if isolated freepage
     722             :                  * is more than pageblock order. In this case, we adjust
     723             :                  * scanning range to right one.
     724             :                  */
     725           0 :                 if (pfn >= block_end_pfn) {
     726           0 :                         block_start_pfn = pageblock_start_pfn(pfn);
     727           0 :                         block_end_pfn = pageblock_end_pfn(pfn);
     728           0 :                         block_end_pfn = min(block_end_pfn, end_pfn);
     729             :                 }
     730             : 
     731           0 :                 if (!pageblock_pfn_to_page(block_start_pfn,
     732             :                                         block_end_pfn, cc->zone))
     733             :                         break;
     734             : 
     735           0 :                 isolated = isolate_freepages_block(cc, &isolate_start_pfn,
     736             :                                         block_end_pfn, &freelist, 0, true);
     737             : 
     738             :                 /*
     739             :                  * In strict mode, isolate_freepages_block() returns 0 if
     740             :                  * there are any holes in the block (ie. invalid PFNs or
     741             :                  * non-free pages).
     742             :                  */
     743           0 :                 if (!isolated)
     744             :                         break;
     745             : 
     746             :                 /*
     747             :                  * If we managed to isolate pages, it is always (1 << n) *
     748             :                  * pageblock_nr_pages for some non-negative n.  (Max order
     749             :                  * page may span two pageblocks).
     750             :                  */
     751             :         }
     752             : 
     753             :         /* __isolate_free_page() does not map the pages */
     754           0 :         split_map_pages(&freelist);
     755             : 
     756           0 :         if (pfn < end_pfn) {
     757             :                 /* Loop terminated early, cleanup. */
     758           0 :                 release_freepages(&freelist);
     759           0 :                 return 0;
     760             :         }
     761             : 
     762             :         /* We don't use freelists for anything. */
     763             :         return pfn;
     764             : }
     765             : 
     766             : /* Similar to reclaim, but different enough that they don't share logic */
     767           0 : static bool too_many_isolated(struct compact_control *cc)
     768             : {
     769           0 :         pg_data_t *pgdat = cc->zone->zone_pgdat;
     770             :         bool too_many;
     771             : 
     772             :         unsigned long active, inactive, isolated;
     773             : 
     774           0 :         inactive = node_page_state(pgdat, NR_INACTIVE_FILE) +
     775           0 :                         node_page_state(pgdat, NR_INACTIVE_ANON);
     776           0 :         active = node_page_state(pgdat, NR_ACTIVE_FILE) +
     777           0 :                         node_page_state(pgdat, NR_ACTIVE_ANON);
     778           0 :         isolated = node_page_state(pgdat, NR_ISOLATED_FILE) +
     779           0 :                         node_page_state(pgdat, NR_ISOLATED_ANON);
     780             : 
     781             :         /*
     782             :          * Allow GFP_NOFS to isolate past the limit set for regular
     783             :          * compaction runs. This prevents an ABBA deadlock when other
     784             :          * compactors have already isolated to the limit, but are
     785             :          * blocked on filesystem locks held by the GFP_NOFS thread.
     786             :          */
     787           0 :         if (cc->gfp_mask & __GFP_FS) {
     788           0 :                 inactive >>= 3;
     789           0 :                 active >>= 3;
     790             :         }
     791             : 
     792           0 :         too_many = isolated > (inactive + active) / 2;
     793           0 :         if (!too_many)
     794             :                 wake_throttle_isolated(pgdat);
     795             : 
     796           0 :         return too_many;
     797             : }
     798             : 
     799             : /**
     800             :  * isolate_migratepages_block() - isolate all migrate-able pages within
     801             :  *                                a single pageblock
     802             :  * @cc:         Compaction control structure.
     803             :  * @low_pfn:    The first PFN to isolate
     804             :  * @end_pfn:    The one-past-the-last PFN to isolate, within same pageblock
     805             :  * @mode:       Isolation mode to be used.
     806             :  *
     807             :  * Isolate all pages that can be migrated from the range specified by
     808             :  * [low_pfn, end_pfn). The range is expected to be within same pageblock.
     809             :  * Returns errno, like -EAGAIN or -EINTR in case e.g signal pending or congestion,
     810             :  * -ENOMEM in case we could not allocate a page, or 0.
     811             :  * cc->migrate_pfn will contain the next pfn to scan.
     812             :  *
     813             :  * The pages are isolated on cc->migratepages list (not required to be empty),
     814             :  * and cc->nr_migratepages is updated accordingly.
     815             :  */
     816             : static int
     817           0 : isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
     818             :                         unsigned long end_pfn, isolate_mode_t mode)
     819             : {
     820           0 :         pg_data_t *pgdat = cc->zone->zone_pgdat;
     821           0 :         unsigned long nr_scanned = 0, nr_isolated = 0;
     822             :         struct lruvec *lruvec;
     823           0 :         unsigned long flags = 0;
     824           0 :         struct lruvec *locked = NULL;
     825           0 :         struct folio *folio = NULL;
     826           0 :         struct page *page = NULL, *valid_page = NULL;
     827             :         struct address_space *mapping;
     828           0 :         unsigned long start_pfn = low_pfn;
     829           0 :         bool skip_on_failure = false;
     830           0 :         unsigned long next_skip_pfn = 0;
     831           0 :         bool skip_updated = false;
     832           0 :         int ret = 0;
     833             : 
     834           0 :         cc->migrate_pfn = low_pfn;
     835             : 
     836             :         /*
     837             :          * Ensure that there are not too many pages isolated from the LRU
     838             :          * list by either parallel reclaimers or compaction. If there are,
     839             :          * delay for some time until fewer pages are isolated
     840             :          */
     841           0 :         while (unlikely(too_many_isolated(cc))) {
     842             :                 /* stop isolation if there are still pages not migrated */
     843           0 :                 if (cc->nr_migratepages)
     844             :                         return -EAGAIN;
     845             : 
     846             :                 /* async migration should just abort */
     847           0 :                 if (cc->mode == MIGRATE_ASYNC)
     848             :                         return -EAGAIN;
     849             : 
     850           0 :                 reclaim_throttle(pgdat, VMSCAN_THROTTLE_ISOLATED);
     851             : 
     852           0 :                 if (fatal_signal_pending(current))
     853             :                         return -EINTR;
     854             :         }
     855             : 
     856           0 :         cond_resched();
     857             : 
     858           0 :         if (cc->direct_compaction && (cc->mode == MIGRATE_ASYNC)) {
     859           0 :                 skip_on_failure = true;
     860           0 :                 next_skip_pfn = block_end_pfn(low_pfn, cc->order);
     861             :         }
     862             : 
     863             :         /* Time to isolate some pages for migration */
     864           0 :         for (; low_pfn < end_pfn; low_pfn++) {
     865             : 
     866           0 :                 if (skip_on_failure && low_pfn >= next_skip_pfn) {
     867             :                         /*
     868             :                          * We have isolated all migration candidates in the
     869             :                          * previous order-aligned block, and did not skip it due
     870             :                          * to failure. We should migrate the pages now and
     871             :                          * hopefully succeed compaction.
     872             :                          */
     873           0 :                         if (nr_isolated)
     874             :                                 break;
     875             : 
     876             :                         /*
     877             :                          * We failed to isolate in the previous order-aligned
     878             :                          * block. Set the new boundary to the end of the
     879             :                          * current block. Note we can't simply increase
     880             :                          * next_skip_pfn by 1 << order, as low_pfn might have
     881             :                          * been incremented by a higher number due to skipping
     882             :                          * a compound or a high-order buddy page in the
     883             :                          * previous loop iteration.
     884             :                          */
     885           0 :                         next_skip_pfn = block_end_pfn(low_pfn, cc->order);
     886             :                 }
     887             : 
     888             :                 /*
     889             :                  * Periodically drop the lock (if held) regardless of its
     890             :                  * contention, to give chance to IRQs. Abort completely if
     891             :                  * a fatal signal is pending.
     892             :                  */
     893           0 :                 if (!(low_pfn % COMPACT_CLUSTER_MAX)) {
     894           0 :                         if (locked) {
     895           0 :                                 unlock_page_lruvec_irqrestore(locked, flags);
     896           0 :                                 locked = NULL;
     897             :                         }
     898             : 
     899           0 :                         if (fatal_signal_pending(current)) {
     900           0 :                                 cc->contended = true;
     901           0 :                                 ret = -EINTR;
     902             : 
     903           0 :                                 goto fatal_pending;
     904             :                         }
     905             : 
     906           0 :                         cond_resched();
     907             :                 }
     908             : 
     909           0 :                 nr_scanned++;
     910             : 
     911           0 :                 page = pfn_to_page(low_pfn);
     912             : 
     913             :                 /*
     914             :                  * Check if the pageblock has already been marked skipped.
     915             :                  * Only the aligned PFN is checked as the caller isolates
     916             :                  * COMPACT_CLUSTER_MAX at a time so the second call must
     917             :                  * not falsely conclude that the block should be skipped.
     918             :                  */
     919           0 :                 if (!valid_page && pageblock_aligned(low_pfn)) {
     920           0 :                         if (!isolation_suitable(cc, page)) {
     921             :                                 low_pfn = end_pfn;
     922             :                                 folio = NULL;
     923             :                                 goto isolate_abort;
     924             :                         }
     925             :                         valid_page = page;
     926             :                 }
     927             : 
     928           0 :                 if (PageHuge(page) && cc->alloc_contig) {
     929             :                         if (locked) {
     930             :                                 unlock_page_lruvec_irqrestore(locked, flags);
     931             :                                 locked = NULL;
     932             :                         }
     933             : 
     934             :                         ret = isolate_or_dissolve_huge_page(page, &cc->migratepages);
     935             : 
     936             :                         /*
     937             :                          * Fail isolation in case isolate_or_dissolve_huge_page()
     938             :                          * reports an error. In case of -ENOMEM, abort right away.
     939             :                          */
     940             :                         if (ret < 0) {
     941             :                                  /* Do not report -EBUSY down the chain */
     942             :                                 if (ret == -EBUSY)
     943             :                                         ret = 0;
     944             :                                 low_pfn += compound_nr(page) - 1;
     945             :                                 nr_scanned += compound_nr(page) - 1;
     946             :                                 goto isolate_fail;
     947             :                         }
     948             : 
     949             :                         if (PageHuge(page)) {
     950             :                                 /*
     951             :                                  * Hugepage was successfully isolated and placed
     952             :                                  * on the cc->migratepages list.
     953             :                                  */
     954             :                                 folio = page_folio(page);
     955             :                                 low_pfn += folio_nr_pages(folio) - 1;
     956             :                                 goto isolate_success_no_list;
     957             :                         }
     958             : 
     959             :                         /*
     960             :                          * Ok, the hugepage was dissolved. Now these pages are
     961             :                          * Buddy and cannot be re-allocated because they are
     962             :                          * isolated. Fall-through as the check below handles
     963             :                          * Buddy pages.
     964             :                          */
     965             :                 }
     966             : 
     967             :                 /*
     968             :                  * Skip if free. We read page order here without zone lock
     969             :                  * which is generally unsafe, but the race window is small and
     970             :                  * the worst thing that can happen is that we skip some
     971             :                  * potential isolation targets.
     972             :                  */
     973           0 :                 if (PageBuddy(page)) {
     974           0 :                         unsigned long freepage_order = buddy_order_unsafe(page);
     975             : 
     976             :                         /*
     977             :                          * Without lock, we cannot be sure that what we got is
     978             :                          * a valid page order. Consider only values in the
     979             :                          * valid order range to prevent low_pfn overflow.
     980             :                          */
     981           0 :                         if (freepage_order > 0 && freepage_order <= MAX_ORDER) {
     982           0 :                                 low_pfn += (1UL << freepage_order) - 1;
     983           0 :                                 nr_scanned += (1UL << freepage_order) - 1;
     984             :                         }
     985           0 :                         continue;
     986             :                 }
     987             : 
     988             :                 /*
     989             :                  * Regardless of being on LRU, compound pages such as THP and
     990             :                  * hugetlbfs are not to be compacted unless we are attempting
     991             :                  * an allocation much larger than the huge page size (eg CMA).
     992             :                  * We can potentially save a lot of iterations if we skip them
     993             :                  * at once. The check is racy, but we can consider only valid
     994             :                  * values and the only danger is skipping too much.
     995             :                  */
     996           0 :                 if (PageCompound(page) && !cc->alloc_contig) {
     997           0 :                         const unsigned int order = compound_order(page);
     998             : 
     999           0 :                         if (likely(order <= MAX_ORDER)) {
    1000           0 :                                 low_pfn += (1UL << order) - 1;
    1001           0 :                                 nr_scanned += (1UL << order) - 1;
    1002             :                         }
    1003             :                         goto isolate_fail;
    1004             :                 }
    1005             : 
    1006             :                 /*
    1007             :                  * Check may be lockless but that's ok as we recheck later.
    1008             :                  * It's possible to migrate LRU and non-lru movable pages.
    1009             :                  * Skip any other type of page
    1010             :                  */
    1011           0 :                 if (!PageLRU(page)) {
    1012             :                         /*
    1013             :                          * __PageMovable can return false positive so we need
    1014             :                          * to verify it under page_lock.
    1015             :                          */
    1016           0 :                         if (unlikely(__PageMovable(page)) &&
    1017           0 :                                         !PageIsolated(page)) {
    1018           0 :                                 if (locked) {
    1019           0 :                                         unlock_page_lruvec_irqrestore(locked, flags);
    1020           0 :                                         locked = NULL;
    1021             :                                 }
    1022             : 
    1023           0 :                                 if (isolate_movable_page(page, mode)) {
    1024           0 :                                         folio = page_folio(page);
    1025           0 :                                         goto isolate_success;
    1026             :                                 }
    1027             :                         }
    1028             : 
    1029             :                         goto isolate_fail;
    1030             :                 }
    1031             : 
    1032             :                 /*
    1033             :                  * Be careful not to clear PageLRU until after we're
    1034             :                  * sure the page is not being freed elsewhere -- the
    1035             :                  * page release code relies on it.
    1036             :                  */
    1037           0 :                 folio = folio_get_nontail_page(page);
    1038           0 :                 if (unlikely(!folio))
    1039             :                         goto isolate_fail;
    1040             : 
    1041             :                 /*
    1042             :                  * Migration will fail if an anonymous page is pinned in memory,
    1043             :                  * so avoid taking lru_lock and isolating it unnecessarily in an
    1044             :                  * admittedly racy check.
    1045             :                  */
    1046           0 :                 mapping = folio_mapping(folio);
    1047           0 :                 if (!mapping && (folio_ref_count(folio) - 1) > folio_mapcount(folio))
    1048             :                         goto isolate_fail_put;
    1049             : 
    1050             :                 /*
    1051             :                  * Only allow to migrate anonymous pages in GFP_NOFS context
    1052             :                  * because those do not depend on fs locks.
    1053             :                  */
    1054           0 :                 if (!(cc->gfp_mask & __GFP_FS) && mapping)
    1055             :                         goto isolate_fail_put;
    1056             : 
    1057             :                 /* Only take pages on LRU: a check now makes later tests safe */
    1058           0 :                 if (!folio_test_lru(folio))
    1059             :                         goto isolate_fail_put;
    1060             : 
    1061             :                 /* Compaction might skip unevictable pages but CMA takes them */
    1062           0 :                 if (!(mode & ISOLATE_UNEVICTABLE) && folio_test_unevictable(folio))
    1063             :                         goto isolate_fail_put;
    1064             : 
    1065             :                 /*
    1066             :                  * To minimise LRU disruption, the caller can indicate with
    1067             :                  * ISOLATE_ASYNC_MIGRATE that it only wants to isolate pages
    1068             :                  * it will be able to migrate without blocking - clean pages
    1069             :                  * for the most part.  PageWriteback would require blocking.
    1070             :                  */
    1071           0 :                 if ((mode & ISOLATE_ASYNC_MIGRATE) && folio_test_writeback(folio))
    1072             :                         goto isolate_fail_put;
    1073             : 
    1074           0 :                 if ((mode & ISOLATE_ASYNC_MIGRATE) && folio_test_dirty(folio)) {
    1075             :                         bool migrate_dirty;
    1076             : 
    1077             :                         /*
    1078             :                          * Only pages without mappings or that have a
    1079             :                          * ->migrate_folio callback are possible to migrate
    1080             :                          * without blocking. However, we can be racing with
    1081             :                          * truncation so it's necessary to lock the page
    1082             :                          * to stabilise the mapping as truncation holds
    1083             :                          * the page lock until after the page is removed
    1084             :                          * from the page cache.
    1085             :                          */
    1086           0 :                         if (!folio_trylock(folio))
    1087             :                                 goto isolate_fail_put;
    1088             : 
    1089           0 :                         mapping = folio_mapping(folio);
    1090           0 :                         migrate_dirty = !mapping ||
    1091           0 :                                         mapping->a_ops->migrate_folio;
    1092           0 :                         folio_unlock(folio);
    1093           0 :                         if (!migrate_dirty)
    1094             :                                 goto isolate_fail_put;
    1095             :                 }
    1096             : 
    1097             :                 /* Try isolate the folio */
    1098           0 :                 if (!folio_test_clear_lru(folio))
    1099             :                         goto isolate_fail_put;
    1100             : 
    1101           0 :                 lruvec = folio_lruvec(folio);
    1102             : 
    1103             :                 /* If we already hold the lock, we can skip some rechecking */
    1104           0 :                 if (lruvec != locked) {
    1105           0 :                         if (locked)
    1106           0 :                                 unlock_page_lruvec_irqrestore(locked, flags);
    1107             : 
    1108           0 :                         compact_lock_irqsave(&lruvec->lru_lock, &flags, cc);
    1109           0 :                         locked = lruvec;
    1110             : 
    1111             :                         lruvec_memcg_debug(lruvec, folio);
    1112             : 
    1113             :                         /*
    1114             :                          * Try get exclusive access under lock. If marked for
    1115             :                          * skip, the scan is aborted unless the current context
    1116             :                          * is a rescan to reach the end of the pageblock.
    1117             :                          */
    1118           0 :                         if (!skip_updated && valid_page) {
    1119           0 :                                 skip_updated = true;
    1120           0 :                                 if (test_and_set_skip(cc, valid_page) &&
    1121           0 :                                     !cc->finish_pageblock) {
    1122             :                                         goto isolate_abort;
    1123             :                                 }
    1124             :                         }
    1125             : 
    1126             :                         /*
    1127             :                          * folio become large since the non-locked check,
    1128             :                          * and it's on LRU.
    1129             :                          */
    1130           0 :                         if (unlikely(folio_test_large(folio) && !cc->alloc_contig)) {
    1131           0 :                                 low_pfn += folio_nr_pages(folio) - 1;
    1132           0 :                                 nr_scanned += folio_nr_pages(folio) - 1;
    1133             :                                 folio_set_lru(folio);
    1134             :                                 goto isolate_fail_put;
    1135             :                         }
    1136             :                 }
    1137             : 
    1138             :                 /* The folio is taken off the LRU */
    1139           0 :                 if (folio_test_large(folio))
    1140           0 :                         low_pfn += folio_nr_pages(folio) - 1;
    1141             : 
    1142             :                 /* Successfully isolated */
    1143           0 :                 lruvec_del_folio(lruvec, folio);
    1144           0 :                 node_stat_mod_folio(folio,
    1145           0 :                                 NR_ISOLATED_ANON + folio_is_file_lru(folio),
    1146             :                                 folio_nr_pages(folio));
    1147             : 
    1148             : isolate_success:
    1149           0 :                 list_add(&folio->lru, &cc->migratepages);
    1150             : isolate_success_no_list:
    1151           0 :                 cc->nr_migratepages += folio_nr_pages(folio);
    1152           0 :                 nr_isolated += folio_nr_pages(folio);
    1153           0 :                 nr_scanned += folio_nr_pages(folio) - 1;
    1154             : 
    1155             :                 /*
    1156             :                  * Avoid isolating too much unless this block is being
    1157             :                  * fully scanned (e.g. dirty/writeback pages, parallel allocation)
    1158             :                  * or a lock is contended. For contention, isolate quickly to
    1159             :                  * potentially remove one source of contention.
    1160             :                  */
    1161           0 :                 if (cc->nr_migratepages >= COMPACT_CLUSTER_MAX &&
    1162           0 :                     !cc->finish_pageblock && !cc->contended) {
    1163           0 :                         ++low_pfn;
    1164           0 :                         break;
    1165             :                 }
    1166             : 
    1167           0 :                 continue;
    1168             : 
    1169             : isolate_fail_put:
    1170             :                 /* Avoid potential deadlock in freeing page under lru_lock */
    1171           0 :                 if (locked) {
    1172           0 :                         unlock_page_lruvec_irqrestore(locked, flags);
    1173           0 :                         locked = NULL;
    1174             :                 }
    1175             :                 folio_put(folio);
    1176             : 
    1177             : isolate_fail:
    1178           0 :                 if (!skip_on_failure && ret != -ENOMEM)
    1179           0 :                         continue;
    1180             : 
    1181             :                 /*
    1182             :                  * We have isolated some pages, but then failed. Release them
    1183             :                  * instead of migrating, as we cannot form the cc->order buddy
    1184             :                  * page anyway.
    1185             :                  */
    1186           0 :                 if (nr_isolated) {
    1187           0 :                         if (locked) {
    1188           0 :                                 unlock_page_lruvec_irqrestore(locked, flags);
    1189           0 :                                 locked = NULL;
    1190             :                         }
    1191           0 :                         putback_movable_pages(&cc->migratepages);
    1192           0 :                         cc->nr_migratepages = 0;
    1193           0 :                         nr_isolated = 0;
    1194             :                 }
    1195             : 
    1196           0 :                 if (low_pfn < next_skip_pfn) {
    1197           0 :                         low_pfn = next_skip_pfn - 1;
    1198             :                         /*
    1199             :                          * The check near the loop beginning would have updated
    1200             :                          * next_skip_pfn too, but this is a bit simpler.
    1201             :                          */
    1202           0 :                         next_skip_pfn += 1UL << cc->order;
    1203             :                 }
    1204             : 
    1205             :                 if (ret == -ENOMEM)
    1206             :                         break;
    1207             :         }
    1208             : 
    1209             :         /*
    1210             :          * The PageBuddy() check could have potentially brought us outside
    1211             :          * the range to be scanned.
    1212             :          */
    1213           0 :         if (unlikely(low_pfn > end_pfn))
    1214           0 :                 low_pfn = end_pfn;
    1215             : 
    1216             :         folio = NULL;
    1217             : 
    1218             : isolate_abort:
    1219           0 :         if (locked)
    1220           0 :                 unlock_page_lruvec_irqrestore(locked, flags);
    1221           0 :         if (folio) {
    1222           0 :                 folio_set_lru(folio);
    1223             :                 folio_put(folio);
    1224             :         }
    1225             : 
    1226             :         /*
    1227             :          * Update the cached scanner pfn once the pageblock has been scanned.
    1228             :          * Pages will either be migrated in which case there is no point
    1229             :          * scanning in the near future or migration failed in which case the
    1230             :          * failure reason may persist. The block is marked for skipping if
    1231             :          * there were no pages isolated in the block or if the block is
    1232             :          * rescanned twice in a row.
    1233             :          */
    1234           0 :         if (low_pfn == end_pfn && (!nr_isolated || cc->finish_pageblock)) {
    1235           0 :                 if (!cc->no_set_skip_hint && valid_page && !skip_updated)
    1236           0 :                         set_pageblock_skip(valid_page);
    1237             :                 update_cached_migrate(cc, low_pfn);
    1238             :         }
    1239             : 
    1240             :         trace_mm_compaction_isolate_migratepages(start_pfn, low_pfn,
    1241             :                                                 nr_scanned, nr_isolated);
    1242             : 
    1243             : fatal_pending:
    1244           0 :         cc->total_migrate_scanned += nr_scanned;
    1245           0 :         if (nr_isolated)
    1246           0 :                 count_compact_events(COMPACTISOLATED, nr_isolated);
    1247             : 
    1248           0 :         cc->migrate_pfn = low_pfn;
    1249             : 
    1250           0 :         return ret;
    1251             : }
    1252             : 
    1253             : /**
    1254             :  * isolate_migratepages_range() - isolate migrate-able pages in a PFN range
    1255             :  * @cc:        Compaction control structure.
    1256             :  * @start_pfn: The first PFN to start isolating.
    1257             :  * @end_pfn:   The one-past-last PFN.
    1258             :  *
    1259             :  * Returns -EAGAIN when contented, -EINTR in case of a signal pending, -ENOMEM
    1260             :  * in case we could not allocate a page, or 0.
    1261             :  */
    1262             : int
    1263           0 : isolate_migratepages_range(struct compact_control *cc, unsigned long start_pfn,
    1264             :                                                         unsigned long end_pfn)
    1265             : {
    1266             :         unsigned long pfn, block_start_pfn, block_end_pfn;
    1267           0 :         int ret = 0;
    1268             : 
    1269             :         /* Scan block by block. First and last block may be incomplete */
    1270           0 :         pfn = start_pfn;
    1271           0 :         block_start_pfn = pageblock_start_pfn(pfn);
    1272           0 :         if (block_start_pfn < cc->zone->zone_start_pfn)
    1273           0 :                 block_start_pfn = cc->zone->zone_start_pfn;
    1274           0 :         block_end_pfn = pageblock_end_pfn(pfn);
    1275             : 
    1276           0 :         for (; pfn < end_pfn; pfn = block_end_pfn,
    1277           0 :                                 block_start_pfn = block_end_pfn,
    1278           0 :                                 block_end_pfn += pageblock_nr_pages) {
    1279             : 
    1280           0 :                 block_end_pfn = min(block_end_pfn, end_pfn);
    1281             : 
    1282           0 :                 if (!pageblock_pfn_to_page(block_start_pfn,
    1283             :                                         block_end_pfn, cc->zone))
    1284           0 :                         continue;
    1285             : 
    1286           0 :                 ret = isolate_migratepages_block(cc, pfn, block_end_pfn,
    1287             :                                                  ISOLATE_UNEVICTABLE);
    1288             : 
    1289           0 :                 if (ret)
    1290             :                         break;
    1291             : 
    1292           0 :                 if (cc->nr_migratepages >= COMPACT_CLUSTER_MAX)
    1293             :                         break;
    1294             :         }
    1295             : 
    1296           0 :         return ret;
    1297             : }
    1298             : 
    1299             : #endif /* CONFIG_COMPACTION || CONFIG_CMA */
    1300             : #ifdef CONFIG_COMPACTION
    1301             : 
    1302           0 : static bool suitable_migration_source(struct compact_control *cc,
    1303             :                                                         struct page *page)
    1304             : {
    1305             :         int block_mt;
    1306             : 
    1307           0 :         if (pageblock_skip_persistent(page))
    1308             :                 return false;
    1309             : 
    1310           0 :         if ((cc->mode != MIGRATE_ASYNC) || !cc->direct_compaction)
    1311             :                 return true;
    1312             : 
    1313           0 :         block_mt = get_pageblock_migratetype(page);
    1314             : 
    1315           0 :         if (cc->migratetype == MIGRATE_MOVABLE)
    1316           0 :                 return is_migrate_movable(block_mt);
    1317             :         else
    1318           0 :                 return block_mt == cc->migratetype;
    1319             : }
    1320             : 
    1321             : /* Returns true if the page is within a block suitable for migration to */
    1322           0 : static bool suitable_migration_target(struct compact_control *cc,
    1323             :                                                         struct page *page)
    1324             : {
    1325             :         /* If the page is a large free page, then disallow migration */
    1326           0 :         if (PageBuddy(page)) {
    1327             :                 /*
    1328             :                  * We are checking page_order without zone->lock taken. But
    1329             :                  * the only small danger is that we skip a potentially suitable
    1330             :                  * pageblock, so it's not worth to check order for valid range.
    1331             :                  */
    1332           0 :                 if (buddy_order_unsafe(page) >= pageblock_order)
    1333             :                         return false;
    1334             :         }
    1335             : 
    1336           0 :         if (cc->ignore_block_suitable)
    1337             :                 return true;
    1338             : 
    1339             :         /* If the block is MIGRATE_MOVABLE or MIGRATE_CMA, allow migration */
    1340           0 :         if (is_migrate_movable(get_pageblock_migratetype(page)))
    1341             :                 return true;
    1342             : 
    1343             :         /* Otherwise skip the block */
    1344             :         return false;
    1345             : }
    1346             : 
    1347             : static inline unsigned int
    1348             : freelist_scan_limit(struct compact_control *cc)
    1349             : {
    1350           0 :         unsigned short shift = BITS_PER_LONG - 1;
    1351             : 
    1352           0 :         return (COMPACT_CLUSTER_MAX >> min(shift, cc->fast_search_fail)) + 1;
    1353             : }
    1354             : 
    1355             : /*
    1356             :  * Test whether the free scanner has reached the same or lower pageblock than
    1357             :  * the migration scanner, and compaction should thus terminate.
    1358             :  */
    1359             : static inline bool compact_scanners_met(struct compact_control *cc)
    1360             : {
    1361           0 :         return (cc->free_pfn >> pageblock_order)
    1362           0 :                 <= (cc->migrate_pfn >> pageblock_order);
    1363             : }
    1364             : 
    1365             : /*
    1366             :  * Used when scanning for a suitable migration target which scans freelists
    1367             :  * in reverse. Reorders the list such as the unscanned pages are scanned
    1368             :  * first on the next iteration of the free scanner
    1369             :  */
    1370             : static void
    1371           0 : move_freelist_head(struct list_head *freelist, struct page *freepage)
    1372             : {
    1373           0 :         LIST_HEAD(sublist);
    1374             : 
    1375           0 :         if (!list_is_last(freelist, &freepage->lru)) {
    1376           0 :                 list_cut_before(&sublist, freelist, &freepage->lru);
    1377             :                 list_splice_tail(&sublist, freelist);
    1378             :         }
    1379           0 : }
    1380             : 
    1381             : /*
    1382             :  * Similar to move_freelist_head except used by the migration scanner
    1383             :  * when scanning forward. It's possible for these list operations to
    1384             :  * move against each other if they search the free list exactly in
    1385             :  * lockstep.
    1386             :  */
    1387             : static void
    1388           0 : move_freelist_tail(struct list_head *freelist, struct page *freepage)
    1389             : {
    1390           0 :         LIST_HEAD(sublist);
    1391             : 
    1392           0 :         if (!list_is_first(freelist, &freepage->lru)) {
    1393           0 :                 list_cut_position(&sublist, freelist, &freepage->lru);
    1394             :                 list_splice_tail(&sublist, freelist);
    1395             :         }
    1396           0 : }
    1397             : 
    1398             : static void
    1399           0 : fast_isolate_around(struct compact_control *cc, unsigned long pfn)
    1400             : {
    1401             :         unsigned long start_pfn, end_pfn;
    1402             :         struct page *page;
    1403             : 
    1404             :         /* Do not search around if there are enough pages already */
    1405           0 :         if (cc->nr_freepages >= cc->nr_migratepages)
    1406             :                 return;
    1407             : 
    1408             :         /* Minimise scanning during async compaction */
    1409           0 :         if (cc->direct_compaction && cc->mode == MIGRATE_ASYNC)
    1410             :                 return;
    1411             : 
    1412             :         /* Pageblock boundaries */
    1413           0 :         start_pfn = max(pageblock_start_pfn(pfn), cc->zone->zone_start_pfn);
    1414           0 :         end_pfn = min(pageblock_end_pfn(pfn), zone_end_pfn(cc->zone));
    1415             : 
    1416           0 :         page = pageblock_pfn_to_page(start_pfn, end_pfn, cc->zone);
    1417           0 :         if (!page)
    1418             :                 return;
    1419             : 
    1420           0 :         isolate_freepages_block(cc, &start_pfn, end_pfn, &cc->freepages, 1, false);
    1421             : 
    1422             :         /* Skip this pageblock in the future as it's full or nearly full */
    1423           0 :         if (start_pfn == end_pfn)
    1424           0 :                 set_pageblock_skip(page);
    1425             : 
    1426             :         return;
    1427             : }
    1428             : 
    1429             : /* Search orders in round-robin fashion */
    1430             : static int next_search_order(struct compact_control *cc, int order)
    1431             : {
    1432           0 :         order--;
    1433           0 :         if (order < 0)
    1434           0 :                 order = cc->order - 1;
    1435             : 
    1436             :         /* Search wrapped around? */
    1437           0 :         if (order == cc->search_order) {
    1438           0 :                 cc->search_order--;
    1439           0 :                 if (cc->search_order < 0)
    1440           0 :                         cc->search_order = cc->order - 1;
    1441             :                 return -1;
    1442             :         }
    1443             : 
    1444             :         return order;
    1445             : }
    1446             : 
    1447           0 : static void fast_isolate_freepages(struct compact_control *cc)
    1448             : {
    1449           0 :         unsigned int limit = max(1U, freelist_scan_limit(cc) >> 1);
    1450           0 :         unsigned int nr_scanned = 0, total_isolated = 0;
    1451           0 :         unsigned long low_pfn, min_pfn, highest = 0;
    1452           0 :         unsigned long nr_isolated = 0;
    1453             :         unsigned long distance;
    1454           0 :         struct page *page = NULL;
    1455           0 :         bool scan_start = false;
    1456             :         int order;
    1457             : 
    1458             :         /* Full compaction passes in a negative order */
    1459           0 :         if (cc->order <= 0)
    1460             :                 return;
    1461             : 
    1462             :         /*
    1463             :          * If starting the scan, use a deeper search and use the highest
    1464             :          * PFN found if a suitable one is not found.
    1465             :          */
    1466           0 :         if (cc->free_pfn >= cc->zone->compact_init_free_pfn) {
    1467           0 :                 limit = pageblock_nr_pages >> 1;
    1468           0 :                 scan_start = true;
    1469             :         }
    1470             : 
    1471             :         /*
    1472             :          * Preferred point is in the top quarter of the scan space but take
    1473             :          * a pfn from the top half if the search is problematic.
    1474             :          */
    1475           0 :         distance = (cc->free_pfn - cc->migrate_pfn);
    1476           0 :         low_pfn = pageblock_start_pfn(cc->free_pfn - (distance >> 2));
    1477           0 :         min_pfn = pageblock_start_pfn(cc->free_pfn - (distance >> 1));
    1478             : 
    1479           0 :         if (WARN_ON_ONCE(min_pfn > low_pfn))
    1480           0 :                 low_pfn = min_pfn;
    1481             : 
    1482             :         /*
    1483             :          * Search starts from the last successful isolation order or the next
    1484             :          * order to search after a previous failure
    1485             :          */
    1486           0 :         cc->search_order = min_t(unsigned int, cc->order - 1, cc->search_order);
    1487             : 
    1488           0 :         for (order = cc->search_order;
    1489           0 :              !page && order >= 0;
    1490           0 :              order = next_search_order(cc, order)) {
    1491           0 :                 struct free_area *area = &cc->zone->free_area[order];
    1492             :                 struct list_head *freelist;
    1493             :                 struct page *freepage;
    1494             :                 unsigned long flags;
    1495           0 :                 unsigned int order_scanned = 0;
    1496           0 :                 unsigned long high_pfn = 0;
    1497             : 
    1498           0 :                 if (!area->nr_free)
    1499           0 :                         continue;
    1500             : 
    1501           0 :                 spin_lock_irqsave(&cc->zone->lock, flags);
    1502           0 :                 freelist = &area->free_list[MIGRATE_MOVABLE];
    1503           0 :                 list_for_each_entry_reverse(freepage, freelist, lru) {
    1504             :                         unsigned long pfn;
    1505             : 
    1506           0 :                         order_scanned++;
    1507           0 :                         nr_scanned++;
    1508           0 :                         pfn = page_to_pfn(freepage);
    1509             : 
    1510           0 :                         if (pfn >= highest)
    1511           0 :                                 highest = max(pageblock_start_pfn(pfn),
    1512             :                                               cc->zone->zone_start_pfn);
    1513             : 
    1514           0 :                         if (pfn >= low_pfn) {
    1515           0 :                                 cc->fast_search_fail = 0;
    1516           0 :                                 cc->search_order = order;
    1517           0 :                                 page = freepage;
    1518           0 :                                 break;
    1519             :                         }
    1520             : 
    1521           0 :                         if (pfn >= min_pfn && pfn > high_pfn) {
    1522           0 :                                 high_pfn = pfn;
    1523             : 
    1524             :                                 /* Shorten the scan if a candidate is found */
    1525           0 :                                 limit >>= 1;
    1526             :                         }
    1527             : 
    1528           0 :                         if (order_scanned >= limit)
    1529             :                                 break;
    1530             :                 }
    1531             : 
    1532             :                 /* Use a minimum pfn if a preferred one was not found */
    1533           0 :                 if (!page && high_pfn) {
    1534           0 :                         page = pfn_to_page(high_pfn);
    1535             : 
    1536             :                         /* Update freepage for the list reorder below */
    1537           0 :                         freepage = page;
    1538             :                 }
    1539             : 
    1540             :                 /* Reorder to so a future search skips recent pages */
    1541           0 :                 move_freelist_head(freelist, freepage);
    1542             : 
    1543             :                 /* Isolate the page if available */
    1544           0 :                 if (page) {
    1545           0 :                         if (__isolate_free_page(page, order)) {
    1546           0 :                                 set_page_private(page, order);
    1547           0 :                                 nr_isolated = 1 << order;
    1548           0 :                                 nr_scanned += nr_isolated - 1;
    1549           0 :                                 total_isolated += nr_isolated;
    1550           0 :                                 cc->nr_freepages += nr_isolated;
    1551           0 :                                 list_add_tail(&page->lru, &cc->freepages);
    1552           0 :                                 count_compact_events(COMPACTISOLATED, nr_isolated);
    1553             :                         } else {
    1554             :                                 /* If isolation fails, abort the search */
    1555           0 :                                 order = cc->search_order + 1;
    1556           0 :                                 page = NULL;
    1557             :                         }
    1558             :                 }
    1559             : 
    1560           0 :                 spin_unlock_irqrestore(&cc->zone->lock, flags);
    1561             : 
    1562             :                 /* Skip fast search if enough freepages isolated */
    1563           0 :                 if (cc->nr_freepages >= cc->nr_migratepages)
    1564             :                         break;
    1565             : 
    1566             :                 /*
    1567             :                  * Smaller scan on next order so the total scan is related
    1568             :                  * to freelist_scan_limit.
    1569             :                  */
    1570           0 :                 if (order_scanned >= limit)
    1571           0 :                         limit = max(1U, limit >> 1);
    1572             :         }
    1573             : 
    1574           0 :         trace_mm_compaction_fast_isolate_freepages(min_pfn, cc->free_pfn,
    1575             :                                                    nr_scanned, total_isolated);
    1576             : 
    1577           0 :         if (!page) {
    1578           0 :                 cc->fast_search_fail++;
    1579           0 :                 if (scan_start) {
    1580             :                         /*
    1581             :                          * Use the highest PFN found above min. If one was
    1582             :                          * not found, be pessimistic for direct compaction
    1583             :                          * and use the min mark.
    1584             :                          */
    1585           0 :                         if (highest >= min_pfn) {
    1586           0 :                                 page = pfn_to_page(highest);
    1587           0 :                                 cc->free_pfn = highest;
    1588             :                         } else {
    1589           0 :                                 if (cc->direct_compaction && pfn_valid(min_pfn)) {
    1590           0 :                                         page = pageblock_pfn_to_page(min_pfn,
    1591           0 :                                                 min(pageblock_end_pfn(min_pfn),
    1592             :                                                     zone_end_pfn(cc->zone)),
    1593             :                                                 cc->zone);
    1594           0 :                                         cc->free_pfn = min_pfn;
    1595             :                                 }
    1596             :                         }
    1597             :                 }
    1598             :         }
    1599             : 
    1600           0 :         if (highest && highest >= cc->zone->compact_cached_free_pfn) {
    1601           0 :                 highest -= pageblock_nr_pages;
    1602           0 :                 cc->zone->compact_cached_free_pfn = highest;
    1603             :         }
    1604             : 
    1605           0 :         cc->total_free_scanned += nr_scanned;
    1606           0 :         if (!page)
    1607             :                 return;
    1608             : 
    1609           0 :         low_pfn = page_to_pfn(page);
    1610           0 :         fast_isolate_around(cc, low_pfn);
    1611             : }
    1612             : 
    1613             : /*
    1614             :  * Based on information in the current compact_control, find blocks
    1615             :  * suitable for isolating free pages from and then isolate them.
    1616             :  */
    1617           0 : static void isolate_freepages(struct compact_control *cc)
    1618             : {
    1619           0 :         struct zone *zone = cc->zone;
    1620             :         struct page *page;
    1621             :         unsigned long block_start_pfn;  /* start of current pageblock */
    1622             :         unsigned long isolate_start_pfn; /* exact pfn we start at */
    1623             :         unsigned long block_end_pfn;    /* end of current pageblock */
    1624             :         unsigned long low_pfn;       /* lowest pfn scanner is able to scan */
    1625           0 :         struct list_head *freelist = &cc->freepages;
    1626             :         unsigned int stride;
    1627             : 
    1628             :         /* Try a small search of the free lists for a candidate */
    1629           0 :         fast_isolate_freepages(cc);
    1630           0 :         if (cc->nr_freepages)
    1631             :                 goto splitmap;
    1632             : 
    1633             :         /*
    1634             :          * Initialise the free scanner. The starting point is where we last
    1635             :          * successfully isolated from, zone-cached value, or the end of the
    1636             :          * zone when isolating for the first time. For looping we also need
    1637             :          * this pfn aligned down to the pageblock boundary, because we do
    1638             :          * block_start_pfn -= pageblock_nr_pages in the for loop.
    1639             :          * For ending point, take care when isolating in last pageblock of a
    1640             :          * zone which ends in the middle of a pageblock.
    1641             :          * The low boundary is the end of the pageblock the migration scanner
    1642             :          * is using.
    1643             :          */
    1644           0 :         isolate_start_pfn = cc->free_pfn;
    1645           0 :         block_start_pfn = pageblock_start_pfn(isolate_start_pfn);
    1646           0 :         block_end_pfn = min(block_start_pfn + pageblock_nr_pages,
    1647             :                                                 zone_end_pfn(zone));
    1648           0 :         low_pfn = pageblock_end_pfn(cc->migrate_pfn);
    1649           0 :         stride = cc->mode == MIGRATE_ASYNC ? COMPACT_CLUSTER_MAX : 1;
    1650             : 
    1651             :         /*
    1652             :          * Isolate free pages until enough are available to migrate the
    1653             :          * pages on cc->migratepages. We stop searching if the migrate
    1654             :          * and free page scanners meet or enough free pages are isolated.
    1655             :          */
    1656           0 :         for (; block_start_pfn >= low_pfn;
    1657           0 :                                 block_end_pfn = block_start_pfn,
    1658           0 :                                 block_start_pfn -= pageblock_nr_pages,
    1659           0 :                                 isolate_start_pfn = block_start_pfn) {
    1660             :                 unsigned long nr_isolated;
    1661             : 
    1662             :                 /*
    1663             :                  * This can iterate a massively long zone without finding any
    1664             :                  * suitable migration targets, so periodically check resched.
    1665             :                  */
    1666           0 :                 if (!(block_start_pfn % (COMPACT_CLUSTER_MAX * pageblock_nr_pages)))
    1667           0 :                         cond_resched();
    1668             : 
    1669           0 :                 page = pageblock_pfn_to_page(block_start_pfn, block_end_pfn,
    1670             :                                                                         zone);
    1671           0 :                 if (!page)
    1672           0 :                         continue;
    1673             : 
    1674             :                 /* Check the block is suitable for migration */
    1675           0 :                 if (!suitable_migration_target(cc, page))
    1676           0 :                         continue;
    1677             : 
    1678             :                 /* If isolation recently failed, do not retry */
    1679           0 :                 if (!isolation_suitable(cc, page))
    1680           0 :                         continue;
    1681             : 
    1682             :                 /* Found a block suitable for isolating free pages from. */
    1683           0 :                 nr_isolated = isolate_freepages_block(cc, &isolate_start_pfn,
    1684             :                                         block_end_pfn, freelist, stride, false);
    1685             : 
    1686             :                 /* Update the skip hint if the full pageblock was scanned */
    1687           0 :                 if (isolate_start_pfn == block_end_pfn)
    1688           0 :                         update_pageblock_skip(cc, page, block_start_pfn);
    1689             : 
    1690             :                 /* Are enough freepages isolated? */
    1691           0 :                 if (cc->nr_freepages >= cc->nr_migratepages) {
    1692           0 :                         if (isolate_start_pfn >= block_end_pfn) {
    1693             :                                 /*
    1694             :                                  * Restart at previous pageblock if more
    1695             :                                  * freepages can be isolated next time.
    1696             :                                  */
    1697           0 :                                 isolate_start_pfn =
    1698           0 :                                         block_start_pfn - pageblock_nr_pages;
    1699             :                         }
    1700             :                         break;
    1701           0 :                 } else if (isolate_start_pfn < block_end_pfn) {
    1702             :                         /*
    1703             :                          * If isolation failed early, do not continue
    1704             :                          * needlessly.
    1705             :                          */
    1706             :                         break;
    1707             :                 }
    1708             : 
    1709             :                 /* Adjust stride depending on isolation */
    1710           0 :                 if (nr_isolated) {
    1711           0 :                         stride = 1;
    1712           0 :                         continue;
    1713             :                 }
    1714           0 :                 stride = min_t(unsigned int, COMPACT_CLUSTER_MAX, stride << 1);
    1715             :         }
    1716             : 
    1717             :         /*
    1718             :          * Record where the free scanner will restart next time. Either we
    1719             :          * broke from the loop and set isolate_start_pfn based on the last
    1720             :          * call to isolate_freepages_block(), or we met the migration scanner
    1721             :          * and the loop terminated due to isolate_start_pfn < low_pfn
    1722             :          */
    1723           0 :         cc->free_pfn = isolate_start_pfn;
    1724             : 
    1725             : splitmap:
    1726             :         /* __isolate_free_page() does not map the pages */
    1727           0 :         split_map_pages(freelist);
    1728           0 : }
    1729             : 
    1730             : /*
    1731             :  * This is a migrate-callback that "allocates" freepages by taking pages
    1732             :  * from the isolated freelists in the block we are migrating to.
    1733             :  */
    1734           0 : static struct folio *compaction_alloc(struct folio *src, unsigned long data)
    1735             : {
    1736           0 :         struct compact_control *cc = (struct compact_control *)data;
    1737             :         struct folio *dst;
    1738             : 
    1739           0 :         if (list_empty(&cc->freepages)) {
    1740           0 :                 isolate_freepages(cc);
    1741             : 
    1742           0 :                 if (list_empty(&cc->freepages))
    1743             :                         return NULL;
    1744             :         }
    1745             : 
    1746           0 :         dst = list_entry(cc->freepages.next, struct folio, lru);
    1747           0 :         list_del(&dst->lru);
    1748           0 :         cc->nr_freepages--;
    1749             : 
    1750           0 :         return dst;
    1751             : }
    1752             : 
    1753             : /*
    1754             :  * This is a migrate-callback that "frees" freepages back to the isolated
    1755             :  * freelist.  All pages on the freelist are from the same zone, so there is no
    1756             :  * special handling needed for NUMA.
    1757             :  */
    1758           0 : static void compaction_free(struct folio *dst, unsigned long data)
    1759             : {
    1760           0 :         struct compact_control *cc = (struct compact_control *)data;
    1761             : 
    1762           0 :         list_add(&dst->lru, &cc->freepages);
    1763           0 :         cc->nr_freepages++;
    1764           0 : }
    1765             : 
    1766             : /* possible outcome of isolate_migratepages */
    1767             : typedef enum {
    1768             :         ISOLATE_ABORT,          /* Abort compaction now */
    1769             :         ISOLATE_NONE,           /* No pages isolated, continue scanning */
    1770             :         ISOLATE_SUCCESS,        /* Pages isolated, migrate */
    1771             : } isolate_migrate_t;
    1772             : 
    1773             : /*
    1774             :  * Allow userspace to control policy on scanning the unevictable LRU for
    1775             :  * compactable pages.
    1776             :  */
    1777             : static int sysctl_compact_unevictable_allowed __read_mostly = CONFIG_COMPACT_UNEVICTABLE_DEFAULT;
    1778             : /*
    1779             :  * Tunable for proactive compaction. It determines how
    1780             :  * aggressively the kernel should compact memory in the
    1781             :  * background. It takes values in the range [0, 100].
    1782             :  */
    1783             : static unsigned int __read_mostly sysctl_compaction_proactiveness = 20;
    1784             : static int sysctl_extfrag_threshold = 500;
    1785             : static int __read_mostly sysctl_compact_memory;
    1786             : 
    1787             : static inline void
    1788             : update_fast_start_pfn(struct compact_control *cc, unsigned long pfn)
    1789             : {
    1790           0 :         if (cc->fast_start_pfn == ULONG_MAX)
    1791             :                 return;
    1792             : 
    1793           0 :         if (!cc->fast_start_pfn)
    1794           0 :                 cc->fast_start_pfn = pfn;
    1795             : 
    1796           0 :         cc->fast_start_pfn = min(cc->fast_start_pfn, pfn);
    1797             : }
    1798             : 
    1799             : static inline unsigned long
    1800             : reinit_migrate_pfn(struct compact_control *cc)
    1801             : {
    1802           0 :         if (!cc->fast_start_pfn || cc->fast_start_pfn == ULONG_MAX)
    1803           0 :                 return cc->migrate_pfn;
    1804             : 
    1805           0 :         cc->migrate_pfn = cc->fast_start_pfn;
    1806           0 :         cc->fast_start_pfn = ULONG_MAX;
    1807             : 
    1808             :         return cc->migrate_pfn;
    1809             : }
    1810             : 
    1811             : /*
    1812             :  * Briefly search the free lists for a migration source that already has
    1813             :  * some free pages to reduce the number of pages that need migration
    1814             :  * before a pageblock is free.
    1815             :  */
    1816           0 : static unsigned long fast_find_migrateblock(struct compact_control *cc)
    1817             : {
    1818           0 :         unsigned int limit = freelist_scan_limit(cc);
    1819           0 :         unsigned int nr_scanned = 0;
    1820             :         unsigned long distance;
    1821           0 :         unsigned long pfn = cc->migrate_pfn;
    1822             :         unsigned long high_pfn;
    1823             :         int order;
    1824           0 :         bool found_block = false;
    1825             : 
    1826             :         /* Skip hints are relied on to avoid repeats on the fast search */
    1827           0 :         if (cc->ignore_skip_hint)
    1828             :                 return pfn;
    1829             : 
    1830             :         /*
    1831             :          * If the pageblock should be finished then do not select a different
    1832             :          * pageblock.
    1833             :          */
    1834           0 :         if (cc->finish_pageblock)
    1835             :                 return pfn;
    1836             : 
    1837             :         /*
    1838             :          * If the migrate_pfn is not at the start of a zone or the start
    1839             :          * of a pageblock then assume this is a continuation of a previous
    1840             :          * scan restarted due to COMPACT_CLUSTER_MAX.
    1841             :          */
    1842           0 :         if (pfn != cc->zone->zone_start_pfn && pfn != pageblock_start_pfn(pfn))
    1843             :                 return pfn;
    1844             : 
    1845             :         /*
    1846             :          * For smaller orders, just linearly scan as the number of pages
    1847             :          * to migrate should be relatively small and does not necessarily
    1848             :          * justify freeing up a large block for a small allocation.
    1849             :          */
    1850           0 :         if (cc->order <= PAGE_ALLOC_COSTLY_ORDER)
    1851             :                 return pfn;
    1852             : 
    1853             :         /*
    1854             :          * Only allow kcompactd and direct requests for movable pages to
    1855             :          * quickly clear out a MOVABLE pageblock for allocation. This
    1856             :          * reduces the risk that a large movable pageblock is freed for
    1857             :          * an unmovable/reclaimable small allocation.
    1858             :          */
    1859           0 :         if (cc->direct_compaction && cc->migratetype != MIGRATE_MOVABLE)
    1860             :                 return pfn;
    1861             : 
    1862             :         /*
    1863             :          * When starting the migration scanner, pick any pageblock within the
    1864             :          * first half of the search space. Otherwise try and pick a pageblock
    1865             :          * within the first eighth to reduce the chances that a migration
    1866             :          * target later becomes a source.
    1867             :          */
    1868           0 :         distance = (cc->free_pfn - cc->migrate_pfn) >> 1;
    1869           0 :         if (cc->migrate_pfn != cc->zone->zone_start_pfn)
    1870           0 :                 distance >>= 2;
    1871           0 :         high_pfn = pageblock_start_pfn(cc->migrate_pfn + distance);
    1872             : 
    1873           0 :         for (order = cc->order - 1;
    1874           0 :              order >= PAGE_ALLOC_COSTLY_ORDER && !found_block && nr_scanned < limit;
    1875           0 :              order--) {
    1876           0 :                 struct free_area *area = &cc->zone->free_area[order];
    1877             :                 struct list_head *freelist;
    1878             :                 unsigned long flags;
    1879             :                 struct page *freepage;
    1880             : 
    1881           0 :                 if (!area->nr_free)
    1882           0 :                         continue;
    1883             : 
    1884           0 :                 spin_lock_irqsave(&cc->zone->lock, flags);
    1885           0 :                 freelist = &area->free_list[MIGRATE_MOVABLE];
    1886           0 :                 list_for_each_entry(freepage, freelist, lru) {
    1887             :                         unsigned long free_pfn;
    1888             : 
    1889           0 :                         if (nr_scanned++ >= limit) {
    1890           0 :                                 move_freelist_tail(freelist, freepage);
    1891           0 :                                 break;
    1892             :                         }
    1893             : 
    1894           0 :                         free_pfn = page_to_pfn(freepage);
    1895           0 :                         if (free_pfn < high_pfn) {
    1896             :                                 /*
    1897             :                                  * Avoid if skipped recently. Ideally it would
    1898             :                                  * move to the tail but even safe iteration of
    1899             :                                  * the list assumes an entry is deleted, not
    1900             :                                  * reordered.
    1901             :                                  */
    1902           0 :                                 if (get_pageblock_skip(freepage))
    1903           0 :                                         continue;
    1904             : 
    1905             :                                 /* Reorder to so a future search skips recent pages */
    1906           0 :                                 move_freelist_tail(freelist, freepage);
    1907             : 
    1908           0 :                                 update_fast_start_pfn(cc, free_pfn);
    1909           0 :                                 pfn = pageblock_start_pfn(free_pfn);
    1910           0 :                                 if (pfn < cc->zone->zone_start_pfn)
    1911           0 :                                         pfn = cc->zone->zone_start_pfn;
    1912           0 :                                 cc->fast_search_fail = 0;
    1913           0 :                                 found_block = true;
    1914           0 :                                 break;
    1915             :                         }
    1916             :                 }
    1917           0 :                 spin_unlock_irqrestore(&cc->zone->lock, flags);
    1918             :         }
    1919             : 
    1920           0 :         cc->total_migrate_scanned += nr_scanned;
    1921             : 
    1922             :         /*
    1923             :          * If fast scanning failed then use a cached entry for a page block
    1924             :          * that had free pages as the basis for starting a linear scan.
    1925             :          */
    1926           0 :         if (!found_block) {
    1927           0 :                 cc->fast_search_fail++;
    1928           0 :                 pfn = reinit_migrate_pfn(cc);
    1929             :         }
    1930             :         return pfn;
    1931             : }
    1932             : 
    1933             : /*
    1934             :  * Isolate all pages that can be migrated from the first suitable block,
    1935             :  * starting at the block pointed to by the migrate scanner pfn within
    1936             :  * compact_control.
    1937             :  */
    1938           0 : static isolate_migrate_t isolate_migratepages(struct compact_control *cc)
    1939             : {
    1940             :         unsigned long block_start_pfn;
    1941             :         unsigned long block_end_pfn;
    1942             :         unsigned long low_pfn;
    1943             :         struct page *page;
    1944           0 :         const isolate_mode_t isolate_mode =
    1945           0 :                 (sysctl_compact_unevictable_allowed ? ISOLATE_UNEVICTABLE : 0) |
    1946           0 :                 (cc->mode != MIGRATE_SYNC ? ISOLATE_ASYNC_MIGRATE : 0);
    1947             :         bool fast_find_block;
    1948             : 
    1949             :         /*
    1950             :          * Start at where we last stopped, or beginning of the zone as
    1951             :          * initialized by compact_zone(). The first failure will use
    1952             :          * the lowest PFN as the starting point for linear scanning.
    1953             :          */
    1954           0 :         low_pfn = fast_find_migrateblock(cc);
    1955           0 :         block_start_pfn = pageblock_start_pfn(low_pfn);
    1956           0 :         if (block_start_pfn < cc->zone->zone_start_pfn)
    1957           0 :                 block_start_pfn = cc->zone->zone_start_pfn;
    1958             : 
    1959             :         /*
    1960             :          * fast_find_migrateblock marks a pageblock skipped so to avoid
    1961             :          * the isolation_suitable check below, check whether the fast
    1962             :          * search was successful.
    1963             :          */
    1964           0 :         fast_find_block = low_pfn != cc->migrate_pfn && !cc->fast_search_fail;
    1965             : 
    1966             :         /* Only scan within a pageblock boundary */
    1967           0 :         block_end_pfn = pageblock_end_pfn(low_pfn);
    1968             : 
    1969             :         /*
    1970             :          * Iterate over whole pageblocks until we find the first suitable.
    1971             :          * Do not cross the free scanner.
    1972             :          */
    1973           0 :         for (; block_end_pfn <= cc->free_pfn;
    1974           0 :                         fast_find_block = false,
    1975           0 :                         cc->migrate_pfn = low_pfn = block_end_pfn,
    1976           0 :                         block_start_pfn = block_end_pfn,
    1977           0 :                         block_end_pfn += pageblock_nr_pages) {
    1978             : 
    1979             :                 /*
    1980             :                  * This can potentially iterate a massively long zone with
    1981             :                  * many pageblocks unsuitable, so periodically check if we
    1982             :                  * need to schedule.
    1983             :                  */
    1984           0 :                 if (!(low_pfn % (COMPACT_CLUSTER_MAX * pageblock_nr_pages)))
    1985           0 :                         cond_resched();
    1986             : 
    1987           0 :                 page = pageblock_pfn_to_page(block_start_pfn,
    1988             :                                                 block_end_pfn, cc->zone);
    1989           0 :                 if (!page) {
    1990             :                         unsigned long next_pfn;
    1991             : 
    1992           0 :                         next_pfn = skip_offline_sections(block_start_pfn);
    1993             :                         if (next_pfn)
    1994             :                                 block_end_pfn = min(next_pfn, cc->free_pfn);
    1995           0 :                         continue;
    1996             :                 }
    1997             : 
    1998             :                 /*
    1999             :                  * If isolation recently failed, do not retry. Only check the
    2000             :                  * pageblock once. COMPACT_CLUSTER_MAX causes a pageblock
    2001             :                  * to be visited multiple times. Assume skip was checked
    2002             :                  * before making it "skip" so other compaction instances do
    2003             :                  * not scan the same block.
    2004             :                  */
    2005           0 :                 if (pageblock_aligned(low_pfn) &&
    2006           0 :                     !fast_find_block && !isolation_suitable(cc, page))
    2007           0 :                         continue;
    2008             : 
    2009             :                 /*
    2010             :                  * For async direct compaction, only scan the pageblocks of the
    2011             :                  * same migratetype without huge pages. Async direct compaction
    2012             :                  * is optimistic to see if the minimum amount of work satisfies
    2013             :                  * the allocation. The cached PFN is updated as it's possible
    2014             :                  * that all remaining blocks between source and target are
    2015             :                  * unsuitable and the compaction scanners fail to meet.
    2016             :                  */
    2017           0 :                 if (!suitable_migration_source(cc, page)) {
    2018           0 :                         update_cached_migrate(cc, block_end_pfn);
    2019           0 :                         continue;
    2020             :                 }
    2021             : 
    2022             :                 /* Perform the isolation */
    2023           0 :                 if (isolate_migratepages_block(cc, low_pfn, block_end_pfn,
    2024             :                                                 isolate_mode))
    2025             :                         return ISOLATE_ABORT;
    2026             : 
    2027             :                 /*
    2028             :                  * Either we isolated something and proceed with migration. Or
    2029             :                  * we failed and compact_zone should decide if we should
    2030             :                  * continue or not.
    2031             :                  */
    2032             :                 break;
    2033             :         }
    2034             : 
    2035           0 :         return cc->nr_migratepages ? ISOLATE_SUCCESS : ISOLATE_NONE;
    2036             : }
    2037             : 
    2038             : /*
    2039             :  * order == -1 is expected when compacting via
    2040             :  * /proc/sys/vm/compact_memory
    2041             :  */
    2042             : static inline bool is_via_compact_memory(int order)
    2043             : {
    2044             :         return order == -1;
    2045             : }
    2046             : 
    2047             : /*
    2048             :  * Determine whether kswapd is (or recently was!) running on this node.
    2049             :  *
    2050             :  * pgdat_kswapd_lock() pins pgdat->kswapd, so a concurrent kswapd_stop() can't
    2051             :  * zero it.
    2052             :  */
    2053             : static bool kswapd_is_running(pg_data_t *pgdat)
    2054             : {
    2055             :         bool running;
    2056             : 
    2057           0 :         pgdat_kswapd_lock(pgdat);
    2058           0 :         running = pgdat->kswapd && task_is_running(pgdat->kswapd);
    2059           0 :         pgdat_kswapd_unlock(pgdat);
    2060             : 
    2061             :         return running;
    2062             : }
    2063             : 
    2064             : /*
    2065             :  * A zone's fragmentation score is the external fragmentation wrt to the
    2066             :  * COMPACTION_HPAGE_ORDER. It returns a value in the range [0, 100].
    2067             :  */
    2068             : static unsigned int fragmentation_score_zone(struct zone *zone)
    2069             : {
    2070           0 :         return extfrag_for_order(zone, COMPACTION_HPAGE_ORDER);
    2071             : }
    2072             : 
    2073             : /*
    2074             :  * A weighted zone's fragmentation score is the external fragmentation
    2075             :  * wrt to the COMPACTION_HPAGE_ORDER scaled by the zone's size. It
    2076             :  * returns a value in the range [0, 100].
    2077             :  *
    2078             :  * The scaling factor ensures that proactive compaction focuses on larger
    2079             :  * zones like ZONE_NORMAL, rather than smaller, specialized zones like
    2080             :  * ZONE_DMA32. For smaller zones, the score value remains close to zero,
    2081             :  * and thus never exceeds the high threshold for proactive compaction.
    2082             :  */
    2083             : static unsigned int fragmentation_score_zone_weighted(struct zone *zone)
    2084             : {
    2085             :         unsigned long score;
    2086             : 
    2087           0 :         score = zone->present_pages * fragmentation_score_zone(zone);
    2088           0 :         return div64_ul(score, zone->zone_pgdat->node_present_pages + 1);
    2089             : }
    2090             : 
    2091             : /*
    2092             :  * The per-node proactive (background) compaction process is started by its
    2093             :  * corresponding kcompactd thread when the node's fragmentation score
    2094             :  * exceeds the high threshold. The compaction process remains active till
    2095             :  * the node's score falls below the low threshold, or one of the back-off
    2096             :  * conditions is met.
    2097             :  */
    2098           0 : static unsigned int fragmentation_score_node(pg_data_t *pgdat)
    2099             : {
    2100           0 :         unsigned int score = 0;
    2101             :         int zoneid;
    2102             : 
    2103           0 :         for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
    2104             :                 struct zone *zone;
    2105             : 
    2106           0 :                 zone = &pgdat->node_zones[zoneid];
    2107           0 :                 if (!populated_zone(zone))
    2108           0 :                         continue;
    2109           0 :                 score += fragmentation_score_zone_weighted(zone);
    2110             :         }
    2111             : 
    2112           0 :         return score;
    2113             : }
    2114             : 
    2115             : static unsigned int fragmentation_score_wmark(pg_data_t *pgdat, bool low)
    2116             : {
    2117             :         unsigned int wmark_low;
    2118             : 
    2119             :         /*
    2120             :          * Cap the low watermark to avoid excessive compaction
    2121             :          * activity in case a user sets the proactiveness tunable
    2122             :          * close to 100 (maximum).
    2123             :          */
    2124           0 :         wmark_low = max(100U - sysctl_compaction_proactiveness, 5U);
    2125           0 :         return low ? wmark_low : min(wmark_low + 10, 100U);
    2126             : }
    2127             : 
    2128           0 : static bool should_proactive_compact_node(pg_data_t *pgdat)
    2129             : {
    2130             :         int wmark_high;
    2131             : 
    2132           0 :         if (!sysctl_compaction_proactiveness || kswapd_is_running(pgdat))
    2133             :                 return false;
    2134             : 
    2135           0 :         wmark_high = fragmentation_score_wmark(pgdat, false);
    2136           0 :         return fragmentation_score_node(pgdat) > wmark_high;
    2137             : }
    2138             : 
    2139           0 : static enum compact_result __compact_finished(struct compact_control *cc)
    2140             : {
    2141             :         unsigned int order;
    2142           0 :         const int migratetype = cc->migratetype;
    2143             :         int ret;
    2144             : 
    2145             :         /* Compaction run completes if the migrate and free scanner meet */
    2146           0 :         if (compact_scanners_met(cc)) {
    2147             :                 /* Let the next compaction start anew. */
    2148           0 :                 reset_cached_positions(cc->zone);
    2149             : 
    2150             :                 /*
    2151             :                  * Mark that the PG_migrate_skip information should be cleared
    2152             :                  * by kswapd when it goes to sleep. kcompactd does not set the
    2153             :                  * flag itself as the decision to be clear should be directly
    2154             :                  * based on an allocation request.
    2155             :                  */
    2156           0 :                 if (cc->direct_compaction)
    2157           0 :                         cc->zone->compact_blockskip_flush = true;
    2158             : 
    2159           0 :                 if (cc->whole_zone)
    2160             :                         return COMPACT_COMPLETE;
    2161             :                 else
    2162           0 :                         return COMPACT_PARTIAL_SKIPPED;
    2163             :         }
    2164             : 
    2165           0 :         if (cc->proactive_compaction) {
    2166             :                 int score, wmark_low;
    2167             :                 pg_data_t *pgdat;
    2168             : 
    2169           0 :                 pgdat = cc->zone->zone_pgdat;
    2170           0 :                 if (kswapd_is_running(pgdat))
    2171             :                         return COMPACT_PARTIAL_SKIPPED;
    2172             : 
    2173           0 :                 score = fragmentation_score_zone(cc->zone);
    2174           0 :                 wmark_low = fragmentation_score_wmark(pgdat, true);
    2175             : 
    2176           0 :                 if (score > wmark_low)
    2177             :                         ret = COMPACT_CONTINUE;
    2178             :                 else
    2179           0 :                         ret = COMPACT_SUCCESS;
    2180             : 
    2181             :                 goto out;
    2182             :         }
    2183             : 
    2184           0 :         if (is_via_compact_memory(cc->order))
    2185             :                 return COMPACT_CONTINUE;
    2186             : 
    2187             :         /*
    2188             :          * Always finish scanning a pageblock to reduce the possibility of
    2189             :          * fallbacks in the future. This is particularly important when
    2190             :          * migration source is unmovable/reclaimable but it's not worth
    2191             :          * special casing.
    2192             :          */
    2193           0 :         if (!pageblock_aligned(cc->migrate_pfn))
    2194             :                 return COMPACT_CONTINUE;
    2195             : 
    2196             :         /* Direct compactor: Is a suitable page free? */
    2197           0 :         ret = COMPACT_NO_SUITABLE_PAGE;
    2198           0 :         for (order = cc->order; order <= MAX_ORDER; order++) {
    2199           0 :                 struct free_area *area = &cc->zone->free_area[order];
    2200             :                 bool can_steal;
    2201             : 
    2202             :                 /* Job done if page is free of the right migratetype */
    2203           0 :                 if (!free_area_empty(area, migratetype))
    2204           0 :                         return COMPACT_SUCCESS;
    2205             : 
    2206             : #ifdef CONFIG_CMA
    2207             :                 /* MIGRATE_MOVABLE can fallback on MIGRATE_CMA */
    2208             :                 if (migratetype == MIGRATE_MOVABLE &&
    2209             :                         !free_area_empty(area, MIGRATE_CMA))
    2210             :                         return COMPACT_SUCCESS;
    2211             : #endif
    2212             :                 /*
    2213             :                  * Job done if allocation would steal freepages from
    2214             :                  * other migratetype buddy lists.
    2215             :                  */
    2216           0 :                 if (find_suitable_fallback(area, order, migratetype,
    2217             :                                                 true, &can_steal) != -1)
    2218             :                         /*
    2219             :                          * Movable pages are OK in any pageblock. If we are
    2220             :                          * stealing for a non-movable allocation, make sure
    2221             :                          * we finish compacting the current pageblock first
    2222             :                          * (which is assured by the above migrate_pfn align
    2223             :                          * check) so it is as free as possible and we won't
    2224             :                          * have to steal another one soon.
    2225             :                          */
    2226             :                         return COMPACT_SUCCESS;
    2227             :         }
    2228             : 
    2229             : out:
    2230           0 :         if (cc->contended || fatal_signal_pending(current))
    2231             :                 ret = COMPACT_CONTENDED;
    2232             : 
    2233           0 :         return ret;
    2234             : }
    2235             : 
    2236             : static enum compact_result compact_finished(struct compact_control *cc)
    2237             : {
    2238             :         int ret;
    2239             : 
    2240           0 :         ret = __compact_finished(cc);
    2241           0 :         trace_mm_compaction_finished(cc->zone, cc->order, ret);
    2242           0 :         if (ret == COMPACT_NO_SUITABLE_PAGE)
    2243           0 :                 ret = COMPACT_CONTINUE;
    2244             : 
    2245           0 :         return ret;
    2246             : }
    2247             : 
    2248           0 : static bool __compaction_suitable(struct zone *zone, int order,
    2249             :                                   int highest_zoneidx,
    2250             :                                   unsigned long wmark_target)
    2251             : {
    2252             :         unsigned long watermark;
    2253             :         /*
    2254             :          * Watermarks for order-0 must be met for compaction to be able to
    2255             :          * isolate free pages for migration targets. This means that the
    2256             :          * watermark and alloc_flags have to match, or be more pessimistic than
    2257             :          * the check in __isolate_free_page(). We don't use the direct
    2258             :          * compactor's alloc_flags, as they are not relevant for freepage
    2259             :          * isolation. We however do use the direct compactor's highest_zoneidx
    2260             :          * to skip over zones where lowmem reserves would prevent allocation
    2261             :          * even if compaction succeeds.
    2262             :          * For costly orders, we require low watermark instead of min for
    2263             :          * compaction to proceed to increase its chances.
    2264             :          * ALLOC_CMA is used, as pages in CMA pageblocks are considered
    2265             :          * suitable migration targets
    2266             :          */
    2267           0 :         watermark = (order > PAGE_ALLOC_COSTLY_ORDER) ?
    2268           0 :                                 low_wmark_pages(zone) : min_wmark_pages(zone);
    2269           0 :         watermark += compact_gap(order);
    2270           0 :         return __zone_watermark_ok(zone, 0, watermark, highest_zoneidx,
    2271             :                                    ALLOC_CMA, wmark_target);
    2272             : }
    2273             : 
    2274             : /*
    2275             :  * compaction_suitable: Is this suitable to run compaction on this zone now?
    2276             :  */
    2277           0 : bool compaction_suitable(struct zone *zone, int order, int highest_zoneidx)
    2278             : {
    2279             :         enum compact_result compact_result;
    2280             :         bool suitable;
    2281             : 
    2282           0 :         suitable = __compaction_suitable(zone, order, highest_zoneidx,
    2283             :                                          zone_page_state(zone, NR_FREE_PAGES));
    2284             :         /*
    2285             :          * fragmentation index determines if allocation failures are due to
    2286             :          * low memory or external fragmentation
    2287             :          *
    2288             :          * index of -1000 would imply allocations might succeed depending on
    2289             :          * watermarks, but we already failed the high-order watermark check
    2290             :          * index towards 0 implies failure is due to lack of memory
    2291             :          * index towards 1000 implies failure is due to fragmentation
    2292             :          *
    2293             :          * Only compact if a failure would be due to fragmentation. Also
    2294             :          * ignore fragindex for non-costly orders where the alternative to
    2295             :          * a successful reclaim/compaction is OOM. Fragindex and the
    2296             :          * vm.extfrag_threshold sysctl is meant as a heuristic to prevent
    2297             :          * excessive compaction for costly orders, but it should not be at the
    2298             :          * expense of system stability.
    2299             :          */
    2300           0 :         if (suitable) {
    2301           0 :                 compact_result = COMPACT_CONTINUE;
    2302           0 :                 if (order > PAGE_ALLOC_COSTLY_ORDER) {
    2303           0 :                         int fragindex = fragmentation_index(zone, order);
    2304             : 
    2305           0 :                         if (fragindex >= 0 &&
    2306           0 :                             fragindex <= sysctl_extfrag_threshold) {
    2307           0 :                                 suitable = false;
    2308           0 :                                 compact_result = COMPACT_NOT_SUITABLE_ZONE;
    2309             :                         }
    2310             :                 }
    2311             :         } else {
    2312             :                 compact_result = COMPACT_SKIPPED;
    2313             :         }
    2314             : 
    2315           0 :         trace_mm_compaction_suitable(zone, order, compact_result);
    2316             : 
    2317           0 :         return suitable;
    2318             : }
    2319             : 
    2320           0 : bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
    2321             :                 int alloc_flags)
    2322             : {
    2323             :         struct zone *zone;
    2324             :         struct zoneref *z;
    2325             : 
    2326             :         /*
    2327             :          * Make sure at least one zone would pass __compaction_suitable if we continue
    2328             :          * retrying the reclaim.
    2329             :          */
    2330           0 :         for_each_zone_zonelist_nodemask(zone, z, ac->zonelist,
    2331             :                                 ac->highest_zoneidx, ac->nodemask) {
    2332             :                 unsigned long available;
    2333             : 
    2334             :                 /*
    2335             :                  * Do not consider all the reclaimable memory because we do not
    2336             :                  * want to trash just for a single high order allocation which
    2337             :                  * is even not guaranteed to appear even if __compaction_suitable
    2338             :                  * is happy about the watermark check.
    2339             :                  */
    2340           0 :                 available = zone_reclaimable_pages(zone) / order;
    2341           0 :                 available += zone_page_state_snapshot(zone, NR_FREE_PAGES);
    2342           0 :                 if (__compaction_suitable(zone, order, ac->highest_zoneidx,
    2343             :                                           available))
    2344             :                         return true;
    2345             :         }
    2346             : 
    2347             :         return false;
    2348             : }
    2349             : 
    2350             : static enum compact_result
    2351           0 : compact_zone(struct compact_control *cc, struct capture_control *capc)
    2352             : {
    2353             :         enum compact_result ret;
    2354           0 :         unsigned long start_pfn = cc->zone->zone_start_pfn;
    2355           0 :         unsigned long end_pfn = zone_end_pfn(cc->zone);
    2356             :         unsigned long last_migrated_pfn;
    2357           0 :         const bool sync = cc->mode != MIGRATE_ASYNC;
    2358             :         bool update_cached;
    2359           0 :         unsigned int nr_succeeded = 0;
    2360             : 
    2361             :         /*
    2362             :          * These counters track activities during zone compaction.  Initialize
    2363             :          * them before compacting a new zone.
    2364             :          */
    2365           0 :         cc->total_migrate_scanned = 0;
    2366           0 :         cc->total_free_scanned = 0;
    2367           0 :         cc->nr_migratepages = 0;
    2368           0 :         cc->nr_freepages = 0;
    2369           0 :         INIT_LIST_HEAD(&cc->freepages);
    2370           0 :         INIT_LIST_HEAD(&cc->migratepages);
    2371             : 
    2372           0 :         cc->migratetype = gfp_migratetype(cc->gfp_mask);
    2373             : 
    2374           0 :         if (!is_via_compact_memory(cc->order)) {
    2375             :                 unsigned long watermark;
    2376             : 
    2377             :                 /* Allocation can already succeed, nothing to do */
    2378           0 :                 watermark = wmark_pages(cc->zone,
    2379             :                                         cc->alloc_flags & ALLOC_WMARK_MASK);
    2380           0 :                 if (zone_watermark_ok(cc->zone, cc->order, watermark,
    2381             :                                       cc->highest_zoneidx, cc->alloc_flags))
    2382             :                         return COMPACT_SUCCESS;
    2383             : 
    2384             :                 /* Compaction is likely to fail */
    2385           0 :                 if (!compaction_suitable(cc->zone, cc->order,
    2386             :                                          cc->highest_zoneidx))
    2387             :                         return COMPACT_SKIPPED;
    2388             :         }
    2389             : 
    2390             :         /*
    2391             :          * Clear pageblock skip if there were failures recently and compaction
    2392             :          * is about to be retried after being deferred.
    2393             :          */
    2394           0 :         if (compaction_restarting(cc->zone, cc->order))
    2395           0 :                 __reset_isolation_suitable(cc->zone);
    2396             : 
    2397             :         /*
    2398             :          * Setup to move all movable pages to the end of the zone. Used cached
    2399             :          * information on where the scanners should start (unless we explicitly
    2400             :          * want to compact the whole zone), but check that it is initialised
    2401             :          * by ensuring the values are within zone boundaries.
    2402             :          */
    2403           0 :         cc->fast_start_pfn = 0;
    2404           0 :         if (cc->whole_zone) {
    2405           0 :                 cc->migrate_pfn = start_pfn;
    2406           0 :                 cc->free_pfn = pageblock_start_pfn(end_pfn - 1);
    2407             :         } else {
    2408           0 :                 cc->migrate_pfn = cc->zone->compact_cached_migrate_pfn[sync];
    2409           0 :                 cc->free_pfn = cc->zone->compact_cached_free_pfn;
    2410           0 :                 if (cc->free_pfn < start_pfn || cc->free_pfn >= end_pfn) {
    2411           0 :                         cc->free_pfn = pageblock_start_pfn(end_pfn - 1);
    2412           0 :                         cc->zone->compact_cached_free_pfn = cc->free_pfn;
    2413             :                 }
    2414           0 :                 if (cc->migrate_pfn < start_pfn || cc->migrate_pfn >= end_pfn) {
    2415           0 :                         cc->migrate_pfn = start_pfn;
    2416           0 :                         cc->zone->compact_cached_migrate_pfn[0] = cc->migrate_pfn;
    2417           0 :                         cc->zone->compact_cached_migrate_pfn[1] = cc->migrate_pfn;
    2418             :                 }
    2419             : 
    2420           0 :                 if (cc->migrate_pfn <= cc->zone->compact_init_migrate_pfn)
    2421           0 :                         cc->whole_zone = true;
    2422             :         }
    2423             : 
    2424           0 :         last_migrated_pfn = 0;
    2425             : 
    2426             :         /*
    2427             :          * Migrate has separate cached PFNs for ASYNC and SYNC* migration on
    2428             :          * the basis that some migrations will fail in ASYNC mode. However,
    2429             :          * if the cached PFNs match and pageblocks are skipped due to having
    2430             :          * no isolation candidates, then the sync state does not matter.
    2431             :          * Until a pageblock with isolation candidates is found, keep the
    2432             :          * cached PFNs in sync to avoid revisiting the same blocks.
    2433             :          */
    2434           0 :         update_cached = !sync &&
    2435           0 :                 cc->zone->compact_cached_migrate_pfn[0] == cc->zone->compact_cached_migrate_pfn[1];
    2436             : 
    2437           0 :         trace_mm_compaction_begin(cc, start_pfn, end_pfn, sync);
    2438             : 
    2439             :         /* lru_add_drain_all could be expensive with involving other CPUs */
    2440           0 :         lru_add_drain();
    2441             : 
    2442           0 :         while ((ret = compact_finished(cc)) == COMPACT_CONTINUE) {
    2443             :                 int err;
    2444           0 :                 unsigned long iteration_start_pfn = cc->migrate_pfn;
    2445             : 
    2446             :                 /*
    2447             :                  * Avoid multiple rescans of the same pageblock which can
    2448             :                  * happen if a page cannot be isolated (dirty/writeback in
    2449             :                  * async mode) or if the migrated pages are being allocated
    2450             :                  * before the pageblock is cleared.  The first rescan will
    2451             :                  * capture the entire pageblock for migration. If it fails,
    2452             :                  * it'll be marked skip and scanning will proceed as normal.
    2453             :                  */
    2454           0 :                 cc->finish_pageblock = false;
    2455           0 :                 if (pageblock_start_pfn(last_migrated_pfn) ==
    2456             :                     pageblock_start_pfn(iteration_start_pfn)) {
    2457           0 :                         cc->finish_pageblock = true;
    2458             :                 }
    2459             : 
    2460             : rescan:
    2461           0 :                 switch (isolate_migratepages(cc)) {
    2462             :                 case ISOLATE_ABORT:
    2463           0 :                         ret = COMPACT_CONTENDED;
    2464           0 :                         putback_movable_pages(&cc->migratepages);
    2465           0 :                         cc->nr_migratepages = 0;
    2466           0 :                         goto out;
    2467             :                 case ISOLATE_NONE:
    2468           0 :                         if (update_cached) {
    2469           0 :                                 cc->zone->compact_cached_migrate_pfn[1] =
    2470           0 :                                         cc->zone->compact_cached_migrate_pfn[0];
    2471             :                         }
    2472             : 
    2473             :                         /*
    2474             :                          * We haven't isolated and migrated anything, but
    2475             :                          * there might still be unflushed migrations from
    2476             :                          * previous cc->order aligned block.
    2477             :                          */
    2478             :                         goto check_drain;
    2479             :                 case ISOLATE_SUCCESS:
    2480           0 :                         update_cached = false;
    2481           0 :                         last_migrated_pfn = iteration_start_pfn;
    2482             :                 }
    2483             : 
    2484           0 :                 err = migrate_pages(&cc->migratepages, compaction_alloc,
    2485             :                                 compaction_free, (unsigned long)cc, cc->mode,
    2486             :                                 MR_COMPACTION, &nr_succeeded);
    2487             : 
    2488           0 :                 trace_mm_compaction_migratepages(cc, nr_succeeded);
    2489             : 
    2490             :                 /* All pages were either migrated or will be released */
    2491           0 :                 cc->nr_migratepages = 0;
    2492           0 :                 if (err) {
    2493           0 :                         putback_movable_pages(&cc->migratepages);
    2494             :                         /*
    2495             :                          * migrate_pages() may return -ENOMEM when scanners meet
    2496             :                          * and we want compact_finished() to detect it
    2497             :                          */
    2498           0 :                         if (err == -ENOMEM && !compact_scanners_met(cc)) {
    2499             :                                 ret = COMPACT_CONTENDED;
    2500             :                                 goto out;
    2501             :                         }
    2502             :                         /*
    2503             :                          * If an ASYNC or SYNC_LIGHT fails to migrate a page
    2504             :                          * within the current order-aligned block and
    2505             :                          * fast_find_migrateblock may be used then scan the
    2506             :                          * remainder of the pageblock. This will mark the
    2507             :                          * pageblock "skip" to avoid rescanning in the near
    2508             :                          * future. This will isolate more pages than necessary
    2509             :                          * for the request but avoid loops due to
    2510             :                          * fast_find_migrateblock revisiting blocks that were
    2511             :                          * recently partially scanned.
    2512             :                          */
    2513           0 :                         if (!pageblock_aligned(cc->migrate_pfn) &&
    2514           0 :                             !cc->ignore_skip_hint && !cc->finish_pageblock &&
    2515           0 :                             (cc->mode < MIGRATE_SYNC)) {
    2516           0 :                                 cc->finish_pageblock = true;
    2517             : 
    2518             :                                 /*
    2519             :                                  * Draining pcplists does not help THP if
    2520             :                                  * any page failed to migrate. Even after
    2521             :                                  * drain, the pageblock will not be free.
    2522             :                                  */
    2523           0 :                                 if (cc->order == COMPACTION_HPAGE_ORDER)
    2524           0 :                                         last_migrated_pfn = 0;
    2525             : 
    2526             :                                 goto rescan;
    2527             :                         }
    2528             :                 }
    2529             : 
    2530             :                 /* Stop if a page has been captured */
    2531           0 :                 if (capc && capc->page) {
    2532             :                         ret = COMPACT_SUCCESS;
    2533             :                         break;
    2534             :                 }
    2535             : 
    2536             : check_drain:
    2537             :                 /*
    2538             :                  * Has the migration scanner moved away from the previous
    2539             :                  * cc->order aligned block where we migrated from? If yes,
    2540             :                  * flush the pages that were freed, so that they can merge and
    2541             :                  * compact_finished() can detect immediately if allocation
    2542             :                  * would succeed.
    2543             :                  */
    2544           0 :                 if (cc->order > 0 && last_migrated_pfn) {
    2545           0 :                         unsigned long current_block_start =
    2546           0 :                                 block_start_pfn(cc->migrate_pfn, cc->order);
    2547             : 
    2548           0 :                         if (last_migrated_pfn < current_block_start) {
    2549           0 :                                 lru_add_drain_cpu_zone(cc->zone);
    2550             :                                 /* No more flushing until we migrate again */
    2551           0 :                                 last_migrated_pfn = 0;
    2552             :                         }
    2553             :                 }
    2554             :         }
    2555             : 
    2556             : out:
    2557             :         /*
    2558             :          * Release free pages and update where the free scanner should restart,
    2559             :          * so we don't leave any returned pages behind in the next attempt.
    2560             :          */
    2561           0 :         if (cc->nr_freepages > 0) {
    2562           0 :                 unsigned long free_pfn = release_freepages(&cc->freepages);
    2563             : 
    2564           0 :                 cc->nr_freepages = 0;
    2565             :                 VM_BUG_ON(free_pfn == 0);
    2566             :                 /* The cached pfn is always the first in a pageblock */
    2567           0 :                 free_pfn = pageblock_start_pfn(free_pfn);
    2568             :                 /*
    2569             :                  * Only go back, not forward. The cached pfn might have been
    2570             :                  * already reset to zone end in compact_finished()
    2571             :                  */
    2572           0 :                 if (free_pfn > cc->zone->compact_cached_free_pfn)
    2573           0 :                         cc->zone->compact_cached_free_pfn = free_pfn;
    2574             :         }
    2575             : 
    2576           0 :         count_compact_events(COMPACTMIGRATE_SCANNED, cc->total_migrate_scanned);
    2577           0 :         count_compact_events(COMPACTFREE_SCANNED, cc->total_free_scanned);
    2578             : 
    2579           0 :         trace_mm_compaction_end(cc, start_pfn, end_pfn, sync, ret);
    2580             : 
    2581             :         VM_BUG_ON(!list_empty(&cc->freepages));
    2582             :         VM_BUG_ON(!list_empty(&cc->migratepages));
    2583             : 
    2584           0 :         return ret;
    2585             : }
    2586             : 
    2587           0 : static enum compact_result compact_zone_order(struct zone *zone, int order,
    2588             :                 gfp_t gfp_mask, enum compact_priority prio,
    2589             :                 unsigned int alloc_flags, int highest_zoneidx,
    2590             :                 struct page **capture)
    2591             : {
    2592             :         enum compact_result ret;
    2593           0 :         struct compact_control cc = {
    2594             :                 .order = order,
    2595             :                 .search_order = order,
    2596             :                 .gfp_mask = gfp_mask,
    2597             :                 .zone = zone,
    2598             :                 .mode = (prio == COMPACT_PRIO_ASYNC) ?
    2599           0 :                                         MIGRATE_ASYNC : MIGRATE_SYNC_LIGHT,
    2600             :                 .alloc_flags = alloc_flags,
    2601             :                 .highest_zoneidx = highest_zoneidx,
    2602             :                 .direct_compaction = true,
    2603             :                 .whole_zone = (prio == MIN_COMPACT_PRIORITY),
    2604           0 :                 .ignore_skip_hint = (prio == MIN_COMPACT_PRIORITY),
    2605             :                 .ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY)
    2606             :         };
    2607           0 :         struct capture_control capc = {
    2608             :                 .cc = &cc,
    2609             :                 .page = NULL,
    2610             :         };
    2611             : 
    2612             :         /*
    2613             :          * Make sure the structs are really initialized before we expose the
    2614             :          * capture control, in case we are interrupted and the interrupt handler
    2615             :          * frees a page.
    2616             :          */
    2617           0 :         barrier();
    2618           0 :         WRITE_ONCE(current->capture_control, &capc);
    2619             : 
    2620           0 :         ret = compact_zone(&cc, &capc);
    2621             : 
    2622             :         /*
    2623             :          * Make sure we hide capture control first before we read the captured
    2624             :          * page pointer, otherwise an interrupt could free and capture a page
    2625             :          * and we would leak it.
    2626             :          */
    2627           0 :         WRITE_ONCE(current->capture_control, NULL);
    2628           0 :         *capture = READ_ONCE(capc.page);
    2629             :         /*
    2630             :          * Technically, it is also possible that compaction is skipped but
    2631             :          * the page is still captured out of luck(IRQ came and freed the page).
    2632             :          * Returning COMPACT_SUCCESS in such cases helps in properly accounting
    2633             :          * the COMPACT[STALL|FAIL] when compaction is skipped.
    2634             :          */
    2635           0 :         if (*capture)
    2636           0 :                 ret = COMPACT_SUCCESS;
    2637             : 
    2638           0 :         return ret;
    2639             : }
    2640             : 
    2641             : /**
    2642             :  * try_to_compact_pages - Direct compact to satisfy a high-order allocation
    2643             :  * @gfp_mask: The GFP mask of the current allocation
    2644             :  * @order: The order of the current allocation
    2645             :  * @alloc_flags: The allocation flags of the current allocation
    2646             :  * @ac: The context of current allocation
    2647             :  * @prio: Determines how hard direct compaction should try to succeed
    2648             :  * @capture: Pointer to free page created by compaction will be stored here
    2649             :  *
    2650             :  * This is the main entry point for direct page compaction.
    2651             :  */
    2652           0 : enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order,
    2653             :                 unsigned int alloc_flags, const struct alloc_context *ac,
    2654             :                 enum compact_priority prio, struct page **capture)
    2655             : {
    2656           0 :         int may_perform_io = (__force int)(gfp_mask & __GFP_IO);
    2657             :         struct zoneref *z;
    2658             :         struct zone *zone;
    2659           0 :         enum compact_result rc = COMPACT_SKIPPED;
    2660             : 
    2661             :         /*
    2662             :          * Check if the GFP flags allow compaction - GFP_NOIO is really
    2663             :          * tricky context because the migration might require IO
    2664             :          */
    2665           0 :         if (!may_perform_io)
    2666             :                 return COMPACT_SKIPPED;
    2667             : 
    2668           0 :         trace_mm_compaction_try_to_compact_pages(order, gfp_mask, prio);
    2669             : 
    2670             :         /* Compact each zone in the list */
    2671           0 :         for_each_zone_zonelist_nodemask(zone, z, ac->zonelist,
    2672             :                                         ac->highest_zoneidx, ac->nodemask) {
    2673             :                 enum compact_result status;
    2674             : 
    2675           0 :                 if (prio > MIN_COMPACT_PRIORITY
    2676           0 :                                         && compaction_deferred(zone, order)) {
    2677           0 :                         rc = max_t(enum compact_result, COMPACT_DEFERRED, rc);
    2678           0 :                         continue;
    2679             :                 }
    2680             : 
    2681           0 :                 status = compact_zone_order(zone, order, gfp_mask, prio,
    2682           0 :                                 alloc_flags, ac->highest_zoneidx, capture);
    2683           0 :                 rc = max(status, rc);
    2684             : 
    2685             :                 /* The allocation should succeed, stop compacting */
    2686           0 :                 if (status == COMPACT_SUCCESS) {
    2687             :                         /*
    2688             :                          * We think the allocation will succeed in this zone,
    2689             :                          * but it is not certain, hence the false. The caller
    2690             :                          * will repeat this with true if allocation indeed
    2691             :                          * succeeds in this zone.
    2692             :                          */
    2693           0 :                         compaction_defer_reset(zone, order, false);
    2694             : 
    2695             :                         break;
    2696             :                 }
    2697             : 
    2698           0 :                 if (prio != COMPACT_PRIO_ASYNC && (status == COMPACT_COMPLETE ||
    2699             :                                         status == COMPACT_PARTIAL_SKIPPED))
    2700             :                         /*
    2701             :                          * We think that allocation won't succeed in this zone
    2702             :                          * so we defer compaction there. If it ends up
    2703             :                          * succeeding after all, it will be reset.
    2704             :                          */
    2705           0 :                         defer_compaction(zone, order);
    2706             : 
    2707             :                 /*
    2708             :                  * We might have stopped compacting due to need_resched() in
    2709             :                  * async compaction, or due to a fatal signal detected. In that
    2710             :                  * case do not try further zones
    2711             :                  */
    2712           0 :                 if ((prio == COMPACT_PRIO_ASYNC && need_resched())
    2713           0 :                                         || fatal_signal_pending(current))
    2714             :                         break;
    2715             :         }
    2716             : 
    2717             :         return rc;
    2718             : }
    2719             : 
    2720             : /*
    2721             :  * Compact all zones within a node till each zone's fragmentation score
    2722             :  * reaches within proactive compaction thresholds (as determined by the
    2723             :  * proactiveness tunable).
    2724             :  *
    2725             :  * It is possible that the function returns before reaching score targets
    2726             :  * due to various back-off conditions, such as, contention on per-node or
    2727             :  * per-zone locks.
    2728             :  */
    2729           0 : static void proactive_compact_node(pg_data_t *pgdat)
    2730             : {
    2731             :         int zoneid;
    2732             :         struct zone *zone;
    2733           0 :         struct compact_control cc = {
    2734             :                 .order = -1,
    2735             :                 .mode = MIGRATE_SYNC_LIGHT,
    2736             :                 .ignore_skip_hint = true,
    2737             :                 .whole_zone = true,
    2738             :                 .gfp_mask = GFP_KERNEL,
    2739             :                 .proactive_compaction = true,
    2740             :         };
    2741             : 
    2742           0 :         for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
    2743           0 :                 zone = &pgdat->node_zones[zoneid];
    2744           0 :                 if (!populated_zone(zone))
    2745           0 :                         continue;
    2746             : 
    2747           0 :                 cc.zone = zone;
    2748             : 
    2749           0 :                 compact_zone(&cc, NULL);
    2750             : 
    2751           0 :                 count_compact_events(KCOMPACTD_MIGRATE_SCANNED,
    2752           0 :                                      cc.total_migrate_scanned);
    2753           0 :                 count_compact_events(KCOMPACTD_FREE_SCANNED,
    2754           0 :                                      cc.total_free_scanned);
    2755             :         }
    2756           0 : }
    2757             : 
    2758             : /* Compact all zones within a node */
    2759           0 : static void compact_node(int nid)
    2760             : {
    2761           0 :         pg_data_t *pgdat = NODE_DATA(nid);
    2762             :         int zoneid;
    2763             :         struct zone *zone;
    2764           0 :         struct compact_control cc = {
    2765             :                 .order = -1,
    2766             :                 .mode = MIGRATE_SYNC,
    2767             :                 .ignore_skip_hint = true,
    2768             :                 .whole_zone = true,
    2769             :                 .gfp_mask = GFP_KERNEL,
    2770             :         };
    2771             : 
    2772             : 
    2773           0 :         for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
    2774             : 
    2775           0 :                 zone = &pgdat->node_zones[zoneid];
    2776           0 :                 if (!populated_zone(zone))
    2777           0 :                         continue;
    2778             : 
    2779           0 :                 cc.zone = zone;
    2780             : 
    2781           0 :                 compact_zone(&cc, NULL);
    2782             :         }
    2783           0 : }
    2784             : 
    2785             : /* Compact all nodes in the system */
    2786             : static void compact_nodes(void)
    2787             : {
    2788             :         int nid;
    2789             : 
    2790             :         /* Flush pending updates to the LRU lists */
    2791           0 :         lru_add_drain_all();
    2792             : 
    2793           0 :         for_each_online_node(nid)
    2794           0 :                 compact_node(nid);
    2795             : }
    2796             : 
    2797           0 : static int compaction_proactiveness_sysctl_handler(struct ctl_table *table, int write,
    2798             :                 void *buffer, size_t *length, loff_t *ppos)
    2799             : {
    2800             :         int rc, nid;
    2801             : 
    2802           0 :         rc = proc_dointvec_minmax(table, write, buffer, length, ppos);
    2803           0 :         if (rc)
    2804             :                 return rc;
    2805             : 
    2806           0 :         if (write && sysctl_compaction_proactiveness) {
    2807           0 :                 for_each_online_node(nid) {
    2808           0 :                         pg_data_t *pgdat = NODE_DATA(nid);
    2809             : 
    2810           0 :                         if (pgdat->proactive_compact_trigger)
    2811           0 :                                 continue;
    2812             : 
    2813           0 :                         pgdat->proactive_compact_trigger = true;
    2814           0 :                         trace_mm_compaction_wakeup_kcompactd(pgdat->node_id, -1,
    2815           0 :                                                              pgdat->nr_zones - 1);
    2816           0 :                         wake_up_interruptible(&pgdat->kcompactd_wait);
    2817             :                 }
    2818             :         }
    2819             : 
    2820             :         return 0;
    2821             : }
    2822             : 
    2823             : /*
    2824             :  * This is the entry point for compacting all nodes via
    2825             :  * /proc/sys/vm/compact_memory
    2826             :  */
    2827           0 : static int sysctl_compaction_handler(struct ctl_table *table, int write,
    2828             :                         void *buffer, size_t *length, loff_t *ppos)
    2829             : {
    2830             :         int ret;
    2831             : 
    2832           0 :         ret = proc_dointvec(table, write, buffer, length, ppos);
    2833           0 :         if (ret)
    2834             :                 return ret;
    2835             : 
    2836           0 :         if (sysctl_compact_memory != 1)
    2837             :                 return -EINVAL;
    2838             : 
    2839           0 :         if (write)
    2840             :                 compact_nodes();
    2841             : 
    2842             :         return 0;
    2843             : }
    2844             : 
    2845             : #if defined(CONFIG_SYSFS) && defined(CONFIG_NUMA)
    2846             : static ssize_t compact_store(struct device *dev,
    2847             :                              struct device_attribute *attr,
    2848             :                              const char *buf, size_t count)
    2849             : {
    2850             :         int nid = dev->id;
    2851             : 
    2852             :         if (nid >= 0 && nid < nr_node_ids && node_online(nid)) {
    2853             :                 /* Flush pending updates to the LRU lists */
    2854             :                 lru_add_drain_all();
    2855             : 
    2856             :                 compact_node(nid);
    2857             :         }
    2858             : 
    2859             :         return count;
    2860             : }
    2861             : static DEVICE_ATTR_WO(compact);
    2862             : 
    2863             : int compaction_register_node(struct node *node)
    2864             : {
    2865             :         return device_create_file(&node->dev, &dev_attr_compact);
    2866             : }
    2867             : 
    2868             : void compaction_unregister_node(struct node *node)
    2869             : {
    2870             :         return device_remove_file(&node->dev, &dev_attr_compact);
    2871             : }
    2872             : #endif /* CONFIG_SYSFS && CONFIG_NUMA */
    2873             : 
    2874             : static inline bool kcompactd_work_requested(pg_data_t *pgdat)
    2875             : {
    2876           4 :         return pgdat->kcompactd_max_order > 0 || kthread_should_stop() ||
    2877           2 :                 pgdat->proactive_compact_trigger;
    2878             : }
    2879             : 
    2880           0 : static bool kcompactd_node_suitable(pg_data_t *pgdat)
    2881             : {
    2882             :         int zoneid;
    2883             :         struct zone *zone;
    2884           0 :         enum zone_type highest_zoneidx = pgdat->kcompactd_highest_zoneidx;
    2885             : 
    2886           0 :         for (zoneid = 0; zoneid <= highest_zoneidx; zoneid++) {
    2887           0 :                 zone = &pgdat->node_zones[zoneid];
    2888             : 
    2889           0 :                 if (!populated_zone(zone))
    2890           0 :                         continue;
    2891             : 
    2892             :                 /* Allocation can already succeed, check other zones */
    2893           0 :                 if (zone_watermark_ok(zone, pgdat->kcompactd_max_order,
    2894           0 :                                       min_wmark_pages(zone),
    2895             :                                       highest_zoneidx, 0))
    2896           0 :                         continue;
    2897             : 
    2898           0 :                 if (compaction_suitable(zone, pgdat->kcompactd_max_order,
    2899             :                                         highest_zoneidx))
    2900             :                         return true;
    2901             :         }
    2902             : 
    2903             :         return false;
    2904             : }
    2905             : 
    2906           0 : static void kcompactd_do_work(pg_data_t *pgdat)
    2907             : {
    2908             :         /*
    2909             :          * With no special task, compact all zones so that a page of requested
    2910             :          * order is allocatable.
    2911             :          */
    2912             :         int zoneid;
    2913             :         struct zone *zone;
    2914           0 :         struct compact_control cc = {
    2915             :                 .order = pgdat->kcompactd_max_order,
    2916           0 :                 .search_order = pgdat->kcompactd_max_order,
    2917           0 :                 .highest_zoneidx = pgdat->kcompactd_highest_zoneidx,
    2918             :                 .mode = MIGRATE_SYNC_LIGHT,
    2919             :                 .ignore_skip_hint = false,
    2920             :                 .gfp_mask = GFP_KERNEL,
    2921             :         };
    2922           0 :         trace_mm_compaction_kcompactd_wake(pgdat->node_id, cc.order,
    2923             :                                                         cc.highest_zoneidx);
    2924           0 :         count_compact_event(KCOMPACTD_WAKE);
    2925             : 
    2926           0 :         for (zoneid = 0; zoneid <= cc.highest_zoneidx; zoneid++) {
    2927             :                 int status;
    2928             : 
    2929           0 :                 zone = &pgdat->node_zones[zoneid];
    2930           0 :                 if (!populated_zone(zone))
    2931           0 :                         continue;
    2932             : 
    2933           0 :                 if (compaction_deferred(zone, cc.order))
    2934           0 :                         continue;
    2935             : 
    2936             :                 /* Allocation can already succeed, nothing to do */
    2937           0 :                 if (zone_watermark_ok(zone, cc.order,
    2938           0 :                                       min_wmark_pages(zone), zoneid, 0))
    2939           0 :                         continue;
    2940             : 
    2941           0 :                 if (!compaction_suitable(zone, cc.order, zoneid))
    2942           0 :                         continue;
    2943             : 
    2944           0 :                 if (kthread_should_stop())
    2945           0 :                         return;
    2946             : 
    2947           0 :                 cc.zone = zone;
    2948           0 :                 status = compact_zone(&cc, NULL);
    2949             : 
    2950           0 :                 if (status == COMPACT_SUCCESS) {
    2951           0 :                         compaction_defer_reset(zone, cc.order, false);
    2952           0 :                 } else if (status == COMPACT_PARTIAL_SKIPPED || status == COMPACT_COMPLETE) {
    2953             :                         /*
    2954             :                          * Buddy pages may become stranded on pcps that could
    2955             :                          * otherwise coalesce on the zone's free area for
    2956             :                          * order >= cc.order.  This is ratelimited by the
    2957             :                          * upcoming deferral.
    2958             :                          */
    2959           0 :                         drain_all_pages(zone);
    2960             : 
    2961             :                         /*
    2962             :                          * We use sync migration mode here, so we defer like
    2963             :                          * sync direct compaction does.
    2964             :                          */
    2965           0 :                         defer_compaction(zone, cc.order);
    2966             :                 }
    2967             : 
    2968           0 :                 count_compact_events(KCOMPACTD_MIGRATE_SCANNED,
    2969           0 :                                      cc.total_migrate_scanned);
    2970           0 :                 count_compact_events(KCOMPACTD_FREE_SCANNED,
    2971           0 :                                      cc.total_free_scanned);
    2972             :         }
    2973             : 
    2974             :         /*
    2975             :          * Regardless of success, we are done until woken up next. But remember
    2976             :          * the requested order/highest_zoneidx in case it was higher/tighter
    2977             :          * than our current ones
    2978             :          */
    2979           0 :         if (pgdat->kcompactd_max_order <= cc.order)
    2980           0 :                 pgdat->kcompactd_max_order = 0;
    2981           0 :         if (pgdat->kcompactd_highest_zoneidx >= cc.highest_zoneidx)
    2982           0 :                 pgdat->kcompactd_highest_zoneidx = pgdat->nr_zones - 1;
    2983             : }
    2984             : 
    2985           1 : void wakeup_kcompactd(pg_data_t *pgdat, int order, int highest_zoneidx)
    2986             : {
    2987           1 :         if (!order)
    2988             :                 return;
    2989             : 
    2990           0 :         if (pgdat->kcompactd_max_order < order)
    2991           0 :                 pgdat->kcompactd_max_order = order;
    2992             : 
    2993           0 :         if (pgdat->kcompactd_highest_zoneidx > highest_zoneidx)
    2994           0 :                 pgdat->kcompactd_highest_zoneidx = highest_zoneidx;
    2995             : 
    2996             :         /*
    2997             :          * Pairs with implicit barrier in wait_event_freezable()
    2998             :          * such that wakeups are not missed.
    2999             :          */
    3000           0 :         if (!wq_has_sleeper(&pgdat->kcompactd_wait))
    3001             :                 return;
    3002             : 
    3003           0 :         if (!kcompactd_node_suitable(pgdat))
    3004             :                 return;
    3005             : 
    3006           0 :         trace_mm_compaction_wakeup_kcompactd(pgdat->node_id, order,
    3007             :                                                         highest_zoneidx);
    3008           0 :         wake_up_interruptible(&pgdat->kcompactd_wait);
    3009             : }
    3010             : 
    3011             : /*
    3012             :  * The background compaction daemon, started as a kernel thread
    3013             :  * from the init process.
    3014             :  */
    3015           1 : static int kcompactd(void *p)
    3016             : {
    3017           1 :         pg_data_t *pgdat = (pg_data_t *)p;
    3018           1 :         struct task_struct *tsk = current;
    3019           1 :         long default_timeout = msecs_to_jiffies(HPAGE_FRAG_CHECK_INTERVAL_MSEC);
    3020           1 :         long timeout = default_timeout;
    3021             : 
    3022           1 :         const struct cpumask *cpumask = cpumask_of_node(pgdat->node_id);
    3023             : 
    3024           1 :         if (!cpumask_empty(cpumask))
    3025           1 :                 set_cpus_allowed_ptr(tsk, cpumask);
    3026             : 
    3027           1 :         set_freezable();
    3028             : 
    3029           1 :         pgdat->kcompactd_max_order = 0;
    3030           1 :         pgdat->kcompactd_highest_zoneidx = pgdat->nr_zones - 1;
    3031             : 
    3032           2 :         while (!kthread_should_stop()) {
    3033             :                 unsigned long pflags;
    3034             : 
    3035             :                 /*
    3036             :                  * Avoid the unnecessary wakeup for proactive compaction
    3037             :                  * when it is disabled.
    3038             :                  */
    3039           1 :                 if (!sysctl_compaction_proactiveness)
    3040           0 :                         timeout = MAX_SCHEDULE_TIMEOUT;
    3041           1 :                 trace_mm_compaction_kcompactd_sleep(pgdat->node_id);
    3042           3 :                 if (wait_event_freezable_timeout(pgdat->kcompactd_wait,
    3043           0 :                         kcompactd_work_requested(pgdat), timeout) &&
    3044           0 :                         !pgdat->proactive_compact_trigger) {
    3045             : 
    3046           0 :                         psi_memstall_enter(&pflags);
    3047           0 :                         kcompactd_do_work(pgdat);
    3048           0 :                         psi_memstall_leave(&pflags);
    3049             :                         /*
    3050             :                          * Reset the timeout value. The defer timeout from
    3051             :                          * proactive compaction is lost here but that is fine
    3052             :                          * as the condition of the zone changing substantionally
    3053             :                          * then carrying on with the previous defer interval is
    3054             :                          * not useful.
    3055             :                          */
    3056           0 :                         timeout = default_timeout;
    3057           0 :                         continue;
    3058             :                 }
    3059             : 
    3060             :                 /*
    3061             :                  * Start the proactive work with default timeout. Based
    3062             :                  * on the fragmentation score, this timeout is updated.
    3063             :                  */
    3064           0 :                 timeout = default_timeout;
    3065           0 :                 if (should_proactive_compact_node(pgdat)) {
    3066             :                         unsigned int prev_score, score;
    3067             : 
    3068           0 :                         prev_score = fragmentation_score_node(pgdat);
    3069           0 :                         proactive_compact_node(pgdat);
    3070           0 :                         score = fragmentation_score_node(pgdat);
    3071             :                         /*
    3072             :                          * Defer proactive compaction if the fragmentation
    3073             :                          * score did not go down i.e. no progress made.
    3074             :                          */
    3075           0 :                         if (unlikely(score >= prev_score))
    3076           0 :                                 timeout =
    3077             :                                    default_timeout << COMPACT_MAX_DEFER_SHIFT;
    3078             :                 }
    3079           0 :                 if (unlikely(pgdat->proactive_compact_trigger))
    3080           0 :                         pgdat->proactive_compact_trigger = false;
    3081             :         }
    3082             : 
    3083           0 :         return 0;
    3084             : }
    3085             : 
    3086             : /*
    3087             :  * This kcompactd start function will be called by init and node-hot-add.
    3088             :  * On node-hot-add, kcompactd will moved to proper cpus if cpus are hot-added.
    3089             :  */
    3090           1 : void __meminit kcompactd_run(int nid)
    3091             : {
    3092           1 :         pg_data_t *pgdat = NODE_DATA(nid);
    3093             : 
    3094           1 :         if (pgdat->kcompactd)
    3095             :                 return;
    3096             : 
    3097           2 :         pgdat->kcompactd = kthread_run(kcompactd, pgdat, "kcompactd%d", nid);
    3098           1 :         if (IS_ERR(pgdat->kcompactd)) {
    3099           0 :                 pr_err("Failed to start kcompactd on node %d\n", nid);
    3100           0 :                 pgdat->kcompactd = NULL;
    3101             :         }
    3102             : }
    3103             : 
    3104             : /*
    3105             :  * Called by memory hotplug when all memory in a node is offlined. Caller must
    3106             :  * be holding mem_hotplug_begin/done().
    3107             :  */
    3108           0 : void __meminit kcompactd_stop(int nid)
    3109             : {
    3110           0 :         struct task_struct *kcompactd = NODE_DATA(nid)->kcompactd;
    3111             : 
    3112           0 :         if (kcompactd) {
    3113           0 :                 kthread_stop(kcompactd);
    3114           0 :                 NODE_DATA(nid)->kcompactd = NULL;
    3115             :         }
    3116           0 : }
    3117             : 
    3118             : /*
    3119             :  * It's optimal to keep kcompactd on the same CPUs as their memory, but
    3120             :  * not required for correctness. So if the last cpu in a node goes
    3121             :  * away, we get changed to run anywhere: as the first one comes back,
    3122             :  * restore their cpu bindings.
    3123             :  */
    3124           0 : static int kcompactd_cpu_online(unsigned int cpu)
    3125             : {
    3126             :         int nid;
    3127             : 
    3128           0 :         for_each_node_state(nid, N_MEMORY) {
    3129           0 :                 pg_data_t *pgdat = NODE_DATA(nid);
    3130             :                 const struct cpumask *mask;
    3131             : 
    3132           0 :                 mask = cpumask_of_node(pgdat->node_id);
    3133             : 
    3134           0 :                 if (cpumask_any_and(cpu_online_mask, mask) < nr_cpu_ids)
    3135             :                         /* One of our CPUs online: restore mask */
    3136           0 :                         if (pgdat->kcompactd)
    3137           0 :                                 set_cpus_allowed_ptr(pgdat->kcompactd, mask);
    3138             :         }
    3139           0 :         return 0;
    3140             : }
    3141             : 
    3142           0 : static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table,
    3143             :                 int write, void *buffer, size_t *lenp, loff_t *ppos)
    3144             : {
    3145             :         int ret, old;
    3146             : 
    3147             :         if (!IS_ENABLED(CONFIG_PREEMPT_RT) || !write)
    3148           0 :                 return proc_dointvec_minmax(table, write, buffer, lenp, ppos);
    3149             : 
    3150             :         old = *(int *)table->data;
    3151             :         ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
    3152             :         if (ret)
    3153             :                 return ret;
    3154             :         if (old != *(int *)table->data)
    3155             :                 pr_warn_once("sysctl attribute %s changed by %s[%d]\n",
    3156             :                              table->procname, current->comm,
    3157             :                              task_pid_nr(current));
    3158             :         return ret;
    3159             : }
    3160             : 
    3161             : static struct ctl_table vm_compaction[] = {
    3162             :         {
    3163             :                 .procname       = "compact_memory",
    3164             :                 .data           = &sysctl_compact_memory,
    3165             :                 .maxlen         = sizeof(int),
    3166             :                 .mode           = 0200,
    3167             :                 .proc_handler   = sysctl_compaction_handler,
    3168             :         },
    3169             :         {
    3170             :                 .procname       = "compaction_proactiveness",
    3171             :                 .data           = &sysctl_compaction_proactiveness,
    3172             :                 .maxlen         = sizeof(sysctl_compaction_proactiveness),
    3173             :                 .mode           = 0644,
    3174             :                 .proc_handler   = compaction_proactiveness_sysctl_handler,
    3175             :                 .extra1         = SYSCTL_ZERO,
    3176             :                 .extra2         = SYSCTL_ONE_HUNDRED,
    3177             :         },
    3178             :         {
    3179             :                 .procname       = "extfrag_threshold",
    3180             :                 .data           = &sysctl_extfrag_threshold,
    3181             :                 .maxlen         = sizeof(int),
    3182             :                 .mode           = 0644,
    3183             :                 .proc_handler   = proc_dointvec_minmax,
    3184             :                 .extra1         = SYSCTL_ZERO,
    3185             :                 .extra2         = SYSCTL_ONE_THOUSAND,
    3186             :         },
    3187             :         {
    3188             :                 .procname       = "compact_unevictable_allowed",
    3189             :                 .data           = &sysctl_compact_unevictable_allowed,
    3190             :                 .maxlen         = sizeof(int),
    3191             :                 .mode           = 0644,
    3192             :                 .proc_handler   = proc_dointvec_minmax_warn_RT_change,
    3193             :                 .extra1         = SYSCTL_ZERO,
    3194             :                 .extra2         = SYSCTL_ONE,
    3195             :         },
    3196             :         { }
    3197             : };
    3198             : 
    3199           1 : static int __init kcompactd_init(void)
    3200             : {
    3201             :         int nid;
    3202             :         int ret;
    3203             : 
    3204           1 :         ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
    3205             :                                         "mm/compaction:online",
    3206             :                                         kcompactd_cpu_online, NULL);
    3207           1 :         if (ret < 0) {
    3208           0 :                 pr_err("kcompactd: failed to register hotplug callbacks.\n");
    3209           0 :                 return ret;
    3210             :         }
    3211             : 
    3212           1 :         for_each_node_state(nid, N_MEMORY)
    3213           1 :                 kcompactd_run(nid);
    3214           1 :         register_sysctl_init("vm", vm_compaction);
    3215           1 :         return 0;
    3216             : }
    3217             : subsys_initcall(kcompactd_init)
    3218             : 
    3219             : #endif /* CONFIG_COMPACTION */

Generated by: LCOV version 1.14