From patchwork Mon Oct 14 10:58:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ryan Roberts X-Patchwork-Id: 13834704 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 21061D1A443 for ; Mon, 14 Oct 2024 11:01:24 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A8ADB6B00C3; Mon, 14 Oct 2024 07:01:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A394E6B00C4; Mon, 14 Oct 2024 07:01:23 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8DDD86B00C5; Mon, 14 Oct 2024 07:01:23 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 65AF86B00C3 for ; Mon, 14 Oct 2024 07:01:23 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 16393A0D8F for ; Mon, 14 Oct 2024 11:01:09 +0000 (UTC) X-FDA: 82671916362.29.D3F8175 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf29.hostedemail.com (Postfix) with ESMTP id 746BC12001D for ; Mon, 14 Oct 2024 11:01:13 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=none; spf=pass (imf29.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com; dmarc=pass (policy=none) header.from=arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1728903493; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SCs5zLvTJKb41Hb5mZyIydGLU4/ZfA/FgaJwPe9tmC8=; b=GCPqk2P3KhNwsKlQRSGeJdB1L1v0VElgm3WAKBlIDZdMRUBAn+GWqfTwIz4bmuHV56t84g 9N3b3LVC6oRWO3KzUIokEJc9Tzjh2U1w7rsf+8EQR75VzGCy6VRvab5uzb5j/e+vpJdX7X UCuv3PS/X7zFYFAq95ugHbDuZXZCkRU= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=none; spf=pass (imf29.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com; dmarc=pass (policy=none) header.from=arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1728903493; a=rsa-sha256; cv=none; b=n+QVIqTEnUhNxBlrsZzH+TUKFc7vkvf+CmvM1R9t1tpEZMG2UgH1M+OoEaDTW/TkM1AVHe YYWs6jcrB+PLwz/8/jn5PCrOAOEtzF1CcIwOkBSTyu1QM07szIks0b5BzvBnyflN20eb+5 9q6zU93mTsenpMbcRMbP/Wt/MOTT4u0= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6816B1713; Mon, 14 Oct 2024 04:01:50 -0700 (PDT) Received: from e125769.cambridge.arm.com (e125769.cambridge.arm.com [10.1.196.27]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4980A3F51B; Mon, 14 Oct 2024 04:01:18 -0700 (PDT) From: Ryan Roberts To: Andrew Morton , Anshuman Khandual , Ard Biesheuvel , Catalin Marinas , David Hildenbrand , Greg Marsden , Ivan Ivanov , Kalesh Singh , Marc Zyngier , Mark Rutland , Matthias Brugger , Miroslav Benes , Will Deacon Cc: Ryan Roberts , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, xen-devel@lists.xenproject.org Subject: [RFC PATCH v1 36/57] xen: Remove PAGE_SIZE compile-time constant assumption Date: Mon, 14 Oct 2024 11:58:43 +0100 Message-ID: <20241014105912.3207374-36-ryan.roberts@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241014105912.3207374-1-ryan.roberts@arm.com> References: <20241014105514.3206191-1-ryan.roberts@arm.com> <20241014105912.3207374-1-ryan.roberts@arm.com> MIME-Version: 1.0 X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 746BC12001D X-Stat-Signature: rjahyyxh6u7px1qb6hyhzxp68d8n4c9r X-Rspam-User: X-HE-Tag: 1728903673-110878 X-HE-Meta: U2FsdGVkX19reV3713rThi2jb8AijDhx5BwIQg+AnsAqrLo52UZHjSsT1H0tGJ5kE8iS103tVSNROXBpzYus678PUYV/Tig78y2PAGb6gvVmI5wuwLpTb2hf6qOoX1Cm2hX7SL8UwEicWzK9ASfL612R2fDtXBq8m4JKZmrit+0okmXyNTKLwkzAn9UEdBmqzrEPKItMWa28L89s7OOjtszKqWHZd8o3Qc2ngLA7u9yAKxRDcFy57l3H9tG5kzAktXr+KyHXkJi3xH0bYPoK1UMJAgscJ4/7q7U16RPQBpZVDJ0XM39pOHTroNuOW02EaXX2nlhKI1TPjxvB8JP++Doi7wb/Mmcb5l7J8RT4efpr2/Bpj5oz59DrKKlAUn7xyowM+lBdpm2WBFDGes5iT7JO0Z6XN2qpsNdTLiGgPoOXFe1xcXQrd8LlaZZBTzoj+YvHrSNhKWM/5ZAdSxOX6n6vMNpar3EUZ9tXMZxwHpoG+8eP2gn4ERsxJLFMEgh6VlVGowkv8fJhFyhxOvxw5MO3ZFI2/lxKSnIFfkwt736IKPQGuW/2lGO5NUDZBm801o0CXWKWN4UcjzIQGA0nJdqWtQrhUfkLHQRLq9iij0KfDoZKEDvnsk+3HrhdRWTpP9vnDPjZC449kVUNRxCnYLkpkquP9Mse0ECSzAGrf4cHk7F0lmeh+MYdmSVGM0Vux/EFTqB4rqGBgSYYenKYfsJfu/4wYp5xXLEKPg5M0XRaMt1PJlR1H7TsGUtE7v3ZG5in/c5Du7VhVDzGgt+9g9RXihhJTIyDeRUFQyW7k1LAqGbltHdDhoT6/B31C7DVSLdVOgl/diPBxC5B5pLBV64k/pAwuhq7cGzYs3q31BwG33UDIc1ZogBXAJ0qVICLkfAwGoANPQ+WmvESZ9knrg3Yt0zvFKObeG5QYYdJ7QDcP9i15UKKNKg6s3jzuwSxyiyur9FbPuD84Qkj/Bv flf2UknT tBK7M67X7loABWmvQsteTgBSX9viiLcGHAxVIOC6UIv31DnSip9RqncwCG5JwmiInhvewPYt+H5DGLAROtlW4ec4j3dxO1cCEGzx+St/81JIDo/7OmlI/Jlc03dp8ZUUcTa50iB6CaQKbpDXH8c0/bkoksdtFBmf6T1IcG+YFSshXyPY0R0/LZud+3uhu6dQCGIla1TYR6Ve4wcns65M1WL4RHg80Clmojzq2 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: To prepare for supporting boot-time page size selection, refactor code to remove assumptions about PAGE_SIZE being compile-time constant. Code intended to be equivalent when compile-time page size is active. Allocate enough "frame_list" static storage in the balloon driver for the maximum supported page size. Although continue to use only the first PAGE_SIZE of the buffer at run-time to maintain existing behaviour. Refactor xen_biovec_phys_mergeable() to convert ifdeffery to c if/else. For compile-time page size, the compiler will choose one branch and strip the dead one. For boot-time, it can be evaluated at run time. Refactor a BUILD_BUG_ON to evaluate the limit (when the minimum supported page size is selected at boot-time). Reserve enough storage for max page size in "struct remap_data" and "struct xenbus_map_node". Signed-off-by: Ryan Roberts Reviewed-by: Stefano Stabellini --- ***NOTE*** Any confused maintainers may want to read the cover note here for context: https://lore.kernel.org/all/20241014105514.3206191-1-ryan.roberts@arm.com/ drivers/xen/balloon.c | 11 ++++++----- drivers/xen/biomerge.c | 12 ++++++------ drivers/xen/privcmd.c | 2 +- drivers/xen/xenbus/xenbus_client.c | 5 +++-- drivers/xen/xlate_mmu.c | 6 +++--- include/xen/page.h | 2 ++ 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 528395133b4f8..0ed5f6453af0e 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -131,7 +131,8 @@ struct balloon_stats balloon_stats; EXPORT_SYMBOL_GPL(balloon_stats); /* We increase/decrease in batches which fit in a page */ -static xen_pfn_t frame_list[PAGE_SIZE / sizeof(xen_pfn_t)]; +static xen_pfn_t frame_list[PAGE_SIZE_MAX / sizeof(xen_pfn_t)]; +#define FRAME_LIST_NR_ENTRIES (PAGE_SIZE / sizeof(xen_pfn_t)) /* List of ballooned pages, threaded through the mem_map array. */ @@ -389,8 +390,8 @@ static enum bp_state increase_reservation(unsigned long nr_pages) unsigned long i; struct page *page; - if (nr_pages > ARRAY_SIZE(frame_list)) - nr_pages = ARRAY_SIZE(frame_list); + if (nr_pages > FRAME_LIST_NR_ENTRIES) + nr_pages = FRAME_LIST_NR_ENTRIES; page = list_first_entry_or_null(&ballooned_pages, struct page, lru); for (i = 0; i < nr_pages; i++) { @@ -434,8 +435,8 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) int ret; LIST_HEAD(pages); - if (nr_pages > ARRAY_SIZE(frame_list)) - nr_pages = ARRAY_SIZE(frame_list); + if (nr_pages > FRAME_LIST_NR_ENTRIES) + nr_pages = FRAME_LIST_NR_ENTRIES; for (i = 0; i < nr_pages; i++) { page = alloc_page(gfp); diff --git a/drivers/xen/biomerge.c b/drivers/xen/biomerge.c index 05a286d24f148..28f0887e40026 100644 --- a/drivers/xen/biomerge.c +++ b/drivers/xen/biomerge.c @@ -8,16 +8,16 @@ bool xen_biovec_phys_mergeable(const struct bio_vec *vec1, const struct page *page) { -#if XEN_PAGE_SIZE == PAGE_SIZE - unsigned long bfn1 = pfn_to_bfn(page_to_pfn(vec1->bv_page)); - unsigned long bfn2 = pfn_to_bfn(page_to_pfn(page)); + if (XEN_PAGE_SIZE == PAGE_SIZE) { + unsigned long bfn1 = pfn_to_bfn(page_to_pfn(vec1->bv_page)); + unsigned long bfn2 = pfn_to_bfn(page_to_pfn(page)); + + return bfn1 + PFN_DOWN(vec1->bv_offset + vec1->bv_len) == bfn2; + } - return bfn1 + PFN_DOWN(vec1->bv_offset + vec1->bv_len) == bfn2; -#else /* * XXX: Add support for merging bio_vec when using different page * size in Xen and Linux. */ return false; -#endif } diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index 9563650dfbafc..847f7b806caf7 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c @@ -557,7 +557,7 @@ static long privcmd_ioctl_mmap_batch( state.global_error = 0; state.version = version; - BUILD_BUG_ON(((PAGE_SIZE / sizeof(xen_pfn_t)) % XEN_PFN_PER_PAGE) != 0); + BUILD_BUG_ON(((PAGE_SIZE_MIN / sizeof(xen_pfn_t)) % XEN_PFN_PER_PAGE_MAX) != 0); /* mmap_batch_fn guarantees ret == 0 */ BUG_ON(traverse_pages_block(m.num, sizeof(xen_pfn_t), &pagelist, mmap_batch_fn, &state)); diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c index 51b3124b0d56c..99bde836c10c4 100644 --- a/drivers/xen/xenbus/xenbus_client.c +++ b/drivers/xen/xenbus/xenbus_client.c @@ -49,9 +49,10 @@ #include "xenbus.h" -#define XENBUS_PAGES(_grants) (DIV_ROUND_UP(_grants, XEN_PFN_PER_PAGE)) +#define XENBUS_PAGES(_grants) (DIV_ROUND_UP(_grants, XEN_PFN_PER_PAGE)) +#define XENBUS_PAGES_MAX(_grants) (DIV_ROUND_UP(_grants, XEN_PFN_PER_PAGE_MIN)) -#define XENBUS_MAX_RING_PAGES (XENBUS_PAGES(XENBUS_MAX_RING_GRANTS)) +#define XENBUS_MAX_RING_PAGES (XENBUS_PAGES_MAX(XENBUS_MAX_RING_GRANTS)) struct xenbus_map_node { struct list_head next; diff --git a/drivers/xen/xlate_mmu.c b/drivers/xen/xlate_mmu.c index f17c4c03db30c..a757c801a7542 100644 --- a/drivers/xen/xlate_mmu.c +++ b/drivers/xen/xlate_mmu.c @@ -74,9 +74,9 @@ struct remap_data { int mapped; /* Hypercall parameters */ - int h_errs[XEN_PFN_PER_PAGE]; - xen_ulong_t h_idxs[XEN_PFN_PER_PAGE]; - xen_pfn_t h_gpfns[XEN_PFN_PER_PAGE]; + int h_errs[XEN_PFN_PER_PAGE_MAX]; + xen_ulong_t h_idxs[XEN_PFN_PER_PAGE_MAX]; + xen_pfn_t h_gpfns[XEN_PFN_PER_PAGE_MAX]; int h_iter; /* Iterator */ }; diff --git a/include/xen/page.h b/include/xen/page.h index 285677b42943a..86683a30038a3 100644 --- a/include/xen/page.h +++ b/include/xen/page.h @@ -21,6 +21,8 @@ ((page_to_pfn(page)) << (PAGE_SHIFT - XEN_PAGE_SHIFT)) #define XEN_PFN_PER_PAGE (PAGE_SIZE / XEN_PAGE_SIZE) +#define XEN_PFN_PER_PAGE_MIN (PAGE_SIZE_MIN / XEN_PAGE_SIZE) +#define XEN_PFN_PER_PAGE_MAX (PAGE_SIZE_MAX / XEN_PAGE_SIZE) #define XEN_PFN_DOWN(x) ((x) >> XEN_PAGE_SHIFT) #define XEN_PFN_UP(x) (((x) + XEN_PAGE_SIZE-1) >> XEN_PAGE_SHIFT)