get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2195541/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2195541,
    "url": "http://patchwork.ozlabs.org/api/patches/2195541/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-arc/patch/20260211103141.3215197-5-rppt@kernel.org/",
    "project": {
        "id": 48,
        "url": "http://patchwork.ozlabs.org/api/projects/48/?format=api",
        "name": "Linux ARC development",
        "link_name": "linux-arc",
        "list_id": "linux-snps-arc.lists.infradead.org",
        "list_email": "linux-snps-arc@lists.infradead.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260211103141.3215197-5-rppt@kernel.org>",
    "list_archive_url": null,
    "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/linux-arc/patch/20260211103141.3215197-5-rppt@kernel.org/mbox/",
    "series": [
        {
            "id": 491813,
            "url": "http://patchwork.ozlabs.org/api/series/491813/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-arc/list/?series=491813",
            "date": "2026-02-11T10:31:37",
            "name": "arch, mm: consolidate empty_zero_page",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/491813/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2195541/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2195541/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linux-snps-arc-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=F2qRJw6A;\n\tdkim=fail reason=\"signature verification failed\" (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=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=linux-snps-arc-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f9vs33Tbgz1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 11 Feb 2026 21:32:55 +1100 (AEDT)",
            "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1vq7Wg-00000000VmG-1Ctg;\n\tWed, 11 Feb 2026 10:32:54 +0000",
            "from sea.source.kernel.org ([172.234.252.31])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1vq7Wd-00000000Vkj-0Zxg;\n\tWed, 11 Feb 2026 10:32:52 +0000",
            "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)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=Bp52+fl0R2eIsbqJ99P/TFVGRX6/27DdQqn95xwns4k=; b=F2qRJw6AKMw2lM\n\txzK4LuoD1QULpTK4IBvvM0S4Y+zwsoQTan4SbF+U189W3iI5/dtF7yVxhZNiGkDxH8oHFjeFozQs2\n\twLK9EeiKdmV8SNybq2I6bvd3ObWCNx0lrAokpaDZM25RpTr1f/UCnrCi0GJKx03mjLmLfrmnig3yp\n\t36ygXgbVFl7VRQCUsL2M838a7K06gctAL4bRgv57ssNKbeyDb+xa5asmhAdoYCxi4kncrJ7pEJIob\n\tAv6DlbaYwiBCRtjS4bPBGvV5tIL9PhjDDTxp4cJq+k8mY2o1X2FrijiCacPauUNtu9wRMcrtkLJmZ\n\tXku5VCPOAdb5PZYX72zg==;",
            "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>",
        "MIME-Version": "1.0",
        "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ",
        "X-CRM114-CacheID": "sfid-20260211_023251_227759_BA1C43F0 ",
        "X-CRM114-Status": "GOOD (  22.68  )",
        "X-Spam-Score": "-2.1 (--)",
        "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  From: \"Mike Rapoport (Microsoft)\" <rppt@kernel.org> For\n most\n    architectures every invocation of ZERO_PAGE() does\n virt_to_page(empty_zero_page).\n    But empty_zero_page is in BSS and it is enough to get its struct page once\n    at initialization time and then us [...]\n Content analysis details:   (-2.1 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\n -0.0 SPF_PASS               SPF: sender matches SPF record\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]\n  0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The\n                             query to Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                         [172.234.252.31 listed in\n sa-trusted.bondedsender.org]\n  0.0 RCVD_IN_VALIDITY_SAFE_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                             [172.234.252.31 listed in sa-accredit.habeas.com]\n  0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n                              Validity was blocked.  See\n                             https://knowledge.validity.com/hc/en-us/articles/20961730681243\n                              for more information.\n                            [172.234.252.31 listed in\n bl.score.senderscore.com]\n -0.0 DKIMWL_WL_HIGH         DKIMwl.org - High trust sender",
        "X-BeenThere": "linux-snps-arc@lists.infradead.org",
        "X-Mailman-Version": "2.1.34",
        "Precedence": "list",
        "List-Id": "Linux on Synopsys ARC Processors <linux-snps-arc.lists.infradead.org>",
        "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/linux-snps-arc>,\n <mailto:linux-snps-arc-request@lists.infradead.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.infradead.org/pipermail/linux-snps-arc/>",
        "List-Post": "<mailto:linux-snps-arc@lists.infradead.org>",
        "List-Help": "<mailto:linux-snps-arc-request@lists.infradead.org?subject=help>",
        "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/linux-snps-arc>,\n <mailto:linux-snps-arc-request@lists.infradead.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "\"linux-snps-arc\" <linux-snps-arc-bounces@lists.infradead.org>",
        "Errors-To": "\n linux-snps-arc-bounces+incoming=patchwork.ozlabs.org@lists.infradead.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"
    ]
}