Skip to content

Commit

Permalink
mm/page_alloc: fix memory accept before watermarks gets initialized
Browse files Browse the repository at this point in the history
Watermarks are initialized during the postcore initcall.  Until then, all
watermarks are set to zero.  This causes cond_accept_memory() to
incorrectly skip memory acceptance because a watermark of 0 is always met.

This can lead to a premature OOM on boot.

To ensure progress, accept one MAX_ORDER page if the watermark is zero.

Link: https://lkml.kernel.org/r/20250310082855.2587122-1-kirill.shutemov@linux.intel.com
Fixes: dcdfdd4 ("mm: Add support for unaccepted memory")
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Tested-by: Farrah Chen <farrah.chen@intel.com>
Reported-by: Farrah Chen <farrah.chen@intel.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com>
Cc: Ashish Kalra <ashish.kalra@amd.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: "Mike Rapoport (IBM)" <rppt@kernel.org>
Cc: Thomas Lendacky <thomas.lendacky@amd.com>
Cc: <stable@vger.kernel.org>	[6.5+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
  • Loading branch information
Kirill A. Shutemov authored and Andrew Morton committed Mar 17, 2025
1 parent b9c0e49 commit 800f105
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -7004,7 +7004,7 @@ static inline bool has_unaccepted_memory(void)

static bool cond_accept_memory(struct zone *zone, unsigned int order)
{
long to_accept;
long to_accept, wmark;
bool ret = false;

if (!has_unaccepted_memory())
Expand All @@ -7013,8 +7013,18 @@ static bool cond_accept_memory(struct zone *zone, unsigned int order)
if (list_empty(&zone->unaccepted_pages))
return false;

wmark = promo_wmark_pages(zone);

/*
* Watermarks have not been initialized yet.
*
* Accepting one MAX_ORDER page to ensure progress.
*/
if (!wmark)
return try_to_accept_memory_one(zone);

/* How much to accept to get to promo watermark? */
to_accept = promo_wmark_pages(zone) -
to_accept = wmark -
(zone_page_state(zone, NR_FREE_PAGES) -
__zone_watermark_unusable_free(zone, order, 0) -
zone_page_state(zone, NR_UNACCEPTED));
Expand Down

0 comments on commit 800f105

Please sign in to comment.