From patchwork Mon Jan 27 23:22:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frank van der Linden X-Patchwork-Id: 13951861 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 2FA8EC02188 for ; Mon, 27 Jan 2025 23:23:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2DFD52801DA; Mon, 27 Jan 2025 18:23:06 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 266CC28013A; Mon, 27 Jan 2025 18:23:06 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0B90D2801D9; Mon, 27 Jan 2025 18:23:06 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 4B2292801CE for ; Mon, 27 Jan 2025 18:23:05 -0500 (EST) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 0A1C5471D8 for ; Mon, 27 Jan 2025 23:23:05 +0000 (UTC) X-FDA: 83054809530.12.2BC613C Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf25.hostedemail.com (Postfix) with ESMTP id 2A38BA0015 for ; Mon, 27 Jan 2025 23:23:03 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=wvswButg; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf25.hostedemail.com: domain of 3VhWYZwQKCCUGWEMHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--fvdl.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3VhWYZwQKCCUGWEMHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--fvdl.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738020183; a=rsa-sha256; cv=none; b=p6lx6uN8p3nnrRI0o7D2SOCsuxXff7ybz5sTtG8DvthU97en0C0bUA9e6bit3kvwg8dbdw 8jVUV2EYC+bfQwwlJncOsqMJQV2U8R1mji+N4N5teEHshqzbTDuDyVGLW0e1jXoINFI8zc vxSWZWonK+ZasCjbfyan4D5CUTNbO6I= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=wvswButg; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf25.hostedemail.com: domain of 3VhWYZwQKCCUGWEMHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--fvdl.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3VhWYZwQKCCUGWEMHPPHMF.DPNMJOVY-NNLWBDL.PSH@flex--fvdl.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738020183; 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=Xh3mdP2mhnHLzQNGEPkDLWzaQSos/caZ2VOKVnErQBw=; b=Xpe7vJdKEJCBBRKuTUcpcSU7mIJhos9CjbI2NU2dTJU8Oeknjk345gXv4c7PyA/vW5CGpr QT91xpZokssKqcz6IAP34QbNNUQnBogPUMLEtfi7RbrCmdcXUFG6VSOBC1BsQyVvgSHv2H xcsZ7x9PhTRM34YsQO1RwEnlEtJ9Tkc= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-216728b170cso96109165ad.2 for ; Mon, 27 Jan 2025 15:23:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738020182; x=1738624982; 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=Xh3mdP2mhnHLzQNGEPkDLWzaQSos/caZ2VOKVnErQBw=; b=wvswButgbvCyLmoTlTcDFl6zRsnMm9g4M/eXq1lYpB3Df+0Al6sNJ8xvTQLCNZo+i1 F5cJDH+JR8AobwDOzNsCjtwX/Qm9vjvCO8tY3s/UTzUgOcavPPFmngPGE8DUFSyDoIna 2z6i7NOp424noHVxUy8ASDALcX97ytbYkswTaqEqrSGIDqOcFrxJXhlJEfzxnp/BaBmr ueAQqKqCyMGYant9jD1j+Ys2FU+hEkzGP9iSh/ep+PZl0DZjCliE+eF/2M0/tqq3aOeC ZE+cfqenV490xO2qe9b4920J4v8EFa+kpFBylb50v/ZJmhxrrHjLRItT2Vy6zoE88zyY KPKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738020182; x=1738624982; 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=Xh3mdP2mhnHLzQNGEPkDLWzaQSos/caZ2VOKVnErQBw=; b=wjTaQ1jEtPm3yCFqH6115fL3n2AQhVd148Tf502Y8rV7LgP4aq6RYOLxWsS75M3jBa AAjIPaunxtQ5Al0PVJYFqouTjOZ1jeAAFFRX9+KvjWjIXOh3qG8lAfnlyTo7zzel94vl gUtnU/nuNmYdpJbHF+AFPkaO2OdxqrXuCm4ydaazvqhGmL20t0pKJK8exaexGDSKMB2K UfVLHQRyx7fzHtsHvVyUffaV90WGlQQTBOefxmVUm14BKHrXVXZ1zNs6fMGra4eqoAqx q14x4ynnGsPzLuR3eMYRLxHiP4sZUTKluoqEtbK0fNydTerVXbj1qOOL8SDO0/lt0NSz V5uQ== X-Forwarded-Encrypted: i=1; AJvYcCUyjjVmq37mdBmVCTjsYpZW3Ji2aHAk+2haPw1hk8bITwxtHyvXnKKHcMjTi38CYGCI7lb2rvmG2w==@kvack.org X-Gm-Message-State: AOJu0YwRL2dQ7wzOnVMTsoiRXwy9LRAcZZx6sAPxY5VrSMZMjEYcZM2H StSYvu/JmPn4LX2By2C9USDyNa1PmqP8J+rA0Eh4Z/PXtzZRR1GlGmx+YSe/E9JKNsJSsg== X-Google-Smtp-Source: AGHT+IEwrpwkWupZm7Uo0XNFuCQxEURyVNgEoud/S8ArxMomvVoWaaaCSrh4po+SsvL0uPbIwiOPUUys X-Received: from pfbcl4.prod.google.com ([2002:a05:6a00:32c4:b0:725:c7de:e052]) (user=fvdl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:3951:b0:1e3:e6f3:6372 with SMTP id adf61e73a8af0-1eb2159533emr56631102637.27.1738020182020; Mon, 27 Jan 2025 15:23:02 -0800 (PST) Date: Mon, 27 Jan 2025 23:22:04 +0000 In-Reply-To: <20250127232207.3888640-1-fvdl@google.com> Mime-Version: 1.0 References: <20250127232207.3888640-1-fvdl@google.com> X-Mailer: git-send-email 2.48.1.262.g85cc9f2d1e-goog Message-ID: <20250127232207.3888640-25-fvdl@google.com> Subject: [PATCH 24/27] mm/cma: introduce a cma validate function From: Frank van der Linden To: akpm@linux-foundation.org, muchun.song@linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: yuzhao@google.com, usama.arif@bytedance.com, joao.m.martins@oracle.com, roman.gushchin@linux.dev, Frank van der Linden X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 2A38BA0015 X-Stat-Signature: mydk15x8w6gzzyk13ytzy1hhq6rr63dz X-Rspam-User: X-HE-Tag: 1738020182-386385 X-HE-Meta: U2FsdGVkX18ZREfMmnerG4TheAk03JNhUCVUpdDW/8rDkzjoEabbHKmyUKMgyV8zYJZiPyoWkkNF+ZwkZFC+hx++MEYIx1hAoouyVFU0z1AcKdjXeeZJToPFDFKCYhNV4fcRKmfw6S/DM6R5VklyOtrTWzzlVsPm4wsayhGzVZ35RpGsQ6MPAHUKenKXdWc7sxxc6iX6/fyctwo2e2Kgnpw+GwkmvtCANgBoALpLN+McvHLegoNv+ENM2TTiQotpXb0uyfmCyTV4iWKOOuEjCJDaRnM19owHnM0DBIQ1e5xRxM+xWplEwb2GcVc8KZ1bHXkQvdOOqNrCYD/MOSRP/8k8m4cDC+GlKWX8pWHfoL4QZyYpWNfJkxEo8ThTBz6KXkb/FMRONNSz2gj09S5Dd/Wp4yliDboSY8pfWqJBWl0zBMfT1Q06/SFruGXaAkD7+z0zo3CDduCOxr+o26i3b50P3ur5UYRaJAwkKWZp0nwULBv75m3572GLtcAv8hwkWIFnXTomsWC1iAEbODySYvtjHHBdWqtJZQkAyXilez4CKSkEHizbAQigoH4eJ5e15p8UxGOvTskkluYuIZka/scIymr/+15B120MAZ2XTIn1EbanMF6B/fmjs4MGWWQ4h1I81sb1g76941gpDdT0fq9spn1Q5v6wd/o1wHW2q4Y4gSA76WNvXrZwBF4/RRLkvO0244Y+LOKWhNaWchhnbCzzEMUGL06B0dzxEQdtnHtte+QBlhs2BO/7b9WN8c28NYs34bzhDjlg4MIYzb5Ch2b00HrZna2PAi5RKSKIkYqInnC0ydfHk5P8ihy8Y1e1nZOGy/9wNSUJOJomBsux8j1hX5Qhj5E1Ci2kVx9MGhufV0mlzKdeIwveiqHwmEkkNv1vcQQjSNh0VsRmtWCkbEPuWpoTCFpCYtMsiMTOQCGaN+NALBDtQBmE9o02FVAI9kFgg0Sbn0OUoHuo9yX ui/+u+F7 kN9jXpISLSr0hwSETYqy6MRuznyDnnMs1LPfW/LW+xuoveI+k1x67K9ZoAwHNn5eZ6A4Qij/ru6f5d55XlhKAvU1qgvi9/meB3sQniEufqUXsum7MZ7AcRRhwR6NCKrkiLlaag5V4Zud0p+engs593Bz2UO9RlJfSqPYlXRxsqj3l0MAnVU77hrmk6Bb+CXt9uwiJqMwNN2YmzoVnkH60Jyl3ZEACKgwBucA9O1flmnegJyUACLc/IWaoIoYsbYRXo1OxGG7VkXl9Ty4XoVXEYs7e11OyX2nEsItYuv9ipymXTPADXhwFbELwCls9Wt5dY+Rtk81kr+ITQ47x4wANYl7WJv85aroaBv718JpT3VrNcaqjbv9LNn6OSD4Thxcr1Ga+mMd/GwzPXEOzytqPTQ4nc+V8ovZiFKiP+LooeY8ECeICHFg54MxwtD45ouaITZlhngByrvEBoO0WymTiLnqBy+Un1SP4/UwRvUwF3e0c0j8rkqUORWJmQYgZL74G8NiAeFWNgOMKqJeL0xdBcxaRwQ== 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: Define a function to check if a CMA area is valid, which means: do its ranges not cross any zone boundaries. Store the result in the newly created flags for each CMA area, so that multiple calls are dealt with. This allows for checking the validity of a CMA area early, which is needed later in order to be able to allocate hugetlb bootmem pages from it with pre-HVO. Signed-off-by: Frank van der Linden --- include/linux/cma.h | 5 ++++ mm/cma.c | 60 ++++++++++++++++++++++++++++++++++++--------- mm/cma.h | 8 +++++- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/include/linux/cma.h b/include/linux/cma.h index 03d85c100dcc..62d9c1cf6326 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -60,6 +60,7 @@ extern void cma_reserve_pages_on_error(struct cma *cma); #ifdef CONFIG_CMA struct folio *cma_alloc_folio(struct cma *cma, int order, gfp_t gfp); bool cma_free_folio(struct cma *cma, const struct folio *folio); +bool cma_validate_zones(struct cma *cma); #else static inline struct folio *cma_alloc_folio(struct cma *cma, int order, gfp_t gfp) { @@ -70,6 +71,10 @@ static inline bool cma_free_folio(struct cma *cma, const struct folio *folio) { return false; } +static inline bool cma_validate_zones(struct cma *cma) +{ + return false; +} #endif #endif diff --git a/mm/cma.c b/mm/cma.c index 6ad631c9fdca..41248dee7197 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -99,6 +99,49 @@ static void cma_clear_bitmap(struct cma *cma, const struct cma_memrange *cmr, spin_unlock_irqrestore(&cma->lock, flags); } +/* + * Check if a CMA area contains no ranges that intersect with + * multiple zones. Store the result in the flags in case + * this gets called more than once. + */ +bool cma_validate_zones(struct cma *cma) +{ + int r; + unsigned long base_pfn; + struct cma_memrange *cmr; + bool valid_bit_set; + + /* + * If already validated, return result of previous check. + * Either the valid or invalid bit will be set if this + * check has already been done. If neither is set, the + * check has not been performed yet. + */ + valid_bit_set = test_bit(CMA_ZONES_VALID, &cma->flags); + if (valid_bit_set || test_bit(CMA_ZONES_INVALID, &cma->flags)) + return valid_bit_set; + + for (r = 0; r < cma->nranges; r++) { + cmr = &cma->ranges[r]; + base_pfn = cmr->base_pfn; + + /* + * alloc_contig_range() requires the pfn range specified + * to be in the same zone. Simplify by forcing the entire + * CMA resv range to be in the same zone. + */ + WARN_ON_ONCE(!pfn_valid(base_pfn)); + if (pfn_range_intersects_zones(cma->nid, base_pfn, cmr->count)) { + set_bit(CMA_ZONES_INVALID, &cma->flags); + return false; + } + } + + set_bit(CMA_ZONES_VALID, &cma->flags); + + return true; +} + static void __init cma_activate_area(struct cma *cma) { unsigned long pfn, base_pfn; @@ -113,19 +156,12 @@ static void __init cma_activate_area(struct cma *cma) goto cleanup; } + if (!cma_validate_zones(cma)) + goto cleanup; + for (r = 0; r < cma->nranges; r++) { cmr = &cma->ranges[r]; base_pfn = cmr->base_pfn; - - /* - * alloc_contig_range() requires the pfn range specified - * to be in the same zone. Simplify by forcing the entire - * CMA resv range to be in the same zone. - */ - WARN_ON_ONCE(!pfn_valid(base_pfn)); - if (pfn_range_intersects_zones(cma->nid, base_pfn, cmr->count)) - goto cleanup; - for (pfn = base_pfn; pfn < base_pfn + cmr->count; pfn += pageblock_nr_pages) init_cma_reserved_pageblock(pfn_to_page(pfn)); @@ -145,7 +181,7 @@ static void __init cma_activate_area(struct cma *cma) bitmap_free(cma->ranges[r].bitmap); /* Expose all pages to the buddy, they are useless for CMA. */ - if (!cma->reserve_pages_on_error) { + if (!test_bit(CMA_RESERVE_PAGES_ON_ERROR, &cma->flags)) { for (r = 0; r < allocrange; r++) { cmr = &cma->ranges[r]; for (pfn = cmr->base_pfn; @@ -172,7 +208,7 @@ core_initcall(cma_init_reserved_areas); void __init cma_reserve_pages_on_error(struct cma *cma) { - cma->reserve_pages_on_error = true; + set_bit(CMA_RESERVE_PAGES_ON_ERROR, &cma->flags); } static int __init cma_new_area(const char *name, phys_addr_t size, diff --git a/mm/cma.h b/mm/cma.h index b70a6c763f7d..0a1f8f8abe08 100644 --- a/mm/cma.h +++ b/mm/cma.h @@ -47,11 +47,17 @@ struct cma { /* kobject requires dynamic object */ struct cma_kobject *cma_kobj; #endif - bool reserve_pages_on_error; + unsigned long flags; /* NUMA node (NUMA_NO_NODE if unspecified) */ int nid; }; +enum cma_flags { + CMA_RESERVE_PAGES_ON_ERROR, + CMA_ZONES_VALID, + CMA_ZONES_INVALID, +}; + extern struct cma cma_areas[MAX_CMA_AREAS]; extern unsigned int cma_area_count;