Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2195540/?format=api
{ "id": 2195540, "url": "http://patchwork.ozlabs.org/api/patches/2195540/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260211103141.3215197-5-rppt@kernel.org/", "project": { "id": 2, "url": "http://patchwork.ozlabs.org/api/projects/2/?format=api", "name": "Linux PPC development", "link_name": "linuxppc-dev", "list_id": "linuxppc-dev.lists.ozlabs.org", "list_email": "linuxppc-dev@lists.ozlabs.org", "web_url": "https://github.com/linuxppc/wiki/wiki", "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git", "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/", "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/", "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}" }, "msgid": "<20260211103141.3215197-5-rppt@kernel.org>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260211103141.3215197-5-rppt@kernel.org/", "date": "2026-02-11T10:31:41", "name": "[v3,4/4] mm: cache struct page for empty_zero_page and return it from ZERO_PAGE()", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "baf6fe3ba580b9c63c19666cea46e5b0bea257d5", "submitter": { "id": 77733, "url": "http://patchwork.ozlabs.org/api/people/77733/?format=api", "name": "Mike Rapoport", "email": "rppt@kernel.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260211103141.3215197-5-rppt@kernel.org/mbox/", "series": [ { "id": 491812, "url": "http://patchwork.ozlabs.org/api/series/491812/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=491812", "date": "2026-02-11T10:31:37", "name": "arch, mm: consolidate empty_zero_page", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/491812/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2195540/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2195540/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linuxppc-dev+bounces-16806-incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linuxppc-dev@lists.ozlabs.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=VUycx2g0;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-16806-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)", "lists.ozlabs.org;\n arc=none smtp.remote-ip=172.234.252.31", "lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org", "lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=VUycx2g0;\n\tdkim-atps=neutral", "lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=kernel.org\n (client-ip=172.234.252.31; helo=sea.source.kernel.org;\n envelope-from=rppt@kernel.org; receiver=lists.ozlabs.org)" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:21b9:f100::1])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f9vs11bp9z1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 11 Feb 2026 21:32:53 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4f9vs10dfMz2ydj;\n\tWed, 11 Feb 2026 21:32:53 +1100 (AEDT)", "from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4f9vs02Rlmz2ySS\n\tfor <linuxppc-dev@lists.ozlabs.org>; Wed, 11 Feb 2026 21:32:52 +1100 (AEDT)", "from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby sea.source.kernel.org (Postfix) with ESMTP id 9DD6140DFA;\n\tWed, 11 Feb 2026 10:32:50 +0000 (UTC)", "by smtp.kernel.org (Postfix) with ESMTPSA id F37C2C2BCAF;\n\tWed, 11 Feb 2026 10:32:38 +0000 (UTC)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1770805972;\n\tcv=none;\n b=V70DOOWlLD/JEpvoE9E7fc2De5fLCEscXsMXA+uN9SS06f6s9ZlI7GiqHpN10xzDEwj2WhhFd90g77099K8F18m09nAcQMsD42OzoY7WgC0rZx03KcWBQajFwwJIEkxrpgNUEKnv9ShyF8B03Tb1vjujBPxq+3pTrF2ndeHDxNzp412gvnOPoouTz5E9SXrhhzPRMtCZ629SvE99Kwh7pxe8AQ/vVY/3Vfqw9EtXs3lm/zK5CE2aRjpNGPQfR+CSaxxJaFNy0EjuGWzTPSyQ6Z/Kjlr1dbemPRVObdq9WkvNax1FWfI+DRNb9I6qd7mXlEihSLkfDPvy/XRxiWMevQ==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1770805972; c=relaxed/relaxed;\n\tbh=WoHQIuiEqdW57fPr0bquSmA5wnTLfNUngV079oNlBzU=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=PdtVumPQM2exg+DSkzff+rp3qRHsdEPe5V2xGxSKHD5T5M7/Fu7tBtu6aKtaROF594uM982fARjN0SKesgz9bx1c8VpwOKREGHyLkP89UUZXV8+Ll13SjgYh5FfA/jFLAa2VN93RJDOE2b7qfI5Qsnc2GGD5O9gdhAfovXHSHTZ+DgtwVnIrZLrWNBetPbnoEOfAwk/5QebtaFMrVZx4zaJWM1/zzG/oiCjfv4WC2RZOh0yIwyhcMSSD2kUCsKVTz25KriSXlFuTUeXaLZAI3N0/5m4jSr20vptzSCl/o9JlRAXUZ01r3DXykK7dTIfGEC3UrsuNyKD3soP+cS4NOg==", "ARC-Authentication-Results": "i=1; lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org;\n dkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=VUycx2g0; dkim-atps=neutral;\n spf=pass (client-ip=172.234.252.31; helo=sea.source.kernel.org;\n envelope-from=rppt@kernel.org;\n receiver=lists.ozlabs.org) smtp.mailfrom=kernel.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1770805970;\n\tbh=WXj3bDUynhmJwIWcqszyv0wbTX5I8QPCpk4+eeqSnq4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=VUycx2g0refsXHYPZVpEU+UC7PHYsiruAyCk0E2NjULDdTGpkmomFQafKHUOTFGfN\n\t gxdwH68dJxpGp5uoQ4bCIYVF9q/ZtWZyBrRXQKklHUNBBv4tXopKimIWb6HO1xITWD\n\t v5Le7kpV2WyO2ymXn0Iru7RhLgig1FDLpKEZLiaW4uloDE3fqoRPWZQHcg4WZLcxzC\n\t Dem6wAhAyVX6Jeh2Hi5hO5aKu49m5ADtB9baTMfm2NL2MQ5Xgny2uugfwPkwNfT/Sh\n\t 55TTMaB6nztE9wmgPYA3G+uvSqqAXPlhRNT70FMQNqDaWyvoaKR0G5d15Xri9RCkaK\n\t z/9dYoHmO4k7Q==", "From": "Mike Rapoport <rppt@kernel.org>", "To": "Andrew Morton <akpm@linux-foundation.org>", "Cc": "Andreas Larsson <andreas@gaisler.com>,\n\tBorislav Petkov <bp@alien8.de>,\n\tBrian Cain <bcain@kernel.org>,\n\tCatalin Marinas <catalin.marinas@arm.com>,\n\t\"Christophe Leroy (CS GROUP)\" <chleroy@kernel.org>,\n\t\"David S. Miller\" <davem@davemloft.net>,\n\tDave Hansen <dave.hansen@linux.intel.com>,\n\tDavid Hildenbrand <david@kernel.org>,\n\tDinh Nguyen <dinguyen@kernel.org>,\n\tGeert Uytterhoeven <geert@linux-m68k.org>,\n\tGuo Ren <guoren@kernel.org>,\n\tHelge Deller <deller@gmx.de>,\n\tHuacai Chen <chenhuacai@kernel.org>,\n\tIngo Molnar <mingo@redhat.com>,\n\tJohannes Berg <johannes@sipsolutions.net>,\n\tJohn Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>,\n\t\"Liam R. Howlett\" <Liam.Howlett@oracle.com>,\n\tLorenzo Stoakes <lorenzo.stoakes@oracle.com>,\n\tMadhavan Srinivasan <maddy@linux.ibm.com>,\n\tMagnus Lindholm <linmag7@gmail.com>,\n\tMatt Turner <mattst88@gmail.com>,\n\tMax Filippov <jcmvbkbc@gmail.com>,\n\tMichael Ellerman <mpe@ellerman.id.au>,\n\tMichal Hocko <mhocko@suse.com>,\n\tMichal Simek <monstr@monstr.eu>,\n\tMike Rapoport <rppt@kernel.org>,\n\tPalmer Dabbelt <palmer@dabbelt.com>,\n\tRichard Weinberger <richard@nod.at>,\n\tRussell King <linux@armlinux.org.uk>,\n\tStafford Horne <shorne@gmail.com>,\n\tSuren Baghdasaryan <surenb@google.com>,\n\tThomas Gleixner <tglx@kernel.org>,\n\tVineet Gupta <vgupta@kernel.org>,\n\tVlastimil Babka <vbabka@suse.cz>,\n\tWill Deacon <will@kernel.org>,\n\tlinux-alpha@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-snps-arc@lists.infradead.org,\n\tlinux-arm-kernel@lists.infradead.org,\n\tlinux-csky@vger.kernel.org,\n\tlinux-hexagon@vger.kernel.org,\n\tloongarch@lists.linux.dev,\n\tlinux-m68k@lists.linux-m68k.org,\n\tlinux-openrisc@vger.kernel.org,\n\tlinux-parisc@vger.kernel.org,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tlinux-riscv@lists.infradead.org,\n\tlinux-sh@vger.kernel.org,\n\tsparclinux@vger.kernel.org,\n\tlinux-um@lists.infradead.org,\n\tlinux-mm@kvack.org,\n\tx86@kernel.org", "Subject": "[PATCH v3 4/4] mm: cache struct page for empty_zero_page and return\n it from ZERO_PAGE()", "Date": "Wed, 11 Feb 2026 12:31:41 +0200", "Message-ID": "<20260211103141.3215197-5-rppt@kernel.org>", "X-Mailer": "git-send-email 2.51.0", "In-Reply-To": "<20260211103141.3215197-1-rppt@kernel.org>", "References": "<20260211103141.3215197-1-rppt@kernel.org>", "X-Mailing-List": "linuxppc-dev@lists.ozlabs.org", "List-Id": "<linuxppc-dev.lists.ozlabs.org>", "List-Help": "<mailto:linuxppc-dev+help@lists.ozlabs.org>", "List-Owner": "<mailto:linuxppc-dev+owner@lists.ozlabs.org>", "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>", "List-Archive": "<https://lore.kernel.org/linuxppc-dev/>,\n <https://lists.ozlabs.org/pipermail/linuxppc-dev/>", "List-Subscribe": "<mailto:linuxppc-dev+subscribe@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-digest@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-nomail@lists.ozlabs.org>", "List-Unsubscribe": "<mailto:linuxppc-dev+unsubscribe@lists.ozlabs.org>", "Precedence": "list", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Spam-Status": "No, score=-0.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED,\n\tDKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS\n\tautolearn=disabled version=4.0.1 OzLabs 8", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org" }, "content": "From: \"Mike Rapoport (Microsoft)\" <rppt@kernel.org>\n\nFor most architectures every invocation of ZERO_PAGE() does\nvirt_to_page(empty_zero_page). But empty_zero_page is in BSS and it is\nenough to get its struct page once at initialization time and then use\nit whenever a zero page should be accessed.\n\nAdd yet another __zero_page variable that will be initialized as\nvirt_to_page(empty_zero_page) for most architectures in a weak\narch_setup_zero_pages() function.\n\nFor architectures that use colored zero pages (MIPS and s390) rename their\nsetup_zero_pages() to arch_setup_zero_pages() and make it global rather\nthan static.\n\nFor architectures that cannot use virt_to_page() for BSS (arm64 and\nsparc64) add override of arch_setup_zero_pages().\n\nAcked-by: Catalin Marinas <catalin.marinas@arm.com>\nSigned-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>\n---\n arch/arm64/include/asm/pgtable.h | 6 ------\n arch/arm64/mm/init.c | 5 +++++\n arch/mips/mm/init.c | 11 +----------\n arch/s390/mm/init.c | 4 +---\n arch/sparc/include/asm/pgtable_64.h | 3 ---\n arch/sparc/mm/init_64.c | 17 +++++++----------\n include/linux/pgtable.h | 11 ++++++++---\n mm/mm_init.c | 21 +++++++++++++++++----\n 8 files changed, 39 insertions(+), 39 deletions(-)", "diff": "diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h\nindex 63da07398a30..2c1ec7cc8612 100644\n--- a/arch/arm64/include/asm/pgtable.h\n+++ b/arch/arm64/include/asm/pgtable.h\n@@ -106,12 +106,6 @@ static inline void arch_leave_lazy_mmu_mode(void)\n #define flush_tlb_fix_spurious_fault_pmd(vma, address, pmdp)\t\\\n \tlocal_flush_tlb_page_nonotify(vma, address)\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-#define ZERO_PAGE(vaddr)\tphys_to_page(__pa_symbol(empty_zero_page))\n-\n #define pte_ERROR(e)\t\\\n \tpr_err(\"%s:%d: bad pte %016llx.\\n\", __FILE__, __LINE__, pte_val(e))\n \ndiff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c\nindex 96711b8578fd..417ec7efe569 100644\n--- a/arch/arm64/mm/init.c\n+++ b/arch/arm64/mm/init.c\n@@ -328,6 +328,11 @@ void __init bootmem_init(void)\n \tmemblock_dump_all();\n }\n \n+void __init arch_setup_zero_pages(void)\n+{\n+\t__zero_page = phys_to_page(__pa_symbol(empty_zero_page));\n+}\n+\n void __init arch_mm_preinit(void)\n {\n \tunsigned int flags = SWIOTLB_VERBOSE;\ndiff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c\nindex 4f6449ad02ca..55b25e85122a 100644\n--- a/arch/mips/mm/init.c\n+++ b/arch/mips/mm/init.c\n@@ -56,10 +56,7 @@ unsigned long empty_zero_page, zero_page_mask;\n EXPORT_SYMBOL_GPL(empty_zero_page);\n EXPORT_SYMBOL(zero_page_mask);\n \n-/*\n- * Not static inline because used by IP27 special magic initialization code\n- */\n-static void __init setup_zero_pages(void)\n+void __init arch_setup_zero_pages(void)\n {\n \tunsigned int order;\n \n@@ -450,7 +447,6 @@ void __init arch_mm_preinit(void)\n \tBUILD_BUG_ON(IS_ENABLED(CONFIG_32BIT) && (PFN_PTE_SHIFT > PAGE_SHIFT));\n \n \tmaar_init();\n-\tsetup_zero_pages();\t/* Setup zeroed pages. */\n \thighmem_init();\n \n #ifdef CONFIG_64BIT\n@@ -461,11 +457,6 @@ void __init arch_mm_preinit(void)\n \t\t\t\t0x80000000 - 4, KCORE_TEXT);\n #endif\n }\n-#else /* CONFIG_NUMA */\n-void __init arch_mm_preinit(void)\n-{\n-\tsetup_zero_pages();\t/* This comes from node 0 */\n-}\n #endif /* !CONFIG_NUMA */\n \n void free_init_pages(const char *what, unsigned long begin, unsigned long end)\ndiff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c\nindex 3c20475cbee2..1f72efc2a579 100644\n--- a/arch/s390/mm/init.c\n+++ b/arch/s390/mm/init.c\n@@ -69,7 +69,7 @@ unsigned long empty_zero_page, zero_page_mask;\n EXPORT_SYMBOL(empty_zero_page);\n EXPORT_SYMBOL(zero_page_mask);\n \n-static void __init setup_zero_pages(void)\n+void __init arch_setup_zero_pages(void)\n {\n \tunsigned long total_pages = memblock_estimated_nr_free_pages();\n \tunsigned int order;\n@@ -159,8 +159,6 @@ void __init arch_mm_preinit(void)\n \tcpumask_set_cpu(0, mm_cpumask(&init_mm));\n \n \tpv_init();\n-\n-\tsetup_zero_pages();\t/* Setup zeroed pages. */\n }\n \n unsigned long memory_block_size_bytes(void)\ndiff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h\nindex 615f460c50af..74ede706fb32 100644\n--- a/arch/sparc/include/asm/pgtable_64.h\n+++ b/arch/sparc/include/asm/pgtable_64.h\n@@ -210,9 +210,6 @@ extern unsigned long _PAGE_CACHE;\n extern unsigned long pg_iobits;\n extern unsigned long _PAGE_ALL_SZ_BITS;\n \n-extern struct page *mem_map_zero;\n-#define ZERO_PAGE(vaddr)\t(mem_map_zero)\n-\n /* PFNs are real physical page numbers. However, mem_map only begins to record\n * per-page information starting at pfn_base. This is to handle systems where\n * the first physical page in the machine is at some huge physical address,\ndiff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c\nindex 0cc8de2fea90..707c1df67d79 100644\n--- a/arch/sparc/mm/init_64.c\n+++ b/arch/sparc/mm/init_64.c\n@@ -177,9 +177,6 @@ extern unsigned long sparc_ramdisk_image64;\n extern unsigned int sparc_ramdisk_image;\n extern unsigned int sparc_ramdisk_size;\n \n-struct page *mem_map_zero __read_mostly;\n-EXPORT_SYMBOL(mem_map_zero);\n-\n unsigned int sparc64_highest_unlocked_tlb_ent __read_mostly;\n \n unsigned long sparc64_kern_pri_context __read_mostly;\n@@ -2496,11 +2493,17 @@ static void __init register_page_bootmem_info(void)\n \t\t\tregister_page_bootmem_info_node(NODE_DATA(i));\n #endif\n }\n-void __init mem_init(void)\n+\n+void __init arch_setup_zero_pages(void)\n {\n \tphys_addr_t zero_page_pa = kern_base +\n \t\t((unsigned long)&empty_zero_page[0] - KERNBASE);\n \n+\t__zero_page = phys_to_page(zero_page_pa);\n+}\n+\n+void __init mem_init(void)\n+{\n \t/*\n \t * Must be done after boot memory is put on freelist, because here we\n \t * might set fields in deferred struct pages that have not yet been\n@@ -2509,12 +2512,6 @@ void __init mem_init(void)\n \t */\n \tregister_page_bootmem_info();\n \n-\t/*\n-\t * Set up the zero page, mark it reserved, so that page count\n-\t * is not manipulated when freeing the page from user ptes.\n-\t */\n-\tmem_map_zero = pfn_to_page(PHYS_PFN(zero_page_pa));\n-\n \tif (tlb_type == cheetah || tlb_type == cheetah_plus)\n \t\tcheetah_ecache_flush_init();\n }\ndiff --git a/include/linux/pgtable.h b/include/linux/pgtable.h\nindex 3d48eea57cd2..1da21ec62836 100644\n--- a/include/linux/pgtable.h\n+++ b/include/linux/pgtable.h\n@@ -1894,6 +1894,8 @@ static inline void pfnmap_setup_cachemode_pfn(unsigned long pfn, pgprot_t *prot)\n * For architectures that don't __HAVE_COLOR_ZERO_PAGE the zero page lives in\n * empty_zero_page in BSS.\n */\n+void arch_setup_zero_pages(void);\n+\n #ifdef __HAVE_COLOR_ZERO_PAGE\n static inline int is_zero_pfn(unsigned long pfn)\n {\n@@ -1921,10 +1923,13 @@ static inline unsigned long zero_pfn(unsigned long addr)\n }\n \n extern uint8_t empty_zero_page[PAGE_SIZE];\n+extern struct page *__zero_page;\n \n-#ifndef ZERO_PAGE\n-#define ZERO_PAGE(vaddr) ((void)(vaddr),virt_to_page(empty_zero_page))\n-#endif\n+static inline struct page *_zero_page(unsigned long addr)\n+{\n+\treturn __zero_page;\n+}\n+#define ZERO_PAGE(vaddr) _zero_page(vaddr)\n \n #endif /* __HAVE_COLOR_ZERO_PAGE */\n \ndiff --git a/mm/mm_init.c b/mm/mm_init.c\nindex 1eac634ece1a..b08608c1b71d 100644\n--- a/mm/mm_init.c\n+++ b/mm/mm_init.c\n@@ -59,7 +59,10 @@ EXPORT_SYMBOL(zero_page_pfn);\n #ifndef __HAVE_COLOR_ZERO_PAGE\n uint8_t empty_zero_page[PAGE_SIZE] __page_aligned_bss;\n EXPORT_SYMBOL(empty_zero_page);\n-#endif\n+\n+struct page *__zero_page __ro_after_init;\n+EXPORT_SYMBOL(__zero_page);\n+#endif /* __HAVE_COLOR_ZERO_PAGE */\n \n #ifdef CONFIG_DEBUG_MEMORY_INIT\n int __meminitdata mminit_loglevel;\n@@ -2675,12 +2678,21 @@ static void __init mem_init_print_info(void)\n \t\t);\n }\n \n-static int __init init_zero_page_pfn(void)\n+#ifndef __HAVE_COLOR_ZERO_PAGE\n+/*\n+ * architectures that __HAVE_COLOR_ZERO_PAGE must define this function\n+ */\n+void __init __weak arch_setup_zero_pages(void)\n+{\n+\t__zero_page = virt_to_page(empty_zero_page);\n+}\n+#endif\n+\n+static void __init init_zero_page_pfn(void)\n {\n+\tarch_setup_zero_pages();\n \tzero_page_pfn = page_to_pfn(ZERO_PAGE(0));\n-\treturn 0;\n }\n-early_initcall(init_zero_page_pfn);\n \n void __init __weak arch_mm_preinit(void)\n {\n@@ -2704,6 +2716,7 @@ void __init mm_core_init_early(void)\n void __init mm_core_init(void)\n {\n \tarch_mm_preinit();\n+\tinit_zero_page_pfn();\n \n \t/* Initializations relying on SMP setup */\n \tBUILD_BUG_ON(MAX_ZONELISTS > 2);\n", "prefixes": [ "v3", "4/4" ] }