From patchwork Thu Feb 6 18:51: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: 13963571 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 84A81C02199 for ; Thu, 6 Feb 2025 18:52:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E23CE280017; Thu, 6 Feb 2025 13:51:58 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D8480280002; Thu, 6 Feb 2025 13:51:58 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BB0CE280017; Thu, 6 Feb 2025 13:51:58 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 98A9D280002 for ; Thu, 6 Feb 2025 13:51:58 -0500 (EST) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 635C21C8FE6 for ; Thu, 6 Feb 2025 18:51:58 +0000 (UTC) X-FDA: 83090414316.12.E2F6023 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf28.hostedemail.com (Postfix) with ESMTP id 920CAC000D for ; Thu, 6 Feb 2025 18:51:56 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=u8Co7Qc1; spf=pass (imf28.hostedemail.com: domain of 3ywSlZwQKCKwRhPXSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--fvdl.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3ywSlZwQKCKwRhPXSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--fvdl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738867916; 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=yt0ZJmO4eMnkUw1+mDBNXTwvRT3PLwjDe9mC0zKYM+w=; b=eguPSwWei/TQyEGXe3tN8k/yt+2P+cYZhtb34gZCyUgizjBeb1JW1buQxpug4tdBZtVamZ KaKFaou+dMjt9nacmNaw4DQ8d68ESjFflBV76C1u6FDy8CLPHKmCXTjDTYYNdTST71z45A EJL4WPZElLupyaa5f5aBPcalxJm/5hA= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=u8Co7Qc1; spf=pass (imf28.hostedemail.com: domain of 3ywSlZwQKCKwRhPXSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--fvdl.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3ywSlZwQKCKwRhPXSaaSXQ.OaYXUZgj-YYWhMOW.adS@flex--fvdl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738867916; a=rsa-sha256; cv=none; b=lhh7rkeI9CI1XAvhmZrLnae6vAGqL4Cvx8dRrNHpGf2rbeXzPj4S9fphsblUXEm3GndMTF KhPkcECGNJa4es+YmUpD+6NMDPFUY1z7o1Vc5hFm1dGmETeo+g8G33iegBK1sVQtEpPPc6 ZLW9kWxwy3BjoWOMJSpsfHoZDkOXQFw= Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2161d5b3eb5so27180915ad.3 for ; Thu, 06 Feb 2025 10:51:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738867915; x=1739472715; 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=yt0ZJmO4eMnkUw1+mDBNXTwvRT3PLwjDe9mC0zKYM+w=; b=u8Co7Qc1086Y10XfLv05OgKhWNFUSJTlAvGIN6cpDzCbpR4/+Q3Q7pKARul/B+a/2j 0N+mcYvKYlXje5gqrqBqfP8gq3LOrQ0nVqgNfFxQxk0F6Xc1XDVUADnHVr29nLScQn2Q t6Be1onE+U16CvBbXL2gJUNyB7kVjGxV+FvM97wyyIRatsT1ZtNdt77hAEyRIBuYQ70P hHRjuwm9x76fYHasXZLvHNZcYziZS2TvXYEjG9n+G/abZrhMQEzCTfvV2kfyQEdyQUYh 6QhpaZOTN/wkM0rWFDlBYsiLm1Tlv6SWix6uZn/2kGeplCG/LiOmgImR4jLM2iUGGrtR Hdgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738867915; x=1739472715; 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=yt0ZJmO4eMnkUw1+mDBNXTwvRT3PLwjDe9mC0zKYM+w=; b=u/sZtdEBkCh/53MihBNKB3A4bPSrwp4bvHbihanQhLx3QgKKK1VbydpI7Z/5nvihyO OpUnsEwWhapXty6I2Timi31asa58mA9FQxm2LZa6UB3sciGgNME9a7NROSbkh0xBbNM6 6LAUGH0fkiLjo9+qRWMHsETc0YFZHQg8T9/qKiUUEfPHnZdg+L6xf5Ez8LgScwmJVXUt 6CVkBmBFkpwtrQXl8dVo/udNlkoogxcg5jGNAhPJSbiFWwFlbGsEiXd1bzW0SiGT2x/m Ko0hvuqkUWO0MqHUMgBAJEGx6Nhxw5ANbwuOTEIGeNYWYLA8cNwtipyisR11LZumsZW2 MdcA== X-Forwarded-Encrypted: i=1; AJvYcCUQNZP/x4dWjBI8Qi6aP6BiEbn13Il9R017tTzQtYWFcSqVmAKyn2ZzqCC1+JJxEZe2M2LAYfuT/A==@kvack.org X-Gm-Message-State: AOJu0YzaXa18Y2m0H53XANd8jyKU1MQ9Smedu9fTHn07RVtoU3vMJlKs o9nq2J7v3OYvEVZ70dYqEx1WshYnBbOA8wZUi2X0zJGeUNBclOXWbNDoxNB75yUlSAGy9Q== X-Google-Smtp-Source: AGHT+IFZhH2u1+M+xFH2j0CpMHxi5A7C45tXR32gxTZbZ8iZD/tY8JR/54qpQpgRoE2PyZBUqmPt1YR+ X-Received: from pgcv13.prod.google.com ([2002:a05:6a02:530d:b0:801:d724:5abd]) (user=fvdl job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:9f8e:b0:1e1:94a2:275c with SMTP id adf61e73a8af0-1ee03a3f4camr941358637.18.1738867915504; Thu, 06 Feb 2025 10:51:55 -0800 (PST) Date: Thu, 6 Feb 2025 18:51:04 +0000 In-Reply-To: <20250206185109.1210657-1-fvdl@google.com> Mime-Version: 1.0 References: <20250206185109.1210657-1-fvdl@google.com> X-Mailer: git-send-email 2.48.1.502.g6dc24dfdaf-goog Message-ID: <20250206185109.1210657-25-fvdl@google.com> Subject: [PATCH v3 24/28] 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, usamaarif642@gmail.com, joao.m.martins@oracle.com, roman.gushchin@linux.dev, Frank van der Linden X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 920CAC000D X-Stat-Signature: h8p5rg6tuczmqwazr65g8a7pybs4bna1 X-Rspam-User: X-HE-Tag: 1738867916-577436 X-HE-Meta: U2FsdGVkX181KCQbKYIy0JrPMzwbRYws7pj+qLRaD9PPwC9ldzyo/+yIdkg4xkpnKQ8d5nYfLj220c+YCELgAnf9F/jMvtBFxYIDBa0p1xaM6dwZREs9UcZcyUghxS+MubKP0rmuZ4xg37z38iKZShr0ZFEjVh9T+yvaR4kF9LIiSuaf4ahO44+Wv2l2bcmbz9gjJcQrm9hsHinC+qTAznGBOOnzXOmVIx4JDMSI0nkVRPx3C0lOLG8W+tjBe7zcWZk8xIM67IBd6Nn66rMhSk74tMVgwrjx5jJ4yvbYQ0OaAPPGUCHNV/NTYvCBZ4f7RIpm8Q7TjlhZZyaqwy/iftrN9xgKj53WrOBPKNrtvtvhciJULjmFWuoBELg/yruEvhrk357JJ6jYrolnoNFfe2qTymqMaRNN9nS+3eDGfDJcRhTWfqHFiEq63N3nhdLcSFTuaxtFVkzMNXmLhUXna74V+xDHDpVhZGG0TwnEfodHCgOZ8F1p/wfS+mMHGI7xnNqddvozyTjwEyjgeNcj8HPgJ0IU5Znu95pKqxxJoG6FpuR54a/Vg5lfc4x/lJjyTS1azxxL0/tZSFowRPwyr9o+84tx6M/0iR+BIx4gnkI6LGldTOqH1M2ci0QmCcKvtv+Exw+GhqbfqX+XynWGW1q6JPhVXEQLyHNrOF2rghP5zqVlWphJBYmq3TKuBzQQhHK3erKaue08J7MJlX4sTInyULoJeyXW0/Bt1SMTOP5VbwwcfxAclgbLjFm3Goucv+37dI6IZdN/oBSlFNq6tFw6nSQwYx/hS/0At06mxT0vcAM4igpd0vyGNWBsDa8kX/r/IUtIcK9F1jEeTIqdIbQDa2Zk+N5a21Is9JoyLtLY1UWHZ4hkV11YY6ZPzZacINSoEKNmcuI6Wc4UKMvl+itLv7pVpkebn+j2nOYgJu6IUuJntHv8br7+kTGJHljYdxMM7dRIerR+0jwL9Iz VTPAFbjz GfZAKfI7ytyX2D4TtxrvqUBUMsL1XW/vDuSpb2ghCAFEDYm66iQYacreZ5+Tj/blTLNIswn58z0ePXHzzicRddaMjOdWitQtpooqcDQCJsV2pjTWD9AjrwaRlYpKdSYPU7DQCsOJJzm+I3aRyF10g0sonWPKv7vVEZDZbO3JYqvbRg9ETrfH8MFQvhh7W/AP2aeBYpzoXuRXqdFFfXduP3QBWDIcyMr370qAg86CKWNqtP1iNMRDZoxrqifIfKXs90WnuWiEE48f3zfH3gDQc5s64Lk1R8v4mA7HK6eJI3mVDoK67qYUvfOjFBj0kay40IiFojkFRm0qI4PzH01byWOI3z1KJ3+eLst66F8FzH9aMcDuOi/rBPEtAqOEWkCGjym+elBVbe7cStzCxWh8regrykhqZqHvG/L4wsQI7Y+YhNh2UZnOUVISNEFk32N9e1cTYaS7M2jdu6CooLEAX34N1Zr/gNmnIYpsylDGhuxuyXSxf+hru23vOh0mvkw4oj/Xe8qo6tN5aqqwVp+oQ1Og/Gg== 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 d0227af4bb71..4388d941d381 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 ff79dba5508c..bddc84b3cd96 100644 --- a/mm/cma.h +++ b/mm/cma.h @@ -49,11 +49,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;