From patchwork Thu Feb 6 18:50:43 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: 13963551 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 2680EC02194 for ; Thu, 6 Feb 2025 18:51:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 98E6A280003; Thu, 6 Feb 2025 13:51:24 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 8C85F280002; Thu, 6 Feb 2025 13:51:24 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 71F5D280003; Thu, 6 Feb 2025 13:51:24 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 4CDBB280002 for ; Thu, 6 Feb 2025 13:51:24 -0500 (EST) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 0BB4DB255A for ; Thu, 6 Feb 2025 18:51:24 +0000 (UTC) X-FDA: 83090412888.07.5C8E2F0 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) by imf01.hostedemail.com (Postfix) with ESMTP id 3ADA640011 for ; Thu, 6 Feb 2025 18:51:22 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3b2Ze1UN; spf=pass (imf01.hostedemail.com: domain of 3qQSlZwQKCIot9rzu22uzs.q20zw18B-00y9oqy.25u@flex--fvdl.bounces.google.com designates 209.85.216.73 as permitted sender) smtp.mailfrom=3qQSlZwQKCIot9rzu22uzs.q20zw18B-00y9oqy.25u@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=1738867882; 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=GxP6S0l3dQ+6CkO+pIY1HsOnc8ShdfnkIOi767vYzT8=; b=dpJTKwUuYeoyo5v5wtGLdzVV0Bl7d1teHk5103h6GoppzrLVYYGjQyzePKIsU2BwWNZ45D zg+u0VzmYYnPrHrrxc23BmFfAMhnpc+s/xsJOKsaOcJE0uJ2bJMQ0vWy1CNRAga3K3FXXT +fihQEU1hieoGkG1ap1zFk1h0yb3npU= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3b2Ze1UN; spf=pass (imf01.hostedemail.com: domain of 3qQSlZwQKCIot9rzu22uzs.q20zw18B-00y9oqy.25u@flex--fvdl.bounces.google.com designates 209.85.216.73 as permitted sender) smtp.mailfrom=3qQSlZwQKCIot9rzu22uzs.q20zw18B-00y9oqy.25u@flex--fvdl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738867882; a=rsa-sha256; cv=none; b=oTAUX/uXiEtODMCSo8wdT+/GkrWQ2uA1a7vkmvscM/GE6lIeiV8TtVHWABNK+Kgv5WQRFq 1Z0j2eody3jUQR26FGareCa0fXnRPD+F6jX3qILO6kb6jGS53LgJeXnchUdNBN53GPX85U 6tzJ2SCKedcRrbvQcZrEfHn3acvBSKs= Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2fa228b4143so147541a91.0 for ; Thu, 06 Feb 2025 10:51:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738867881; x=1739472681; 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=GxP6S0l3dQ+6CkO+pIY1HsOnc8ShdfnkIOi767vYzT8=; b=3b2Ze1UN9qAOebg9IX86+yRAzOAACgHQfNKnfZajlUdV2ljL2SaliFi3PzPh2sAYRR /GzQLEvXbByhUS82dI+Tuyfv5Hgj+0gG+3P15NGH0XrPIWx1BweZY1ZhrAhpSKcEXgQL kAnSxf7rD+0lpDBwEWU+zej5XbpdL2qiKeXBFA2Rv0eJ5LiD0x/01IX++Jg/znTQaOCd /bM2rLyPy19aol7UynBA2GmMmTXOp16nlVE//Dh9xd4u4SXBtO2kTUlLj/578o02cP4L ctBvw2s0A1G92dGBUNqQPeh1a98MFpze/ndz7tqwNE9kRuHtXyg0yj9rY1DRa10v5zgL MNeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738867881; x=1739472681; 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=GxP6S0l3dQ+6CkO+pIY1HsOnc8ShdfnkIOi767vYzT8=; b=Tlp8CxWt4UxmrFzFBHwohiSB5YmtsxrzRZxsHLfKDJpoilv1KvVPgg0DUNRN4xzsuz 1rwUS7p0oPPKbpZbAPtkbwoewymKtj0ywhcc+Dknt9+qNQ56sP0xBTKChn7NWGSmle// cjx2Ho+rXdmLmE4TA73J8CqLnQbD1r7lvUnq/R2pNt49qnrdOeI9pwcERZzE6C16xkjn fxar83w0M41MUdR76fVWqFcgZDyDIAhekRfersk+9+WIkSdUBamd30RU89J5oaOZx2u2 887xJD7vqWXt0kCgNzH8HdsuHK7gJpiYPPABpyQRFNy1Z2Wixz2QBfkkf2eaJcgz90bM vQ6w== X-Forwarded-Encrypted: i=1; AJvYcCWBTD6+/duJumBLNY/2HEbKMyGSWLrg3pAqvDxh7r0SpCViy2ww9XGPMLQGtflCkr7Tyx6hqNC1VA==@kvack.org X-Gm-Message-State: AOJu0Yyh1i50VqEssBlDpRhyW9qTnjjFJ1MNXQoMqLjn9pk8o7MAba0b R81zmd58B50myxPz+8Uqo8+dlP8jZirfoxS+54kYBDv29XdbPd4sKUYm9q6C/za56PsGLg== X-Google-Smtp-Source: AGHT+IFhAWowVYwEoYtx6mfFOivywbt3Piw8sNnJL4ZJYNh4M1FuUx2ERPDZanvYPgCeFa64BAkgYsQp X-Received: from pjbse15.prod.google.com ([2002:a17:90b:518f:b0:2f4:3e59:8bb1]) (user=fvdl job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1946:b0:2fa:17e4:b1cf with SMTP id 98e67ed59e1d1-2fa247f9fcdmr44198a91.2.1738867881130; Thu, 06 Feb 2025 10:51:21 -0800 (PST) Date: Thu, 6 Feb 2025 18:50:43 +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-4-fvdl@google.com> Subject: [PATCH v3 03/28] mm/cma: introduce cma_intersects 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 , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , linux-s390@vger.kernel.org X-Rspam-User: X-Rspamd-Queue-Id: 3ADA640011 X-Stat-Signature: ggj7wqashna1ofuf9w6ongdb63bjpktm X-Rspamd-Server: rspam03 X-HE-Tag: 1738867882-766853 X-HE-Meta: U2FsdGVkX1/aDV4fBgqRsfyrwX14prMSbRej+xhLXCBDqWfj29wxZ+bvFNVIXiVB9al+DeLu4koOlXO10nIbQ5Kj6FzDcjawmnHYnYDZx/569dimNCyo2JuhrShm/U0Vs/fUTaRBu9nvOCZBJQeWH3LZP09iaFAyqIckLfFMswNrfQxpgugvskdp/Hd/4J/zVwbrgCqImtK7YyAuE1e3Pk5TjTxbirwgf7wwUA/uxP/HAGSLsrYcu/TsbOxZCSifwADLjEzFoWxckCnr4lRHKaoI60TirDyCFDYOB5bDWjsc+uy//VdHIUzU0+wWt3RhYAMFx5gVZDSC7fWgeB94OoYkrs+3uPSLfDgvD3f2HDAtrWjBDnsO1O1/DLCyJt0WYGVid0/w6yZkKz5SjS2FkVArkwuYzsb50yahOQCWTOK7B4wZJQXASb5GOiCjK/5PlaUr5yKNuBbG6d4djelJv0Su6zYpefUeOSgc0ZyhSOxJKWAvfjaUjPW26zeUpYnPJYHD7aVKNEeZLDWjQmri4PUrqJnTmfCtij8CkF23g5npL4oHvZ1SvhdmIMOCsDwNQYFK1rNLHkeHq2Clpz6nu8i7BcWUrjmdmMhdU+2i9todymO5OLMNWlpOK6SIJ8RVsM8Hc+WJnlhVIVB+OE8mKh+X/e/ovL1Tpt8vtVR0LOsq49Pv+be9Qi6bLJZrY1agD+ZRBhVgu27T8jKLoauIjvTRCpijySURwqjWHLF+Fv5CGbN2phK4kkQMMVtwCUF/LkO1IKS2FexDd+QEfFjxUzTGF/p0bzR0tV6HhCcWiodwSPemeK4hcrqQP05zhiBXyREb2x2xEygn8NAGbYxpb9ZPvQ3Y8d8kNDbu6ouxPCWQAGBBkSbJ2dGoxbo7pF9WgLP70VB2zb56Gkbv8GOz+/1q8hTcwFUnG6yd8Pxkhtqpwu3UoMxtnht7VyFVmPrebxRlPOAOushm3dV57dF SxpT7Kw8 Wd55oC/iXkosxXFUk+oIvk7P4UyKhWxXCy9XmWIhGtfkrpEnkyv4VGckPuIkFsjJ9YxkgwKb9pvKPdQOpHIRVxEijDlvoP7ph3yjmX9b2rDiacc9o8uCKNwnE5qixhJuS+lv9xR1mn9Kxyb0U/EQy6fXDgRzGgICcwgKUZWdasG2x/raHMy/z3MkW3jFxFqRaDqpdWWHcpjYZTFZb+II9MVO67x8RyI4YSnXICgJzmwOZely35jl/UjD0Urc+kwKrK7ca+OxxSfzVVlYDgxPVbO7760wdGoYMGo8Rzd395EKbcgz/PV5si2BaDh+HGhMNEXiQUYoC+kWRcInhdULNC6VC82LIKFEprzaS5ZHik/M8/Uuz2NyFczNHcALzD0mH0lAG8sQmaxqqvqzadeqXFlZOGS6eFecV+1V2wV0MnZAleLO5Z5yKYG2b8yT4szmBxcb5/EpAPQA8mC/RtpoBsgi+0o8CvJhR2/1wPHCYC4vTUcrJ1N1967vC2gDKwueRcLIUvpaRisoENxCF5sUCZjIeBIYr1NUDhiADsyNSnqiaoOGSjrHRC5UOGmo0gUyDx55jhuULjvR/Ukz/D81e8WqWtqhJBUCOenwYAOr6OCoVMzcJ8HyrqVJGxQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000852, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Now that CMA areas can have multiple physical ranges, code can't assume a CMA struct represents a base_pfn plus a size, as returned from cma_get_base. Most cases are ok though, since they all explicitly refer to CMA areas that were created using existing interfaces (cma_declare_contiguous_nid or cma_init_reserved_mem), which guarantees they have just one physical range. An exception is the s390 code, which walks all CMA ranges to see if they intersect with a range of memory that is about to be hotremoved. So, in the future, it might run in to multi-range areas. To keep this check working, define a cma_intersects function. This just checks if a physaddr range intersects any of the ranges. Use it in the s390 check. Cc: Heiko Carstens Cc: Vasily Gorbik Cc: Alexander Gordeev Cc: linux-s390@vger.kernel.org Signed-off-by: Frank van der Linden Acked-by: Alexander Gordeev --- arch/s390/mm/init.c | 13 +++++-------- include/linux/cma.h | 1 + mm/cma.c | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index f2298f7a3f21..d88cb1c13f7d 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -239,16 +239,13 @@ struct s390_cma_mem_data { static int s390_cma_check_range(struct cma *cma, void *data) { struct s390_cma_mem_data *mem_data; - unsigned long start, end; mem_data = data; - start = cma_get_base(cma); - end = start + cma_get_size(cma); - if (end < mem_data->start) - return 0; - if (start >= mem_data->end) - return 0; - return -EBUSY; + + if (cma_intersects(cma, mem_data->start, mem_data->end)) + return -EBUSY; + + return 0; } static int s390_cma_mem_notifier(struct notifier_block *nb, diff --git a/include/linux/cma.h b/include/linux/cma.h index 863427c27dc2..03d85c100dcc 100644 --- a/include/linux/cma.h +++ b/include/linux/cma.h @@ -53,6 +53,7 @@ extern bool cma_pages_valid(struct cma *cma, const struct page *pages, unsigned extern bool cma_release(struct cma *cma, const struct page *pages, unsigned long count); extern int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data); +extern bool cma_intersects(struct cma *cma, unsigned long start, unsigned long end); extern void cma_reserve_pages_on_error(struct cma *cma); diff --git a/mm/cma.c b/mm/cma.c index 6ac9173d3a7d..c7116a5819c5 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -978,3 +978,24 @@ int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data) return 0; } + +bool cma_intersects(struct cma *cma, unsigned long start, unsigned long end) +{ + int r; + struct cma_memrange *cmr; + unsigned long rstart, rend; + + for (r = 0; r < cma->nranges; r++) { + cmr = &cma->ranges[r]; + + rstart = PFN_PHYS(cmr->base_pfn); + rend = PFN_PHYS(cmr->base_pfn + cmr->count); + if (end < rstart) + continue; + if (start >= rend) + continue; + return true; + } + + return false; +}