Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Usama Arif <usama.arif@linux.dev>
To: Rik van Riel <riel@surriel.com>
Cc: Usama Arif <usama.arif@linux.dev>,
	linux-kernel@vger.kernel.org, kernel-team@meta.com,
	linux-mm@kvack.org, david@kernel.org, willy@infradead.org,
	surenb@google.com, hannes@cmpxchg.org, ljs@kernel.org,
	ziy@nvidia.com, fvdl@google.com
Subject: Re: [RFC PATCH 05/40] mm: page_alloc: remove watermark boost mechanism
Date: Tue, 26 May 2026 07:02:03 -0700	[thread overview]
Message-ID: <20260526140204.1390573-1-usama.arif@linux.dev> (raw)
In-Reply-To: <20260520150018.2491267-6-riel@surriel.com>

On Wed, 20 May 2026 10:59:11 -0400 Rik van Riel <riel@surriel.com> wrote:

> watermark_boost was introduced to react to fragmentation events at the
> pageblock granularity: a sub-pageblock cross-type fallback would raise
> the zone watermark and wake kswapd, on the theory that reclaiming some
> order-0 pages would reduce future fallbacks.
> 
> With superpageblocks, anti-fragmentation is enforced at 1 GiB SPB
> granularity, and the meaningful signals (CLEAN->TAINT events, empty SPB
> count) live there.  Sub-pageblock fallbacks inside an already-tainted
> SPB do not change the fragmentation picture, and order-0 reclaim does
> not unmix a pageblock or surface a fresh clean SPB.
> 
> Worse, the boost is applied in try_to_claim_block() before the success
> path is decided.  When option 1 (no UNMOVABLE/RECLAIMABLE pageblock
> mixing) rejects a cross-type relabel, the boost has already been
> applied and the next rmqueue() will wake kswapd to drain memory back
> to high+boost - even when free pages are tens of times the high
> watermark.  Real workloads showed bursts of >150 wakeup_kswapd/min,
> all order-0, with stack traces consistently arriving from rmqueue()
> through the boost-cleanup path.  Free memory at the time was 38x the
> high watermark.
> 
> Drop the mechanism entirely:
> 
>   - boost_watermark() and its callsite in try_to_claim_block()
>   - the ZONE_BOOSTED_WATERMARK flag and its set/clear in rmqueue()
>   - zone->watermark_boost and the boost addend in wmark_pages()
>   - the __GFP_HIGH boost-bypass path in zone_watermark_fast()
>   - the watermark_boost_factor sysctl
>   - boost-aware logic in balance_pgdat() (nr_boost_reclaim,
>     zone_boosts[], pgdat_watermark_boosted, the boost-restart goto,
>     no-writeback for boost reclaim, the boost-only kcompactd wakeup)
> 
> Signed-off-by: Rik van Riel <riel@surriel.com>
> Assisted-by: Claude:claude-opus-4.7 syzkaller
> ---
>  Documentation/admin-guide/sysctl/vm.rst |  21 -----
>  Documentation/mm/physical_memory.rst    |  13 +--
>  include/linux/mmzone.h                  |   6 +-
>  mm/page_alloc.c                         |  82 +----------------
>  mm/show_mem.c                           |   2 -
>  mm/vmscan.c                             | 115 ++----------------------
>  mm/vmstat.c                             |   2 -
>  7 files changed, 14 insertions(+), 227 deletions(-)
> 
> diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-guide/sysctl/vm.rst
> index 97e12359775c..3ddc6115c89a 100644
> --- a/Documentation/admin-guide/sysctl/vm.rst
> +++ b/Documentation/admin-guide/sysctl/vm.rst
> @@ -76,7 +76,6 @@ files can be found in mm/swap.c.
>  - user_reserve_kbytes
>  - vfs_cache_pressure
>  - vfs_cache_pressure_denom
> -- watermark_boost_factor
>  - watermark_scale_factor
>  - zone_reclaim_mode
>  
> @@ -1073,26 +1072,6 @@ vfs_cache_pressure_denom
>  Defaults to 100 (minimum allowed value). Requires corresponding
>  vfs_cache_pressure setting to take effect.
>  
> -watermark_boost_factor
> -======================
> -
> -This factor controls the level of reclaim when memory is being fragmented.
> -It defines the percentage of the high watermark of a zone that will be
> -reclaimed if pages of different mobility are being mixed within pageblocks.
> -The intent is that compaction has less work to do in the future and to
> -increase the success rate of future high-order allocations such as SLUB
> -allocations, THP and hugetlbfs pages.
> -
> -To make it sensible with respect to the watermark_scale_factor
> -parameter, the unit is in fractions of 10,000. The default value of
> -15,000 means that up to 150% of the high watermark will be reclaimed in the
> -event of a pageblock being mixed due to fragmentation. The level of reclaim
> -is determined by the number of fragmentation events that occurred in the
> -recent past. If this value is smaller than a pageblock then a pageblocks
> -worth of pages will be reclaimed (e.g.  2MB on 64-bit x86). A boost factor
> -of 0 will disable the feature.
> -
> -
>  watermark_scale_factor
>  ======================
>  
> diff --git a/Documentation/mm/physical_memory.rst b/Documentation/mm/physical_memory.rst
> index b76183545e5b..c4968db6e77c 100644
> --- a/Documentation/mm/physical_memory.rst
> +++ b/Documentation/mm/physical_memory.rst
> @@ -394,11 +394,6 @@ General
>    to the distance between two watermarks. The distance itself is calculated
>    taking ``vm.watermark_scale_factor`` sysctl into account.
>  
> -``watermark_boost``
> -  The number of pages which are used to boost watermarks to increase reclaim
> -  pressure to reduce the likelihood of future fallbacks and wake kswapd now
> -  as the node may be balanced overall and kswapd will not wake naturally.
> -
>  ``nr_reserved_highatomic``
>    The number of pages which are reserved for high-order atomic allocations.
>  
> @@ -527,11 +522,9 @@ General
>    Defined only when ``CONFIG_UNACCEPTED_MEMORY`` is enabled.
>  
>  ``flags``
> -  The zone flags. The least three bits are used and defined by
> -  ``enum zone_flags``. ``ZONE_BOOSTED_WATERMARK`` (bit 0): zone recently boosted
> -  watermarks. Cleared when kswapd is woken. ``ZONE_RECLAIM_ACTIVE`` (bit 1):
> -  kswapd may be scanning the zone. ``ZONE_BELOW_HIGH`` (bit 2): zone is below
> -  high watermark.
> +  The zone flags. The bits are defined by ``enum zone_flags``.
> +  ``ZONE_RECLAIM_ACTIVE`` (bit 0): kswapd may be scanning the zone.
> +  ``ZONE_BELOW_HIGH`` (bit 1): zone is below high watermark.
>  
>  ``lock``
>    The main lock that protects the internal data structures of the page allocator
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index 732e4dd181b9..13e29b2ebb86 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -978,7 +978,6 @@ struct zone {
>  
>  	/* zone watermarks, access with *_wmark_pages(zone) macros */
>  	unsigned long _watermark[NR_WMARK];
> -	unsigned long watermark_boost;
>  
>  	unsigned long nr_reserved_highatomic;
>  	unsigned long nr_free_highatomic;
> @@ -1167,9 +1166,6 @@ enum pgdat_flags {
>  };
>  
>  enum zone_flags {
> -	ZONE_BOOSTED_WATERMARK,		/* zone recently boosted watermarks.
> -					 * Cleared when kswapd is woken.
> -					 */
>  	ZONE_RECLAIM_ACTIVE,		/* kswapd may be scanning the zone. */
>  	ZONE_BELOW_HIGH,		/* zone is below high watermark. */
>  };
> @@ -1177,7 +1173,7 @@ enum zone_flags {
>  static inline unsigned long wmark_pages(const struct zone *z,
>  					enum zone_watermarks w)
>  {
> -	return z->_watermark[w] + z->watermark_boost;
> +	return z->_watermark[w];
>  }
>  
>  static inline unsigned long min_wmark_pages(const struct zone *z)
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 47d314e77151..6e01e58aca54 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -267,7 +267,6 @@ const char * const migratetype_names[MIGRATE_TYPES] = {
>  
>  int min_free_kbytes = 1024;
>  int user_min_free_kbytes = -1;
> -static int watermark_boost_factor __read_mostly = 15000;
>  static int watermark_scale_factor = 10;
>  int defrag_mode;
>  
> @@ -2340,43 +2339,6 @@ bool pageblock_unisolate_and_move_free_pages(struct zone *zone, struct page *pag
>  
>  #endif /* CONFIG_MEMORY_ISOLATION */
>  
> -static inline bool boost_watermark(struct zone *zone)
> -{
> -	unsigned long max_boost;
> -
> -	if (!watermark_boost_factor)
> -		return false;
> -	/*
> -	 * Don't bother in zones that are unlikely to produce results.
> -	 * On small machines, including kdump capture kernels running
> -	 * in a small area, boosting the watermark can cause an out of
> -	 * memory situation immediately.
> -	 */
> -	if ((pageblock_nr_pages * 4) > zone_managed_pages(zone))
> -		return false;
> -
> -	max_boost = mult_frac(zone->_watermark[WMARK_HIGH],
> -			watermark_boost_factor, 10000);
> -
> -	/*
> -	 * high watermark may be uninitialised if fragmentation occurs
> -	 * very early in boot so do not boost. We do not fall
> -	 * through and boost by pageblock_nr_pages as failing
> -	 * allocations that early means that reclaim is not going
> -	 * to help and it may even be impossible to reclaim the
> -	 * boosted watermark resulting in a hang.
> -	 */
> -	if (!max_boost)
> -		return false;
> -
> -	max_boost = max(pageblock_nr_pages, max_boost);
> -
> -	zone->watermark_boost = min(zone->watermark_boost + pageblock_nr_pages,
> -		max_boost);
> -
> -	return true;
> -}
> -
>  /*
>   * When we are falling back to another migratetype during allocation, should we
>   * try to claim an entire block to satisfy further allocations, instead of
> @@ -2477,14 +2439,6 @@ try_to_claim_block(struct zone *zone, struct page *page,
>  		return page;
>  	}
>  
> -	/*
> -	 * Boost watermarks to increase reclaim pressure to reduce the
> -	 * likelihood of future fallbacks. Wake kswapd now as the node
> -	 * may be balanced overall and kswapd will not wake naturally.
> -	 */
> -	if (boost_watermark(zone) && (alloc_flags & ALLOC_KSWAPD))
> -		set_bit(ZONE_BOOSTED_WATERMARK, &zone->flags);
> -
>  	/* moving whole block can fail due to zone boundary conditions */
>  	if (!prep_move_freepages_block(zone, page, &start_pfn, &free_pages,
>  				       &movable_pages))
> @@ -3839,13 +3793,6 @@ struct page *rmqueue(struct zone *preferred_zone,
>  							migratetype);
>  
>  out:
> -	/* Separate test+clear to avoid unnecessary atomics */
> -	if ((alloc_flags & ALLOC_KSWAPD) &&
> -	    unlikely(test_bit(ZONE_BOOSTED_WATERMARK, &zone->flags))) {
> -		clear_bit(ZONE_BOOSTED_WATERMARK, &zone->flags);
> -		wakeup_kswapd(zone, 0, 0, zone_idx(zone));
> -	}
> -
>  	VM_BUG_ON_PAGE(page && bad_range(zone, page), page);
>  	return page;
>  }
> @@ -4123,24 +4070,8 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order,
>  			return true;
>  	}
>  
> -	if (__zone_watermark_ok(z, order, mark, highest_zoneidx, alloc_flags,
> -					free_pages))
> -		return true;
> -
> -	/*
> -	 * Ignore watermark boosting for __GFP_HIGH order-0 allocations
> -	 * when checking the min watermark. The min watermark is the
> -	 * point where boosting is ignored so that kswapd is woken up
> -	 * when below the low watermark.
> -	 */
> -	if (unlikely(!order && (alloc_flags & ALLOC_MIN_RESERVE) && z->watermark_boost
> -		&& ((alloc_flags & ALLOC_WMARK_MASK) == WMARK_MIN))) {
> -		mark = z->_watermark[WMARK_MIN];
> -		return __zone_watermark_ok(z, order, mark, highest_zoneidx,
> -					alloc_flags, free_pages);
> -	}
> -
> -	return false;
> +	return __zone_watermark_ok(z, order, mark, highest_zoneidx, alloc_flags,
> +					free_pages);
>  }
>  
>  #ifdef CONFIG_NUMA
> @@ -6919,7 +6850,6 @@ static void __setup_per_zone_wmarks(void)
>  			    mult_frac(zone_managed_pages(zone),
>  				      watermark_scale_factor, 10000));
>  
> -		zone->watermark_boost = 0;
>  		zone->_watermark[WMARK_LOW]  = min_wmark_pages(zone) + tmp;
>  		zone->_watermark[WMARK_HIGH] = low_wmark_pages(zone) + tmp;
>  		zone->_watermark[WMARK_PROMO] = high_wmark_pages(zone) + tmp;
> @@ -7187,14 +7117,6 @@ static const struct ctl_table page_alloc_sysctl_table[] = {
>  		.proc_handler	= min_free_kbytes_sysctl_handler,
>  		.extra1		= SYSCTL_ZERO,
>  	},
> -	{
> -		.procname	= "watermark_boost_factor",
> -		.data		= &watermark_boost_factor,
> -		.maxlen		= sizeof(watermark_boost_factor),
> -		.mode		= 0644,
> -		.proc_handler	= proc_dointvec_minmax,
> -		.extra1		= SYSCTL_ZERO,
> -	},


This is a userspace-visible removal. Writes to
/proc/sys/vm/watermark_boost_factor will now return -ENOENT instead of being
accepted, breaking userspace.

I am not sure whats been done in the past, but we need to add a
Documentation/ABI/removed/ note explaining what replaces it (SPB steering).
and also maybe keep the sysctl entry as a no-op with warning for a few
cycles before deletion?


>  	{
>  		.procname	= "watermark_scale_factor",
>  		.data		= &watermark_scale_factor,
> diff --git a/mm/show_mem.c b/mm/show_mem.c
> index 43aca5a2ac99..d08f1263480a 100644
> --- a/mm/show_mem.c
> +++ b/mm/show_mem.c
> @@ -302,7 +302,6 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
>  		printk(KERN_CONT
>  			"%s"
>  			" free:%lukB"
> -			" boost:%lukB"

The boost: field in /proc/zoneinfo and the show_mem output also disappears.
Something similar might need to be done for this as well.

>  			" min:%lukB"
>  			" low:%lukB"
>  			" high:%lukB"
> @@ -325,7 +324,6 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
>  			"\n",
>  			zone->name,
>  			K(zone_page_state(zone, NR_FREE_PAGES)),
> -			K(zone->watermark_boost),
>  			K(min_wmark_pages(zone)),
>  			K(low_wmark_pages(zone)),
>  			K(high_wmark_pages(zone)),
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index bd1b1aa12581..461e70f9c9f0 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -6883,30 +6883,6 @@ static void kswapd_age_node(struct pglist_data *pgdat, struct scan_control *sc)
>  	} while (memcg);
>  }
>  
> -static bool pgdat_watermark_boosted(pg_data_t *pgdat, int highest_zoneidx)
> -{
> -	int i;
> -	struct zone *zone;
> -
> -	/*
> -	 * Check for watermark boosts top-down as the higher zones
> -	 * are more likely to be boosted. Both watermarks and boosts
> -	 * should not be checked at the same time as reclaim would
> -	 * start prematurely when there is no boosting and a lower
> -	 * zone is balanced.
> -	 */
> -	for (i = highest_zoneidx; i >= 0; i--) {
> -		zone = pgdat->node_zones + i;
> -		if (!managed_zone(zone))
> -			continue;
> -
> -		if (zone->watermark_boost)
> -			return true;
> -	}
> -
> -	return false;
> -}
> -
>  /*
>   * Returns true if there is an eligible zone balanced for the request order
>   * and highest_zoneidx
> @@ -7111,14 +7087,13 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
>  	unsigned long nr_soft_reclaimed;
>  	unsigned long nr_soft_scanned;
>  	unsigned long pflags;
> -	unsigned long nr_boost_reclaim;
> -	unsigned long zone_boosts[MAX_NR_ZONES] = { 0, };
> -	bool boosted;
>  	struct zone *zone;
>  	struct scan_control sc = {
>  		.gfp_mask = GFP_KERNEL,
>  		.order = order,
>  		.may_unmap = 1,
> +		.may_writepage = 1,
> +		.may_swap = 1,
>  	};
>  
>  	set_task_reclaim_state(current, &sc.reclaim_state);
> @@ -7127,18 +7102,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
>  
>  	count_vm_event(PAGEOUTRUN);
>  
> -	/*
> -	 * Account for the reclaim boost. Note that the zone boost is left in
> -	 * place so that parallel allocations that are near the watermark will
> -	 * stall or direct reclaim until kswapd is finished.
> -	 */
> -	nr_boost_reclaim = 0;
> -	for_each_managed_zone_pgdat(zone, pgdat, i, highest_zoneidx) {
> -		nr_boost_reclaim += zone->watermark_boost;
> -		zone_boosts[i] = zone->watermark_boost;
> -	}
> -	boosted = nr_boost_reclaim;
> -
>  restart:
>  	set_reclaim_active(pgdat, highest_zoneidx);
>  	sc.priority = DEF_PRIORITY;
> @@ -7173,39 +7136,14 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
>  		}
>  
>  		/*
> -		 * If the pgdat is imbalanced then ignore boosting and preserve
> -		 * the watermarks for a later time and restart. Note that the
> -		 * zone watermarks will be still reset at the end of balancing
> -		 * on the grounds that the normal reclaim should be enough to
> -		 * re-evaluate if boosting is required when kswapd next wakes.
> +		 * If there are no eligible zones, no work to do. Note that
> +		 * sc.reclaim_idx is not used as buffer_heads_over_limit may
> +		 * have adjusted it.
>  		 */
>  		balanced = pgdat_balanced(pgdat, sc.order, highest_zoneidx);
> -		if (!balanced && nr_boost_reclaim) {
> -			nr_boost_reclaim = 0;
> -			goto restart;
> -		}
> -
> -		/*
> -		 * If boosting is not active then only reclaim if there are no
> -		 * eligible zones. Note that sc.reclaim_idx is not used as
> -		 * buffer_heads_over_limit may have adjusted it.
> -		 */
> -		if (!nr_boost_reclaim && balanced)
> +		if (balanced)
>  			goto out;
>  
> -		/* Limit the priority of boosting to avoid reclaim writeback */
> -		if (nr_boost_reclaim && sc.priority == DEF_PRIORITY - 2)
> -			raise_priority = false;
> -
> -		/*
> -		 * Do not writeback or swap pages for boosted reclaim. The
> -		 * intent is to relieve pressure not issue sub-optimal IO
> -		 * from reclaim context. If no pages are reclaimed, the
> -		 * reclaim will be aborted.
> -		 */
> -		sc.may_writepage = !nr_boost_reclaim;
> -		sc.may_swap = !nr_boost_reclaim;
> -
>  		/*
>  		 * Do some background aging, to give pages a chance to be
>  		 * referenced before reclaiming. All pages are rotated
> @@ -7249,15 +7187,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
>  		 * progress in reclaiming pages
>  		 */
>  		nr_reclaimed = sc.nr_reclaimed - nr_reclaimed;
> -		nr_boost_reclaim -= min(nr_boost_reclaim, nr_reclaimed);
> -
> -		/*
> -		 * If reclaim made no progress for a boost, stop reclaim as
> -		 * IO cannot be queued and it could be an infinite loop in
> -		 * extreme circumstances.
> -		 */
> -		if (nr_boost_reclaim && !nr_reclaimed)
> -			break;
>  
>  		if (raise_priority || !nr_reclaimed)
>  			sc.priority--;
> @@ -7273,12 +7202,7 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
>  		goto restart;
>  	}
>  
> -	/*
> -	 * If the reclaim was boosted, we might still be far from the
> -	 * watermark_high at this point. We need to avoid increasing the
> -	 * failure count to prevent the kswapd thread from stopping.
> -	 */
> -	if (!sc.nr_reclaimed && !boosted) {
> +	if (!sc.nr_reclaimed) {
>  		int fail_cnt = atomic_inc_return(&pgdat->kswapd_failures);
>  		/* kswapd context, low overhead to trace every failure */
>  		trace_mm_vmscan_kswapd_reclaim_fail(pgdat->node_id, fail_cnt);
> @@ -7287,28 +7211,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
>  out:
>  	clear_reclaim_active(pgdat, highest_zoneidx);
>  
> -	/* If reclaim was boosted, account for the reclaim done in this pass */
> -	if (boosted) {
> -		unsigned long flags;
> -
> -		for (i = 0; i <= highest_zoneidx; i++) {
> -			if (!zone_boosts[i])
> -				continue;
> -
> -			/* Increments are under the zone lock */
> -			zone = pgdat->node_zones + i;
> -			spin_lock_irqsave(&zone->lock, flags);
> -			zone->watermark_boost -= min(zone->watermark_boost, zone_boosts[i]);
> -			spin_unlock_irqrestore(&zone->lock, flags);
> -		}
> -
> -		/*
> -		 * As there is now likely space, wakeup kcompact to defragment
> -		 * pageblocks.
> -		 */
> -		wakeup_kcompactd(pgdat, pageblock_order, highest_zoneidx);
> -	}
> -
>  	snapshot_refaults(NULL, pgdat);
>  	__fs_reclaim_release(_THIS_IP_);
>  	psi_memstall_leave(&pflags);
> @@ -7542,8 +7444,7 @@ void wakeup_kswapd(struct zone *zone, gfp_t gfp_flags, int order,
>  
>  	/* Hopeless node, leave it to direct reclaim if possible */
>  	if (kswapd_test_hopeless(pgdat) ||
> -	    (pgdat_balanced(pgdat, order, highest_zoneidx) &&
> -	     !pgdat_watermark_boosted(pgdat, highest_zoneidx))) {
> +	    pgdat_balanced(pgdat, order, highest_zoneidx)) {
>  		/*
>  		 * There may be plenty of free memory available, but it's too
>  		 * fragmented for high-order allocations.  Wake up kcompactd
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> index f534972f517d..7b48b84287a7 100644
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -1769,7 +1769,6 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
>  	}
>  	seq_printf(m,
>  		   "\n  pages free     %lu"
> -		   "\n        boost    %lu"
>  		   "\n        min      %lu"
>  		   "\n        low      %lu"
>  		   "\n        high     %lu"
> @@ -1779,7 +1778,6 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
>  		   "\n        managed  %lu"
>  		   "\n        cma      %lu",
>  		   zone_page_state(zone, NR_FREE_PAGES),
> -		   zone->watermark_boost,
>  		   min_wmark_pages(zone),
>  		   low_wmark_pages(zone),
>  		   high_wmark_pages(zone),
> -- 
> 2.54.0
> 
> 


  reply	other threads:[~2026-05-26 14:02 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-20 14:59 [RFC PATCH 00/40] mm: reliable 1GB page allocation Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 01/40] mm: page_alloc: replace pageblock_flags bitmap with struct pageblock_data Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 02/40] mm: page_alloc: per-cpu pageblock buddy allocator Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 03/40] mm: page_alloc: split-path PCP free with local-trylock + remote-llist Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 04/40] mm: mm_init: fix zone assignment for pages in unavailable ranges Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 05/40] mm: page_alloc: remove watermark boost mechanism Rik van Riel
2026-05-26 14:02   ` Usama Arif [this message]
2026-05-20 14:59 ` [RFC PATCH 06/40] mm: page_alloc: async evacuation of stolen movable pageblocks Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 07/40] mm: page_alloc: track actual page contents in pageblock flags Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 08/40] mm: page_alloc: superpageblock metadata for 1GB anti-fragmentation Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 09/40] mm: page_alloc: support superpageblock resize for memory hotplug Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 10/40] mm: page_alloc: add superpageblock fullness lists for allocation steering Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 11/40] mm: page_alloc: steer pageblock stealing to tainted superpageblocks Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 12/40] mm: page_alloc: steer movable allocations to fullest clean superpageblocks Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 13/40] mm: page_alloc: extract claim_whole_block from try_to_claim_block Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 14/40] mm: page_alloc: add per-superpageblock free lists Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 15/40] mm: page_alloc: add background superpageblock defragmentation worker Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 16/40] mm: compaction: walk per-superpageblock free lists for migration targets Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 17/40] mm: page_alloc: superpageblock-aware contiguous and higher order allocation Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 18/40] mm: page_alloc: prevent atomic allocations from tainting clean SPBs Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 19/40] mm: page_alloc: aggressively pack non-movable allocs in tainted SPBs on large systems Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 20/40] mm: page_alloc: prefer reclaim over tainting clean superpageblocks Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 21/40] mm: page_alloc: adopt partial pageblocks from tainted superpageblocks Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 22/40] mm: page_alloc: add CONFIG_DEBUG_VM sanity checks for SPB counters Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 23/40] mm: page_alloc: targeted evacuation and dynamic reserves for tainted SPBs Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 24/40] mm: page_alloc: prevent UNMOVABLE/RECLAIMABLE mixing in pageblocks Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 25/40] mm: trigger deferred SPB evac when atomic allocs would taint a clean SPB Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 26/40] mm: page_alloc: refuse fragmenting fallback for callers with cheap fallback Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 27/40] mm: page_alloc: cross-migratetype buddy borrow within tainted SPBs Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 28/40] mm: page_alloc: drive slab shrink from SPB anti-fragmentation pressure Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 29/40] mm: page_reporting: walk per-superpageblock free lists Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 30/40] mm: show_mem: collect migratetype letters from per-superpageblock lists Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 31/40] mm: page_alloc: per-(zone, order, mt) PASS_1 hint cache Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 32/40] mm: debug: prevent infinite recursion in dump_page() with CMA Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 33/40] PM: hibernate: walk per-superpageblock free lists in mark_free_pages Rik van Riel
2026-05-20 18:19   ` Rafael J. Wysocki
2026-05-20 14:59 ` [RFC PATCH 34/40] btrfs: allocate eb-attached btree pages as movable Rik van Riel
2026-05-20 17:47   ` Boris Burkov
2026-05-23 15:58     ` David Sterba
2026-05-24  1:43       ` Rik van Riel
2026-05-24 19:59         ` Matthew Wilcox
2026-05-25  6:57           ` Christoph Hellwig
2026-05-20 14:59 ` [RFC PATCH 35/40] mm: page_alloc: refuse best-effort high-order allocs servable at lower orders Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 36/40] mm: page_alloc: set ALLOC_NOFRAGMENT on alloc_frozen_pages_nolock_noprof Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 37/40] mm: page_alloc: move spb_get_category and spb_tainted_reserve to mmzone.h Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 38/40] mm: compaction: skip empty tainted superpageblocks as migration source Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 39/40] mm: compaction: respect tainted SPB reserve in destination selection Rik van Riel
2026-05-20 14:59 ` [RFC PATCH 40/40] mm: page_alloc: SPB tracepoint instrumentation [DO-NOT-MERGE] Rik van Riel
2026-05-21  7:39 ` [syzbot ci] Re: mm: reliable 1GB page allocation syzbot ci
2026-05-22 11:02 ` [RFC PATCH 00/40] " Usama Arif
2026-05-22 13:55   ` Rik van Riel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260526140204.1390573-1-usama.arif@linux.dev \
    --to=usama.arif@linux.dev \
    --cc=david@kernel.org \
    --cc=fvdl@google.com \
    --cc=hannes@cmpxchg.org \
    --cc=kernel-team@meta.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=riel@surriel.com \
    --cc=surenb@google.com \
    --cc=willy@infradead.org \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox