From patchwork Tue Feb 25 15:29:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brendan Jackman X-Patchwork-Id: 13990122 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A84C9C021BC for ; Tue, 25 Feb 2025 15:30:01 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 39456280005; Tue, 25 Feb 2025 10:30:01 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 2A537280003; Tue, 25 Feb 2025 10:30:01 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0F85D280005; Tue, 25 Feb 2025 10:30:01 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id E0309280003 for ; Tue, 25 Feb 2025 10:30:00 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 91DBE1CB41C for ; Tue, 25 Feb 2025 15:30:00 +0000 (UTC) X-FDA: 83158852560.14.97B5088 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) by imf03.hostedemail.com (Postfix) with ESMTP id C149F2000A for ; Tue, 25 Feb 2025 15:29:58 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xMVaNRIx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf03.hostedemail.com: domain of 39eG9ZwgKCPQfWYgiWjXckkcha.Ykihejqt-iigrWYg.knc@flex--jackmanb.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=39eG9ZwgKCPQfWYgiWjXckkcha.Ykihejqt-iigrWYg.knc@flex--jackmanb.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740497398; a=rsa-sha256; cv=none; b=uvUcXziOdoKyN8nfplh+TtAe7qDhGt+dL4ZfWIVYd7F0yQLa0T3+ai0kJCGKCJOXSAaJ0M 4sddqQCHCeX67348rim8ZC6ijnkwwqf+Jsy5aT3TcF43h2NwEJ138urnZJUfa6oIEUr6J6 eLBD/82rexVZ2EYcOtexEE3YlZ1xiWI= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xMVaNRIx; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf03.hostedemail.com: domain of 39eG9ZwgKCPQfWYgiWjXckkcha.Ykihejqt-iigrWYg.knc@flex--jackmanb.bounces.google.com designates 209.85.128.74 as permitted sender) smtp.mailfrom=39eG9ZwgKCPQfWYgiWjXckkcha.Ykihejqt-iigrWYg.knc@flex--jackmanb.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740497398; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=nx6t1c8/cloSJvCisk/ifycZ3o4OR3QkzD+SEADwtx8=; b=TV1yLcmFGJH/4Sy8UbpzGK7i4hWMfSRenxTC71ihUu6HOMos4N2EOBXdLOOnJKgarmjBw6 pDWQQlu/KzoJv3WBbI2kFl47UBu9w2F8h58eYeqIa1S2Dp3o+tEz1I8t237D/npsMycH3G LmA+w1yrKd1joen9bG/f3PnsEL462Bc= Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-4394c0a58e7so46099565e9.0 for ; Tue, 25 Feb 2025 07:29:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1740497397; x=1741102197; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=nx6t1c8/cloSJvCisk/ifycZ3o4OR3QkzD+SEADwtx8=; b=xMVaNRIxrQMy0YAYB9ZsynqXUVFvPtaIolbX+F5zNqIjzJz6+7anJsAc1nyKxBS5Yz 20a6TwgtBlrN00fS6mJ0fLHOat0RTrrWtqU2dElWbcuO0flRoaie7m3nzveCgFklvOOe VrBNHWbMiirbsdTYqBZwfKUE3OUoe1jkL0ONlXZVck/9vkckQ2qAOhGx/3M8jnSZlJwS cOOEYRdYwYrU8ruPwol7/QIuxIJx4F5Wf2Lx5w8njwqohfpHCYaJSZZpGYNQ9Y2Yz8bf seseIVK6CHAdXvM/Es+B6m5tXm62YepIU/5NIA9kXmjpGYvJSLzltDMH7yQMvDLf6ead Y2XQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740497397; x=1741102197; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=nx6t1c8/cloSJvCisk/ifycZ3o4OR3QkzD+SEADwtx8=; b=aX1I8NEPbLoulg6yolxBx+tNnZXuOt/sJXYxn3hoL59Caq123T5wQHqldyhp6ovq10 y5FO9llHvnvGHYyNkMBY3jILUyVHbj+YcvGTmwcxldeEVxprDI6AxX60yeJ8eheetfVh /se7oMe3q9RWZ+K7x3rr40o+IM8ERaQ87M2bwHSGM4M4v9kyWv+ucWW1pJGwm3j8NLaU HBQDnuRzzq1dgs5ikKalvS2XEgVGBEq1+E6I7kH3uyVT3iLQZTS/y+2DSXz2kHGUVzsX 4NaLMbcjOuwk8mN9CveXAMv1cy8+d+N58ug36O1LZp39brLR7gOfW8hg9iYpLJRygbp7 TsFA== X-Forwarded-Encrypted: i=1; AJvYcCUqFU3zzvuiNrgITT1H56Vgq1We2mSW+eQz1sY7k/n4DePFPz0aVxnBM4oBIO717c3JwdF2z+IXVg==@kvack.org X-Gm-Message-State: AOJu0YzcFHBb6RHMjlSgOXwB/EP3SXTVYYFEqbvLmjetmDanaTaT7KJR VT4FGnKd8y/1uYioMPkucmPY7kcQtPfYy454DmtV8diWId0toN4Du07WkNcoXb7E1gcHEIKuvJV Sbr3tYrU9dQ== X-Google-Smtp-Source: AGHT+IGn32bsk1prP4wPiO8UR6qaQxLW4dASvWo6m65ubj1QAEwH4BO/I8DvVEW43uBjNISApDxTFJ0VJ+OChw== X-Received: from wmsd4.prod.google.com ([2002:a05:600c:3ac4:b0:439:5fab:db0f]) (user=jackmanb job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:1e18:b0:439:a1f2:50a3 with SMTP id 5b1f17b1804b1-439af0d503dmr150580675e9.4.1740497397567; Tue, 25 Feb 2025 07:29:57 -0800 (PST) Date: Tue, 25 Feb 2025 15:29:48 +0000 In-Reply-To: <20250225-clarify-steal-v3-0-f2550ead0139@google.com> Mime-Version: 1.0 References: <20250225-clarify-steal-v3-0-f2550ead0139@google.com> X-Mailer: b4 0.15-dev Message-ID: <20250225-clarify-steal-v3-1-f2550ead0139@google.com> Subject: [PATCH v3 1/2] mm/page_alloc: Clarify terminology in migratetype fallback code From: Brendan Jackman To: Andrew Morton Cc: Vlastimil Babka , Mel Gorman , Michal Hocko , Johannes Weiner , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Brendan Jackman , Yosry Ahmed X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: C149F2000A X-Stat-Signature: 4h7to78ixnrn81kpk8z5opgjfbdg7dgi X-Rspam-User: X-HE-Tag: 1740497398-170363 X-HE-Meta: U2FsdGVkX19yDDAB6WwAtPP1dvgxK08soygVdJeRPtPC9OLgE2h55F7UuZ4Qj7RuNLlbQlDYHiggOK4C9VhRVWCqZ5ZGTu5v6HgjY2/onb2qQLMERzTlJ1v0uErhnTbrOTnRpGMvnUuseEnNnV16CxmqaROggxXTJRV4WhLJyd/yIXA25/P7baIS8u6DNv1j3v1BVugDdp29rxstBPDPJ/KBkc7ZWdiZG2WU3s05/hw/4RE6VhQapZNkcPJhIjROLvD6Za5mRjoRKp976Z1RV0JEgLJNcs0aa4jomlCtUs3n1aV7DJAVLNvF8pkIbPQx9JNEFBw38JDjINweNT/OMI8NSoYlaZdlPGXWstmw06inW9t9s7fXf7pnwADw9Sl5tjSYddNiGXyq4fact5+NNhSA0ESMFJ73Y6exhJX5dFKu4EOxhJZjqfDN2gv2PPGqgGPq9hhi8cQkvnB1xGSOJl+nyjaWp9tBqQhegDS7+YtJkSuFmax8hly2xKi0VNjY/r3MFQ2Gbf0Y6vT7tlO0DSn+QhnQOsNL3MDioxX707/L2l3wmCsLNCMveoF85FiRyxKFF7dXG2MiUp8Xih49V9uCRqEFouqJtvTuaj3y/YqkkeSDqdAO34S7DRNQ8ZmbHbLPgKwc94yfhsd38484dXZ+uZrBa2Igtck/pSyzb7e5JDaRHKvk505DZjwiWs8URV324Ett3ro3/GSlc+4YWJ+tpHz/oAacLgtI9etR7pLCFXQOpgKpVN9u1CIE2jReamFaYEdBMAhxZGWi85FIjySiVXWPYfPi+pRv40lum/IoPedjn6+bSS9RsLQfy/579tJ7J9F7dama6SpycW4zJGANJfaro1e3bGwc/+WdNfqdiHZa3Zm+1OxumQ9coU44EduYtjSotE+lxZYKHxnkey5PG/mIyy2kSc+IBqN6ijxJxSUv0tQOMQ6ejvU1sK4Gsa3FGrUoENkRPqRGsDC /fmKoufP PYAm6nIN+HihjbHw7aJzS8Yt9RQ2JT1Vem4afXPdYTJADwCYS1k2D0/J2FCYepBeBHnIGOfKbHVONHMXQYar96cScq9JGdSlKmeX1HxPHoVyhC1H0avXPC+HW33gFUJ0hAtMzOFbmta3nh9cHFKBsE8ro5dK/igBD+t7FV8HVSnidmWNblgMNQiXYiTJ5ddWmZmJl39h3RuGl5//CrSa9ldGwja70eQFnAbAljwtCWr7w3haAiprkZMPz8uv8Ss3jSDh7rlB5J6GlqWQYwPytQWsS77J6O8WHZl9F5xdgiKC2FPPWlcM5S03eWjdmircv5OzdjLFzTufVBcVYO23eUuwcO2dLwya3aO/bbcpqAajbEHAv0oBNwXduHuHismEH84FZbfQaK2KN1DFmeNcbJWNptHStRFnVS6mTAwtGblouFCv2lFh8MPS5m8ktwKWFWlVqAiMqYIXYyl9/hwK3e8YxpZhBc4xZJhrfZ2bvpExIYDfBJxIYrkSbkfpcyDlBxEfOC1OewGrgHZCUlzrS+KtZ0rC4OsBM+uhJl91+Ig0MNvIro/NGdiXODT920wZ7vnXwT1vIu0GTJZtRFfaAmIrNv2jkgwCFlntq X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: This code is rather confusing because: 1. "Steal" is sometimes used to refer to the general concept of allocating from a from a block of a fallback migratetype (steal_suitable_fallback()) but sometimes it refers specifically to converting a whole block's migratetype (can_steal_fallback()). 2. can_steal_fallback() sounds as though it's answering the question "am I functionally permitted to allocate from that other type" but in fact it is encoding a heuristic preference. 3. The same piece of data has different names in different places: can_steal vs whole_block. This reinforces point 2 because it looks like the different names reflect a shift in intent from "am I allowed to steal" to "do I want to steal", but no such shift exists. Fix 1. by avoiding the term "steal" in ambiguous contexts. Start using the term "claim" to refer to the special case of stealing the entire block. Fix 2. by using "should" instead of "can", and also rename its parameters and add some commentary to make it more explicit what they mean. Fix 3. by adopting the new "claim" terminology universally for this set of variables. Signed-off-by: Brendan Jackman Reviewed-by: Vlastimil Babka --- mm/compaction.c | 4 ++-- mm/internal.h | 2 +- mm/page_alloc.c | 72 ++++++++++++++++++++++++++++----------------------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/mm/compaction.c b/mm/compaction.c index 0992106d4ea751f7f1f8ebf7c75cd433d676cbe0..550ce50218075509ccb5f9485fd84f5d1f3d23a7 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -2333,7 +2333,7 @@ static enum compact_result __compact_finished(struct compact_control *cc) ret = COMPACT_NO_SUITABLE_PAGE; for (order = cc->order; order < NR_PAGE_ORDERS; order++) { struct free_area *area = &cc->zone->free_area[order]; - bool can_steal; + bool claim_block; /* Job done if page is free of the right migratetype */ if (!free_area_empty(area, migratetype)) @@ -2350,7 +2350,7 @@ static enum compact_result __compact_finished(struct compact_control *cc) * other migratetype buddy lists. */ if (find_suitable_fallback(area, order, migratetype, - true, &can_steal) != -1) + true, &claim_block) != -1) /* * Movable pages are OK in any pageblock. If we are * stealing for a non-movable allocation, make sure diff --git a/mm/internal.h b/mm/internal.h index b07550db2bfd1d152fa90f91b3687b0fa1a9f653..aa30282a774ae26349944a75da854ae6a3da2a98 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -863,7 +863,7 @@ static inline void init_cma_pageblock(struct page *page) int find_suitable_fallback(struct free_area *area, unsigned int order, - int migratetype, bool only_stealable, bool *can_steal); + int migratetype, bool claim_only, bool *claim_block); static inline bool free_area_empty(struct free_area *area, int migratetype) { diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5d8e274c8b1d500d263a17ef36fe190f60b88196..5e694046ef92965b34d4831e96d92f02681a8b45 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1942,22 +1942,22 @@ static inline bool boost_watermark(struct zone *zone) /* * When we are falling back to another migratetype during allocation, try to - * steal extra free pages from the same pageblocks to satisfy further - * allocations, instead of polluting multiple pageblocks. + * claim entire blocks to satisfy further allocations, instead of polluting + * multiple pageblocks. * - * If we are stealing a relatively large buddy page, it is likely there will - * be more free pages in the pageblock, so try to steal them all. For - * reclaimable and unmovable allocations, we steal regardless of page size, - * as fragmentation caused by those allocations polluting movable pageblocks - * is worse than movable allocations stealing from unmovable and reclaimable - * pageblocks. + * If we are stealing a relatively large buddy page, it is likely there will be + * more free pages in the pageblock, so try to claim the whole block. For + * reclaimable and unmovable allocations, we claim the whole block regardless of + * page size, as fragmentation caused by those allocations polluting movable + * pageblocks is worse than movable allocations stealing from unmovable and + * reclaimable pageblocks. */ -static bool can_steal_fallback(unsigned int order, int start_mt) +static bool should_claim_block(unsigned int order, int start_mt) { /* * Leaving this order check is intended, although there is * relaxed order check in next check. The reason is that - * we can actually steal whole pageblock if this condition met, + * we can actually claim the whole pageblock if this condition met, * but, below check doesn't guarantee it and that is just heuristic * so could be changed anytime. */ @@ -1970,7 +1970,7 @@ static bool can_steal_fallback(unsigned int order, int start_mt) * reclaimable pages that are closest to the request size. After a * while, memory compaction may occur to form large contiguous pages, * and the next movable allocation may not need to steal. Unmovable and - * reclaimable allocations need to actually steal pages. + * reclaimable allocations need to actually claim the whole block. */ if (order >= pageblock_order / 2 || start_mt == MIGRATE_RECLAIMABLE || @@ -1983,12 +1983,14 @@ static bool can_steal_fallback(unsigned int order, int start_mt) /* * Check whether there is a suitable fallback freepage with requested order. - * If only_stealable is true, this function returns fallback_mt only if - * we can steal other freepages all together. This would help to reduce + * Sets *claim_block to instruct the caller whether it should convert a whole + * pageblock to the returned migratetype. + * If only_claim is true, this function returns fallback_mt only if + * we would do this whole-block claiming. This would help to reduce * fragmentation due to mixed migratetype pages in one pageblock. */ int find_suitable_fallback(struct free_area *area, unsigned int order, - int migratetype, bool only_stealable, bool *can_steal) + int migratetype, bool only_claim, bool *claim_block) { int i; int fallback_mt; @@ -1996,19 +1998,16 @@ int find_suitable_fallback(struct free_area *area, unsigned int order, if (area->nr_free == 0) return -1; - *can_steal = false; + *claim_block = false; for (i = 0; i < MIGRATE_PCPTYPES - 1 ; i++) { fallback_mt = fallbacks[migratetype][i]; if (free_area_empty(area, fallback_mt)) continue; - if (can_steal_fallback(order, migratetype)) - *can_steal = true; + if (should_claim_block(order, migratetype)) + *claim_block = true; - if (!only_stealable) - return fallback_mt; - - if (*can_steal) + if (*claim_block || !only_claim) return fallback_mt; } @@ -2016,14 +2015,14 @@ int find_suitable_fallback(struct free_area *area, unsigned int order, } /* - * This function implements actual steal behaviour. If order is large enough, we - * can claim the whole pageblock for the requested migratetype. If not, we check - * the pageblock for constituent pages; if at least half of the pages are free - * or compatible, we can still claim the whole block, so pages freed in the - * future will be put on the correct free list. + * This function implements actual block claiming behaviour. If order is large + * enough, we can claim the whole pageblock for the requested migratetype. If + * not, we check the pageblock for constituent pages; if at least half of the + * pages are free or compatible, we can still claim the whole block, so pages + * freed in the future will be put on the correct free list. */ static struct page * -try_to_steal_block(struct zone *zone, struct page *page, +try_to_claim_block(struct zone *zone, struct page *page, int current_order, int order, int start_type, int block_type, unsigned int alloc_flags) { @@ -2091,11 +2090,12 @@ try_to_steal_block(struct zone *zone, struct page *page, /* * Try finding a free buddy page on the fallback list. * - * This will attempt to steal a whole pageblock for the requested type + * This will attempt to claim a whole pageblock for the requested type * to ensure grouping of such requests in the future. * - * If a whole block cannot be stolen, regress to __rmqueue_smallest() - * logic to at least break up as little contiguity as possible. + * If a whole block cannot be claimed, steal an individual page, regressing to + * __rmqueue_smallest() logic to at least break up as little contiguity as + * possible. * * The use of signed ints for order and current_order is a deliberate * deviation from the rest of this file, to make the for loop @@ -2112,7 +2112,7 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype, int min_order = order; struct page *page; int fallback_mt; - bool can_steal; + bool claim_block; /* * Do not steal pages from freelists belonging to other pageblocks @@ -2131,15 +2131,15 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype, --current_order) { area = &(zone->free_area[current_order]); fallback_mt = find_suitable_fallback(area, current_order, - start_migratetype, false, &can_steal); + start_migratetype, false, &claim_block); if (fallback_mt == -1) continue; - if (!can_steal) + if (!claim_block) break; page = get_page_from_free_area(area, fallback_mt); - page = try_to_steal_block(zone, page, current_order, order, + page = try_to_claim_block(zone, page, current_order, order, start_migratetype, fallback_mt, alloc_flags); if (page) @@ -2149,11 +2149,11 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype, if (alloc_flags & ALLOC_NOFRAGMENT) return NULL; - /* No luck stealing blocks. Find the smallest fallback page */ + /* No luck claiming pageblock. Find the smallest fallback page */ for (current_order = order; current_order < NR_PAGE_ORDERS; current_order++) { area = &(zone->free_area[current_order]); fallback_mt = find_suitable_fallback(area, current_order, - start_migratetype, false, &can_steal); + start_migratetype, false, &claim_block); if (fallback_mt == -1) continue;