From patchwork Tue Feb 18 18:16:31 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: 13980402 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 5FD58C021AD for ; Tue, 18 Feb 2025 18:17:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1E1AA280179; Tue, 18 Feb 2025 13:17:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 16CF3280176; Tue, 18 Feb 2025 13:17:15 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E8947280179; Tue, 18 Feb 2025 13:17:14 -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 C7068280176 for ; Tue, 18 Feb 2025 13:17:14 -0500 (EST) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 79C8E120405 for ; Tue, 18 Feb 2025 18:17:14 +0000 (UTC) X-FDA: 83133872388.09.246892D Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf06.hostedemail.com (Postfix) with ESMTP id A705C180014 for ; Tue, 18 Feb 2025 18:17:12 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3c8Z6knh; spf=pass (imf06.hostedemail.com: domain of 3p860ZwQKCFw9P7FAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--fvdl.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3p860ZwQKCFw9P7FAIIAF8.6IGFCHOR-GGEP46E.ILA@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=1739902632; 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=tllVc7X/acXyb+IoDErelML7G/kmBDOgXbXRXqPobDE=; b=RhX5atzYBT3SOi7eGSONj/PPPStgO8xVKurhtTMdXXfC3cYwGvXomQpirXFvE6Kws+qz3B tYIweqcquJFbR3ooDk0lnFr6aY40Mb8/to12ggBIBXjb7youO7VBGkqSZkcJU7VB+7Mzrn ZGErF2Z4jQOKm6F293ua13fV3F0DhDw= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=3c8Z6knh; spf=pass (imf06.hostedemail.com: domain of 3p860ZwQKCFw9P7FAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--fvdl.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3p860ZwQKCFw9P7FAIIAF8.6IGFCHOR-GGEP46E.ILA@flex--fvdl.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739902632; a=rsa-sha256; cv=none; b=onKhimcz0u052kTTI1DL8wbhHFdZYr+ganAlgrkv8A7Bdl6sZVFAUTeKQYjZquwGZs4eVG uQPNxEgypIF0NynnIcypmhw15k7SijlmW5nnTtMeA4KfWBXb3MwaSb99joP0BwdwUZhUS9 HqD83jzqfq9OZQ2yjpN/IwCL+vddQbw= Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2fc45101191so6029428a91.1 for ; Tue, 18 Feb 2025 10:17:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1739902631; x=1740507431; 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=tllVc7X/acXyb+IoDErelML7G/kmBDOgXbXRXqPobDE=; b=3c8Z6knhgVjhlul645qFr1C9Y/PSrqgrjJmRcEoTeSBv41K6K4ZFYFc2HbFYIvc3U+ ViCMyxMXK7FvpOpZV+SDIBENxkLnPrEmsmUSKGS9amVO/Wr4Z76zKmGyC238ifyeZ3XI orokzUh7qQHvogmCGuh74Oe+0HAldDdxzfPlRItIRlsbhtNNhj0/5X6LAvPP0hrD5S9P nbaHtAlRMREPy5jEA+sNV2TlD/Go7ZgIM9ywDUStkffbsPQxfznWEypGr/b8DIiewDKm VvlKsiz7ts2o7zuOIxqU3UzPfcFbVgGLZDHsjFQCbPnRpOTybWMvsiv87jacYrtINknN ypYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739902631; x=1740507431; 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=tllVc7X/acXyb+IoDErelML7G/kmBDOgXbXRXqPobDE=; b=Z9G4HiLl2CYfEXJfEX3ruC07PzQ0GODzmAdrc6dNIy3AdTpY6NbHvEuUlkj1SjkGT6 ASMKSxMACuZw2Abi7BDNllAOm8yTSBieT3dKHTfjgCI3dVYuowvqvGYFUBm/KQbW+Rhn 64Piqumzo+ER8w9HRlI9cIegvwtvqq4f/Wn1NV6fzXX4KQWnC/uMtjBDCoK7w2TDxcAU iKl4YnMrdMBrHZAZ7udToWTutIwPb1MNGR+aQOdo9Rj10IxPvHZlgMsfUnMgjLggHWMW sRJQYdEswYFvAFgPUYh7esPAfRFFqqQF7vs5qPP2+ZlMsfpnTsFkuCopkMG+grrYqK6N Xqmw== X-Forwarded-Encrypted: i=1; AJvYcCWUFWFeac8MNewuTmFJCD3CwZ5iOjRSxHdXCinsyOTsok+kaR9HFtZJjE8RDxae/hS4y/JCeHwqaA==@kvack.org X-Gm-Message-State: AOJu0YxjpOa+om1EL71KvDU5VrKxaks4D2phQ3EtVmKutgqlJ3XsefB4 iR8+Yf2ExJAxzgBpVZAE2YT7w9IYsZraXUWSwtfQGzqLRL6HvreqZT5lWdk04VHVxOL+SQ== X-Google-Smtp-Source: AGHT+IEImgj/kN4IDC2d0OdCVCT/P6/c0Qlb8Kol3LFJI2Z9hlrSwi6kxHopJVJc8L3J73IZc+vlmUAx X-Received: from pjbli10.prod.google.com ([2002:a17:90b:48ca:b0:2ea:448a:8cd1]) (user=fvdl job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:d0c6:b0:2fc:a3b7:108a with SMTP id 98e67ed59e1d1-2fca3b711a8mr4781829a91.2.1739902631607; Tue, 18 Feb 2025 10:17:11 -0800 (PST) Date: Tue, 18 Feb 2025 18:16:31 +0000 In-Reply-To: <20250218181656.207178-1-fvdl@google.com> Mime-Version: 1.0 References: <20250218181656.207178-1-fvdl@google.com> X-Mailer: git-send-email 2.48.1.601.g30ceb7b040-goog Message-ID: <20250218181656.207178-4-fvdl@google.com> Subject: [PATCH v4 03/27] 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-Server: rspam09 X-Rspamd-Queue-Id: A705C180014 X-Stat-Signature: mf9f4at867b8ye7ye9a5tnzi1fm3ap5h X-HE-Tag: 1739902632-139366 X-HE-Meta: U2FsdGVkX1/5Dog50DzZzawal1woCR0cOcT85GdZ7bebcfbWCwDP3H1OQ+0qn9cA9vro6YWM9WutWUKpJ+Vd5zIczm27GTbtfmvcMrV4Av9guDlBXXM2AYlS2/TXPvTwEMci9J3CVJS7Hmk7dIoyf0aG+xwlpHc166p3rJaHkdwZm3i/zD1WEOMMYltwxfWvLxPDS+cBfWNSKdalOvx9TmvUebUDhzB10NEKDLn8HNmYNuArKrJ8GS3/Z2lch9XF8oz+icF58JK/WXWJpVGS+wM/zK9R6cDEGbqSf8LGPDjJ/OqObcVNiYbKNAxzxOjpUDcfg/N+M+LH0AxrIdGI3R/jYX7f0M5SsAmmRersHZoR/iBkdCCabc7UEMoJX1cqgUYnBgbbjwamql/YcVpABh+Lfl+9R6KBKIjIzaCC83/lbjRWV+S9VljCNW+OERyJv072/vwQqUrYUQnhQ5ONJteykDq93hsdaIGjFlYmqwadegUS3ZN0zHsFBk4xy4XV7W9TsrGkMSiXjc2vKzj7BZ86Pb2w60YuQ2f4iMIqvjntaKp6NVgG4WiS4QGx0uM+bd9/sbtxblKjMX2npld/X64BDjZlNsKzogzEAk4O3k3RHnsoL+C2KIT9qY+A2ouUHq/PQR+Y1AI6JEYgwpw7Eu5cc2JrVfdDf/86vjbo9lQUtL24Xb5TLyE4oBljIdcRpm2SWaWdvakQ2gof7/SJdJbVUvUst01JNYzz+gq9ywe8gJzL8jnBzsRK1ff88acCinphXE6HIDwxXdyu0aRqiuBLF8RRrpZeeFKCg/ji3rjkrd75fDLYe89PMtluXZg5tSeGIpjN7WE/9yybBtLqwuVyls6D1tC2WnUpVtS5nfDxsCsWnqMbmusInpqM8Xk9yKaDCalEKTcI6bIGpE4UGQ9a6q2aPCvI73z5Z3IqY743dSZj56MQfdDYK6PbikFrFLqGw+v9CJY+NLTUIpC ehuQDavt 0H8DfsbhsRs+F/Qe8YAbcOjbD3StkbLZrLD6SKK+oA1ieR637VryqOu2XRGCIwV03Gr4j8VD1n16k7lMMEA88VqsY91qAKXAATudfAdBIH3dntsh8NQWdF2kG8rtF585igukyJdaj6UFrTp9n16CiSYyyxxB+cSggZvaLtyYRWgDA2fyGEb4KOTU1XaV/Fpr7Cvn61epHDYcB2W5juGuNZraizhpytGlnskPU0BCBUGyOpCuExNeu5c24ujpzSmpPEopdVEX0XoSmaxaFhOKmt9gou6CNx0q//rAJjX9ml+QzWZYlDllCyymYaZdcvFfQwxi4SFBspPTGo6H/gE+gFlMLmXg5ngstldsi/EwY2d6qaM+lnmi5Va4rrI6Cf1Et23twpmX6E+2DnUnw2z7T0s9UJHiKoVMakOqWq6P6OPl0ISTUG+RWQv7z0eDmjJWFP7E+EbpsS9VOUzKn40FTE4Kx+RW4RRNo7rP7gx75R7lCTkQAMGmIC3awB1ty00EwnnYHoIFCIpEln3mg//7NRKaW2q/ZkqSYeMcjPu6yR9raBjBnfj9X0MxTYtYmvzPGCK62SxXK05FBNxoRy7Q2VZxqLE+vi7AYnj19Xyj+i34edmFB7gEjNSjjZA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000026, 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 Acked-by: Alexander Gordeev Signed-off-by: Frank van der Linden --- 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; +}