get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2195548,
    "url": "http://patchwork.ozlabs.org/api/patches/2195548/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/sparclinux/patch/20260211103141.3215197-4-rppt@kernel.org/",
    "project": {
        "id": 10,
        "url": "http://patchwork.ozlabs.org/api/projects/10/?format=api",
        "name": "Linux SPARC Development ",
        "link_name": "sparclinux",
        "list_id": "sparclinux.vger.kernel.org",
        "list_email": "sparclinux@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260211103141.3215197-4-rppt@kernel.org>",
    "list_archive_url": null,
    "date": "2026-02-11T10:31:40",
    "name": "[v3,3/4] arch, mm: consolidate empty_zero_page",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a40505955dbe8190d6b00444514d8067335c5cc6",
    "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/sparclinux/patch/20260211103141.3215197-4-rppt@kernel.org/mbox/",
    "series": [
        {
            "id": 491817,
            "url": "http://patchwork.ozlabs.org/api/series/491817/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/sparclinux/list/?series=491817",
            "date": "2026-02-11T10:31:37",
            "name": "arch, mm: consolidate empty_zero_page",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/491817/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2195548/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2195548/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <SRS0=284D=AP=vger.kernel.org=sparclinux+bounces-6261-patchwork-incoming=ozlabs.org@ozlabs.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "sparclinux@vger.kernel.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "patchwork-incoming@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=jXOVE9GB;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=2404:9400:2221:ea00::3; helo=mail.ozlabs.org;\n envelope-from=srs0=284d=ap=vger.kernel.org=sparclinux+bounces-6261-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=172.234.253.10 arc.chain=subspace.kernel.org",
            "gandalf.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org",
            "gandalf.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=jXOVE9GB;\n\tdkim-atps=neutral",
            "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=sparclinux+bounces-6261-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"jXOVE9GB\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"
        ],
        "Received": [
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\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 4f9vxT057vz1xtV\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 11 Feb 2026 21:36:45 +1100 (AEDT)",
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4f9vxS6gGqz4w0p\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 11 Feb 2026 21:36:44 +1100 (AEDT)",
            "by gandalf.ozlabs.org (Postfix)\n\tid 4f9vxS6Vhlz4wB9; Wed, 11 Feb 2026 21:36:44 +1100 (AEDT)",
            "from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\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 gandalf.ozlabs.org (Postfix) with ESMTPS id 4f9vxP1WBfz4w0p\n\tfor <patchwork-incoming@ozlabs.org>; Wed, 11 Feb 2026 21:36:41 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 50FFF308E34B\n\tfor <patchwork-incoming@ozlabs.org>; Wed, 11 Feb 2026 10:32:40 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 163FF368275;\n\tWed, 11 Feb 2026 10:32:39 +0000 (UTC)",
            "from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id E186B312821;\n\tWed, 11 Feb 2026 10:32:38 +0000 (UTC)",
            "by smtp.kernel.org (Postfix) with ESMTPSA id CA064C19425;\n\tWed, 11 Feb 2026 10:32:26 +0000 (UTC)"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1770806204; cv=pass;\n\tb=KwpBwzm84Puz/8vV6cHIyUPkgCwmwsHSBc/Sgbv6d09w3xEnisYxnxZQnBs1m9xdRnFHj7p0R2Oe9ayfObBgQ78jnbCeiPPECVZnXPDnc6KvDXrSf+Hq3wkZagFNXQ943BazOncPTJtq6ExrRMftzHtF0C4fsWyl3TQxO1s7fDAEfpkTwAowAKepZ0DKWAAKATmXEr2utJLW/T4eVrPMaIYFo3PHFNato3GVOvM3hslnoSVilvYj2VxP+3ji4dInjL6EEAgn8d3EPfSTiXeAaqOxbyGfUSOtkQi6LX54gVKVAUxfAVduHlaNSl2fvpjlOV9TCpdIzUsc1TDA5nsFyA==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1770805959; cv=none;\n b=V41ZzNVIOGZTjl8FZEAyPpG2+U709eBg64I9yGniVloB9LDitaJLNxHi09XxUM2XBX8CJGEgggvfMnRzoWMhM3lQI85GJAC+MdlLMWJO8DWHBZXYU/VbVPnTNoMlHd55CfOo8v67IKbc94uphWzLxWKJe/H5GFIOiTDYBveBFwc="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1770806204; c=relaxed/relaxed;\n\tbh=ZNRIuNnuJIHx+PuNYt6jV2q6lzSwgvSaM5Wegd5eVI4=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=vaktRVJQXXXsW27m1ljdw778O8Ld6CsxBDyRQaA6+fimLtTvteUje2p+8fLhC2Zcr5CywvZC8jdiYOYvi7wltt004BHbg22TrnK+t5Fei6fYHWQKCQZfWA5CcUXXQX0O4b74nHe7C4VWNcRgz51IZct5RlfCPwIvxtbS/BzVomWz+FX/xaTmlw6uOPDoj54PZXBVMBshzFsH8n9sDKg7+xXGjy17F/xSuj99WD0Po9lcIvuD8SptzatFZlH35bZxoUqU+rA22jZ4lo8RPDGpJw4fqk26XGr3hYxKoiI8ks+4oWq3Dv1u8abYCOAXsa7kTky1EJEm/z2MZJvTtStRfA==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1770805959; c=relaxed/simple;\n\tbh=AzWvtiZW/NTaQRE3H9cJU7E8VibIfbuHjR+3edgWOTc=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=i70io/Ti90vrweHPLY11Cw4HE2MtHuHAP0xJbsPmr7ixxVd4p66G1+BykCOsSzaE+AZIYqG2EaV3aeLGsd5NpduKBjXp9Usrt0W7wzmX53wCIjirfrWzTKTmS1f8a2GjVf/TzOXZ6c4RzYiY8qUVCj0E+NrnkxpMRMMoNnRyOPg="
        ],
        "ARC-Authentication-Results": [
            "i=2; gandalf.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=jXOVE9GB; dkim-atps=neutral;\n spf=pass (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=sparclinux+bounces-6261-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org",
            "i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=jXOVE9GB; arc=none smtp.client-ip=10.30.226.201"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1770805958;\n\tbh=AzWvtiZW/NTaQRE3H9cJU7E8VibIfbuHjR+3edgWOTc=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=jXOVE9GBj1aXSdY9y1ncjKyijhgIv8hZhKuzOEFYOUVXdWNIslLznqVjb4tNs14nR\n\t hJweSG9yWCgFGDlHRO5bwEUPahcnBI2cQ06Etk+AKDLE7TDBZg+JOyd9Pm5Snt4cpU\n\t TtrHkHxvgnMrKgfz9oXDbL2jSKtnIPbNA9Znnn+pTQXxqmRY/meTA3p+Lv+AXSsPA0\n\t FErBR5gDrPoeppZonYnWbA9bTpFMV2y5eLCZlpU4mg4jMDHJhoHm4ZfNoQB6Rfckqz\n\t HLlfbwVJWMGjXLtYVrtRDQifi+Qn/ngV+K8la3wWU0QDzYtaQCEZsLhbdzcfVyVwa/\n\t UFhu/st7UL+Gw==",
        "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 3/4] arch, mm: consolidate empty_zero_page",
        "Date": "Wed, 11 Feb 2026 12:31:40 +0200",
        "Message-ID": "<20260211103141.3215197-4-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>",
        "Precedence": "bulk",
        "X-Mailing-List": "sparclinux@vger.kernel.org",
        "List-Id": "<sparclinux.vger.kernel.org>",
        "List-Subscribe": "<mailto:sparclinux+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:sparclinux+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Spam-Status": "No, score=-1.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,\n\tMAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"
    },
    "content": "From: \"Mike Rapoport (Microsoft)\" <rppt@kernel.org>\n\nReduce 22 declarations of empty_zero_page to 3 and 23 declarations of\nZERO_PAGE() to 4.\n\nEvery architecture defines empty_zero_page that way or another, but for the\nmost of them it is always a page aligned page in BSS and most definitions\nof ZERO_PAGE do virt_to_page(empty_zero_page).\n\nMove Linus vetted x86 definition of empty_zero_page and ZERO_PAGE() to the\ncore MM and drop these definitions in architectures that do not implement\ncolored zero page (MIPS and s390).\n\nZERO_PAGE() remains a macro because turning it to a wrapper for a static\ninline causes severe pain in header dependencies.\n\nFor the most part the change is mechanical, with these being noteworthy:\n\n* alpha: aliased empty_zero_page with ZERO_PGE that was also used for boot\n  parameters. Switching to a generic empty_zero_page removes the aliasing\n  and keeps ZERO_PGE for boot parameters only\n* arm64: uses __pa_symbol() in ZERO_PAGE() so that definition of\n  ZERO_PAGE() is kept intact.\n* m68k/parisc/um: allocated empty_zero_page from memblock,\n  although they do not support zero page coloring and having it in BSS\n  will work fine.\n* sparc64 can have empty_zero_page in BSS rather allocate it, but it\n  can't use virt_to_page() for BSS. Keep it's definition of ZERO_PAGE()\n  but instead of allocating it, make mem_map_zero point to\n  empty_zero_page.\n* sh: used empty_zero_page for boot parameters at the very early boot.\n  Rename the parameters page to boot_params_page and let sh use the generic\n  empty_zero_page.\n* hexagon: had an amusing comment about empty_zero_page\n\n\t/* A handy thing to have if one has the RAM. Declared in head.S */\n\n  that unfortunately had to go :)\n\nAcked-by: Helge Deller <deller@gmx.de>   # parisc\nTested-by: Helge Deller <deller@gmx.de>  # parisc\nReviewed-by: Christophe Leroy (CS GROUP) <chleroy@kernel.org>\nAcked-by: Dave Hansen <dave.hansen@linux.intel.com>\nAcked-by: Catalin Marinas <catalin.marinas@arm.com>\nSigned-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>\n---\n arch/alpha/include/asm/pgtable.h          |  6 ------\n arch/arc/include/asm/pgtable.h            |  3 ---\n arch/arc/mm/init.c                        |  2 --\n arch/arm/include/asm/pgtable.h            |  9 ---------\n arch/arm/mm/mmu.c                         |  7 -------\n arch/arm/mm/nommu.c                       |  7 -------\n arch/arm64/include/asm/pgtable.h          |  1 -\n arch/arm64/mm/mmu.c                       |  7 -------\n arch/csky/include/asm/pgtable.h           |  3 ---\n arch/csky/mm/init.c                       |  3 ---\n arch/hexagon/include/asm/pgtable.h        |  6 ------\n arch/hexagon/kernel/head.S                |  5 -----\n arch/hexagon/kernel/hexagon_ksyms.c       |  1 -\n arch/loongarch/include/asm/pgtable.h      |  9 ---------\n arch/loongarch/mm/init.c                  |  3 ---\n arch/m68k/include/asm/pgtable_mm.h        |  9 ---------\n arch/m68k/include/asm/pgtable_no.h        |  7 -------\n arch/m68k/mm/init.c                       |  9 ---------\n arch/m68k/mm/mcfmmu.c                     |  2 --\n arch/m68k/mm/motorola.c                   |  6 ------\n arch/m68k/mm/sun3mmu.c                    |  2 --\n arch/microblaze/include/asm/pgtable.h     | 10 ----------\n arch/microblaze/kernel/head.S             |  4 ----\n arch/microblaze/kernel/microblaze_ksyms.c |  2 --\n arch/nios2/include/asm/pgtable.h          |  7 -------\n arch/nios2/kernel/head.S                  | 10 ----------\n arch/nios2/kernel/nios2_ksyms.c           |  1 -\n arch/openrisc/include/asm/pgtable.h       |  4 ----\n arch/openrisc/kernel/head.S               |  3 ---\n arch/openrisc/kernel/or32_ksyms.c         |  1 -\n arch/openrisc/mm/init.c                   |  3 ---\n arch/parisc/include/asm/pgtable.h         | 11 -----------\n arch/parisc/mm/init.c                     |  6 ------\n arch/powerpc/include/asm/pgtable.h        |  6 ------\n arch/powerpc/mm/mem.c                     |  3 ---\n arch/riscv/include/asm/pgtable.h          |  7 -------\n arch/riscv/mm/init.c                      |  4 ----\n arch/sh/include/asm/pgtable.h             |  8 --------\n arch/sh/include/asm/setup.h               |  3 ++-\n arch/sh/kernel/head_32.S                  |  4 ++--\n arch/sh/kernel/sh_ksyms_32.c              |  1 -\n arch/sh/mm/init.c                         |  1 -\n arch/sparc/include/asm/pgtable_32.h       |  8 --------\n arch/sparc/include/asm/setup.h            |  2 --\n arch/sparc/kernel/head_32.S               |  7 -------\n arch/sparc/mm/init_32.c                   |  4 ----\n arch/sparc/mm/init_64.c                   | 11 ++++-------\n arch/um/include/asm/pgtable.h             |  9 ---------\n arch/um/include/shared/kern_util.h        |  1 -\n arch/um/kernel/mem.c                      | 16 ----------------\n arch/um/kernel/um_arch.c                  |  1 -\n arch/x86/include/asm/pgtable.h            |  8 --------\n arch/x86/kernel/head_32.S                 |  4 ----\n arch/x86/kernel/head_64.S                 |  7 -------\n arch/xtensa/include/asm/pgtable.h         |  4 ----\n arch/xtensa/kernel/head.S                 |  3 ---\n arch/xtensa/kernel/xtensa_ksyms.c         |  2 --\n include/linux/pgtable.h                   | 10 ++++++++++\n mm/mm_init.c                              |  5 +++++\n 59 files changed, 23 insertions(+), 285 deletions(-)",
    "diff": "diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h\nindex 90e7a9539102..12a3c5f8ece8 100644\n--- a/arch/alpha/include/asm/pgtable.h\n+++ b/arch/alpha/include/asm/pgtable.h\n@@ -125,12 +125,6 @@ struct vm_area_struct;\n  */\n #define pgprot_noncached(prot)\t(prot)\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)\t(virt_to_page(ZERO_PGE))\n-\n /*\n  * On certain platforms whose physical address space can overlap KSEG,\n  * namely EV6 and above, we must re-twiddle the physaddr to restore the\ndiff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h\nindex bd580e2b62d7..0fdaea81b5fa 100644\n--- a/arch/arc/include/asm/pgtable.h\n+++ b/arch/arc/include/asm/pgtable.h\n@@ -21,9 +21,6 @@\n \n #ifndef __ASSEMBLER__\n \n-extern char empty_zero_page[PAGE_SIZE];\n-#define ZERO_PAGE(vaddr)\t(virt_to_page(empty_zero_page))\n-\n extern pgd_t swapper_pg_dir[] __aligned(PAGE_SIZE);\n \n /* to cope with aliasing VIPT cache */\ndiff --git a/arch/arc/mm/init.c b/arch/arc/mm/init.c\nindex a5e92f46e5d1..d6b5c27a0098 100644\n--- a/arch/arc/mm/init.c\n+++ b/arch/arc/mm/init.c\n@@ -19,8 +19,6 @@\n #include <asm/arcregs.h>\n \n pgd_t swapper_pg_dir[PTRS_PER_PGD] __aligned(PAGE_SIZE);\n-char empty_zero_page[PAGE_SIZE] __aligned(PAGE_SIZE);\n-EXPORT_SYMBOL(empty_zero_page);\n \n static const unsigned long low_mem_start = CONFIG_LINUX_RAM_BASE;\n static unsigned long low_mem_sz;\ndiff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h\nindex 6fa9acd6a7f5..982795cf4563 100644\n--- a/arch/arm/include/asm/pgtable.h\n+++ b/arch/arm/include/asm/pgtable.h\n@@ -10,15 +10,6 @@\n #include <linux/const.h>\n #include <asm/proc-fns.h>\n \n-#ifndef __ASSEMBLY__\n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-#define ZERO_PAGE(vaddr)\t(virt_to_page(empty_zero_page))\n-#endif\n-\n #include <asm-generic/pgtable-nopud.h>\n \n #ifndef CONFIG_MMU\ndiff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c\nindex 518def8314e7..23b87b5ef7f1 100644\n--- a/arch/arm/mm/mmu.c\n+++ b/arch/arm/mm/mmu.c\n@@ -41,13 +41,6 @@\n \n extern unsigned long __atags_pointer;\n \n-/*\n- * empty_zero_page is a special page that is used for\n- * zero-initialized data and COW.\n- */\n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n /*\n  * The pmd table for the upper-most set of pages.\n  */\ndiff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c\nindex 7e42d8accec6..040ea43cce32 100644\n--- a/arch/arm/mm/nommu.c\n+++ b/arch/arm/mm/nommu.c\n@@ -27,13 +27,6 @@\n \n unsigned long vectors_base;\n \n-/*\n- * empty_zero_page is a special page that is used for\n- * zero-initialized data and COW.\n- */\n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n #ifdef CONFIG_ARM_MPU\n struct mpu_rgn_info mpu_rgn_info;\n #endif\ndiff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h\nindex d94445b4f3df..63da07398a30 100644\n--- a/arch/arm64/include/asm/pgtable.h\n+++ b/arch/arm64/include/asm/pgtable.h\n@@ -110,7 +110,6 @@ static inline void arch_leave_lazy_mmu_mode(void)\n  * ZERO_PAGE is a global shared page that is always zero: used\n  * for zero-mapped memory areas etc..\n  */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n #define ZERO_PAGE(vaddr)\tphys_to_page(__pa_symbol(empty_zero_page))\n \n #define pte_ERROR(e)\t\\\ndiff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c\nindex a6a00accf4f9..0f6a171faf1f 100644\n--- a/arch/arm64/mm/mmu.c\n+++ b/arch/arm64/mm/mmu.c\n@@ -64,13 +64,6 @@ static bool rodata_is_rw __ro_after_init = true;\n  */\n long __section(\".mmuoff.data.write\") __early_cpu_boot_status;\n \n-/*\n- * Empty_zero_page is a special page that is used for zero-initialized data\n- * and COW.\n- */\n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n static DEFINE_SPINLOCK(swapper_pgdir_lock);\n static DEFINE_MUTEX(fixmap_lock);\n \ndiff --git a/arch/csky/include/asm/pgtable.h b/arch/csky/include/asm/pgtable.h\nindex d606afbabce1..bafcd5823531 100644\n--- a/arch/csky/include/asm/pgtable.h\n+++ b/arch/csky/include/asm/pgtable.h\n@@ -76,9 +76,6 @@\n #define MAX_SWAPFILES_CHECK() \\\n \t\tBUILD_BUG_ON(MAX_SWAPFILES_SHIFT != 5)\n \n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-#define ZERO_PAGE(vaddr)\t(virt_to_page(empty_zero_page))\n-\n extern void load_pgd(unsigned long pg_dir);\n extern pte_t invalid_pte_table[PTRS_PER_PTE];\n \ndiff --git a/arch/csky/mm/init.c b/arch/csky/mm/init.c\nindex 573da66b2543..fa16015ea1c0 100644\n--- a/arch/csky/mm/init.c\n+++ b/arch/csky/mm/init.c\n@@ -38,9 +38,6 @@ pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned_bss;\n pte_t kernel_pte_tables[PTRS_KERN_TABLE] __page_aligned_bss;\n \n EXPORT_SYMBOL(invalid_pte_table);\n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]\n-\t\t\t\t\t\t__page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n \n void free_initmem(void)\n {\ndiff --git a/arch/hexagon/include/asm/pgtable.h b/arch/hexagon/include/asm/pgtable.h\nindex fbf24d1d1ca6..27b269e2870d 100644\n--- a/arch/hexagon/include/asm/pgtable.h\n+++ b/arch/hexagon/include/asm/pgtable.h\n@@ -14,9 +14,6 @@\n #include <asm/page.h>\n #include <asm-generic/pgtable-nopmd.h>\n \n-/* A handy thing to have if one has the RAM. Declared in head.S */\n-extern unsigned long empty_zero_page;\n-\n /*\n  * The PTE model described here is that of the Hexagon Virtual Machine,\n  * which autonomously walks 2-level page tables.  At a lower level, we\n@@ -348,9 +345,6 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)\n \treturn (unsigned long)__va(pmd_val(pmd) & PAGE_MASK);\n }\n \n-/* ZERO_PAGE - returns the globally shared zero page */\n-#define ZERO_PAGE(vaddr) (virt_to_page(&empty_zero_page))\n-\n /*\n  * Encode/decode swap entries and swap PTEs. Swap PTEs are all PTEs that\n  * are !pte_none() && !pte_present().\ndiff --git a/arch/hexagon/kernel/head.S b/arch/hexagon/kernel/head.S\nindex 0b016308cc79..908ffece9132 100644\n--- a/arch/hexagon/kernel/head.S\n+++ b/arch/hexagon/kernel/head.S\n@@ -216,8 +216,3 @@ __head_s_vaddr_target:\n .p2align PAGE_SHIFT\n ENTRY(external_cmdline_buffer)\n         .fill _PAGE_SIZE,1,0\n-\n-.data\n-.p2align PAGE_SHIFT\n-ENTRY(empty_zero_page)\n-        .fill _PAGE_SIZE,1,0\ndiff --git a/arch/hexagon/kernel/hexagon_ksyms.c b/arch/hexagon/kernel/hexagon_ksyms.c\nindex 36a80e31d187..81bc6f81e200 100644\n--- a/arch/hexagon/kernel/hexagon_ksyms.c\n+++ b/arch/hexagon/kernel/hexagon_ksyms.c\n@@ -17,7 +17,6 @@ EXPORT_SYMBOL(raw_copy_to_user);\n EXPORT_SYMBOL(__vmgetie);\n EXPORT_SYMBOL(__vmsetie);\n EXPORT_SYMBOL(__vmyield);\n-EXPORT_SYMBOL(empty_zero_page);\n EXPORT_SYMBOL(memcpy);\n EXPORT_SYMBOL(memset);\n \ndiff --git a/arch/loongarch/include/asm/pgtable.h b/arch/loongarch/include/asm/pgtable.h\nindex c33b3bcb733e..a244de27a03e 100644\n--- a/arch/loongarch/include/asm/pgtable.h\n+++ b/arch/loongarch/include/asm/pgtable.h\n@@ -74,15 +74,6 @@\n struct mm_struct;\n struct vm_area_struct;\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero; used\n- * for zero-mapped memory areas etc..\n- */\n-\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-\n-#define ZERO_PAGE(vaddr)\tvirt_to_page(empty_zero_page)\n-\n #ifdef CONFIG_32BIT\n \n #define VMALLOC_START\t(vm_map_base + PCI_IOSIZE + (2 * PAGE_SIZE))\ndiff --git a/arch/loongarch/mm/init.c b/arch/loongarch/mm/init.c\nindex c331bf69d2ec..00f3822b6e47 100644\n--- a/arch/loongarch/mm/init.c\n+++ b/arch/loongarch/mm/init.c\n@@ -36,9 +36,6 @@\n #include <asm/pgalloc.h>\n #include <asm/tlb.h>\n \n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n void copy_user_highpage(struct page *to, struct page *from,\n \tunsigned long vaddr, struct vm_area_struct *vma)\n {\ndiff --git a/arch/m68k/include/asm/pgtable_mm.h b/arch/m68k/include/asm/pgtable_mm.h\nindex bba64a9c49ac..7501ff030c63 100644\n--- a/arch/m68k/include/asm/pgtable_mm.h\n+++ b/arch/m68k/include/asm/pgtable_mm.h\n@@ -110,15 +110,6 @@ extern unsigned long m68k_vmalloc_end;\n #define VMALLOC_END KMAP_START\n #endif\n \n-/* zero page used for uninitialized stuff */\n-extern void *empty_zero_page;\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)\t(virt_to_page(empty_zero_page))\n-\n extern void kernel_set_cachemode(void *addr, unsigned long size, int cmode);\n \n /*\ndiff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h\nindex 1a86c15b9008..11751807a3f3 100644\n--- a/arch/m68k/include/asm/pgtable_no.h\n+++ b/arch/m68k/include/asm/pgtable_no.h\n@@ -30,13 +30,6 @@\n \n #define swapper_pg_dir ((pgd_t *) 0)\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern void *empty_zero_page;\n-#define ZERO_PAGE(vaddr)\t(virt_to_page(empty_zero_page))\n-\n /*\n  * All 32bit addresses are effectively valid for vmalloc...\n  * Sort of meaningless for non-VM targets.\ndiff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c\nindex 53b71f786c27..3b88c0dd1616 100644\n--- a/arch/m68k/mm/init.c\n+++ b/arch/m68k/mm/init.c\n@@ -33,13 +33,6 @@\n #include <asm/sections.h>\n #include <asm/tlb.h>\n \n-/*\n- * ZERO_PAGE is a special page that is used for zero-initialized\n- * data and COW.\n- */\n-void *empty_zero_page;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n void __init arch_zone_limits_init(unsigned long *max_zone_pfns)\n {\n \tmax_zone_pfns[ZONE_DMA] = PFN_DOWN(memblock_end_of_DRAM());\n@@ -71,8 +64,6 @@ void __init paging_init(void)\n \tunsigned long end_mem = memory_end & PAGE_MASK;\n \n \thigh_memory = (void *) end_mem;\n-\n-\tempty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);\n }\n \n #endif /* CONFIG_MMU */\ndiff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c\nindex 3418fd864237..4924f2ff8ef8 100644\n--- a/arch/m68k/mm/mcfmmu.c\n+++ b/arch/m68k/mm/mcfmmu.c\n@@ -41,8 +41,6 @@ void __init paging_init(void)\n \tunsigned long next_pgtable;\n \tint i;\n \n-\tempty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);\n-\n \tpg_dir = swapper_pg_dir;\n \tmemset(swapper_pg_dir, 0, sizeof(swapper_pg_dir));\n \ndiff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c\nindex 127a3fa69f4c..b30aa69a73a6 100644\n--- a/arch/m68k/mm/motorola.c\n+++ b/arch/m68k/mm/motorola.c\n@@ -498,12 +498,6 @@ void __init paging_init(void)\n \n \tearly_memtest(min_addr, max_addr);\n \n-\t/*\n-\t * initialize the bad page table and bad page to point\n-\t * to a couple of allocated pages\n-\t */\n-\tempty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);\n-\n \t/*\n \t * Set up SFC/DFC registers\n \t */\ndiff --git a/arch/m68k/mm/sun3mmu.c b/arch/m68k/mm/sun3mmu.c\nindex c801677f7df8..f139cc15753a 100644\n--- a/arch/m68k/mm/sun3mmu.c\n+++ b/arch/m68k/mm/sun3mmu.c\n@@ -43,8 +43,6 @@ void __init paging_init(void)\n \tunsigned long bootmem_end;\n \tunsigned long size;\n \n-\tempty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);\n-\n \taddress = PAGE_OFFSET;\n \tpg_dir = swapper_pg_dir;\n \tmemset (swapper_pg_dir, 0, sizeof (swapper_pg_dir));\ndiff --git a/arch/microblaze/include/asm/pgtable.h b/arch/microblaze/include/asm/pgtable.h\nindex 4eb76de6be4a..ea72291de553 100644\n--- a/arch/microblaze/include/asm/pgtable.h\n+++ b/arch/microblaze/include/asm/pgtable.h\n@@ -207,16 +207,6 @@ extern pte_t *va_to_pte(unsigned long address);\n  * Also, write permissions imply read permissions.\n  */\n \n-#ifndef __ASSEMBLER__\n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[1024];\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n-#endif /* __ASSEMBLER__ */\n-\n #define pte_none(pte)\t\t((pte_val(pte) & ~_PTE_NONE_MASK) == 0)\n #define pte_present(pte)\t(pte_val(pte) & _PAGE_PRESENT)\n #define pte_clear(mm, addr, ptep) \\\ndiff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S\nindex ec2fcb545e64..808019c3b7ac 100644\n--- a/arch/microblaze/kernel/head.S\n+++ b/arch/microblaze/kernel/head.S\n@@ -39,10 +39,6 @@\n #include <asm/processor.h>\n \n .section .data\n-.global empty_zero_page\n-.align 12\n-empty_zero_page:\n-\t.space\tPAGE_SIZE\n .global swapper_pg_dir\n swapper_pg_dir:\n \t.space\tPAGE_SIZE\ndiff --git a/arch/microblaze/kernel/microblaze_ksyms.c b/arch/microblaze/kernel/microblaze_ksyms.c\nindex a8553f54152b..ad7596d7ba07 100644\n--- a/arch/microblaze/kernel/microblaze_ksyms.c\n+++ b/arch/microblaze/kernel/microblaze_ksyms.c\n@@ -33,8 +33,6 @@ EXPORT_SYMBOL(memcpy);\n EXPORT_SYMBOL(memmove);\n #endif\n \n-EXPORT_SYMBOL(empty_zero_page);\n-\n EXPORT_SYMBOL(mbc);\n \n extern void __divsi3(void);\ndiff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h\nindex 844dce55569f..d389aa9ca57c 100644\n--- a/arch/nios2/include/asm/pgtable.h\n+++ b/arch/nios2/include/asm/pgtable.h\n@@ -65,13 +65,6 @@ struct mm_struct;\n #define PGDIR_SIZE\t(1UL << PGDIR_SHIFT)\n #define PGDIR_MASK\t(~(PGDIR_SIZE-1))\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-#define ZERO_PAGE(vaddr)\t(virt_to_page(empty_zero_page))\n-\n extern pgd_t swapper_pg_dir[PTRS_PER_PGD];\n extern pte_t invalid_pte_table[PAGE_SIZE/sizeof(pte_t)];\n \ndiff --git a/arch/nios2/kernel/head.S b/arch/nios2/kernel/head.S\nindex 372ce4a33018..613212e1a63a 100644\n--- a/arch/nios2/kernel/head.S\n+++ b/arch/nios2/kernel/head.S\n@@ -23,16 +23,6 @@\n #include <asm/asm-offsets.h>\n #include <asm/asm-macros.h>\n \n-/*\n- * ZERO_PAGE is a special page that is used for zero-initialized\n- * data and COW.\n- */\n-.data\n-.global empty_zero_page\n-.align 12\n-empty_zero_page:\n-\t.space\tPAGE_SIZE\n-\n /*\n  * This global variable is used as an extension to the nios'\n  * STATUS register to emulate a user/supervisor mode.\ndiff --git a/arch/nios2/kernel/nios2_ksyms.c b/arch/nios2/kernel/nios2_ksyms.c\nindex 54f7b23df1bf..c40aa39e8658 100644\n--- a/arch/nios2/kernel/nios2_ksyms.c\n+++ b/arch/nios2/kernel/nios2_ksyms.c\n@@ -20,7 +20,6 @@ EXPORT_SYMBOL(memmove);\n \n /* memory management */\n \n-EXPORT_SYMBOL(empty_zero_page);\n EXPORT_SYMBOL(flush_icache_range);\n \n /*\ndiff --git a/arch/openrisc/include/asm/pgtable.h b/arch/openrisc/include/asm/pgtable.h\nindex b218050e2f6d..6b89996d0b62 100644\n--- a/arch/openrisc/include/asm/pgtable.h\n+++ b/arch/openrisc/include/asm/pgtable.h\n@@ -179,10 +179,6 @@ extern void paging_init(void);\n \t__pgprot(_PAGE_ALL | _PAGE_SRE | _PAGE_SWE \\\n \t\t | _PAGE_SHARED | _PAGE_DIRTY | _PAGE_EXEC | _PAGE_CI)\n \n-/* zero page used for uninitialized stuff */\n-extern unsigned long empty_zero_page[2048];\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n #define pte_none(x)\t(!pte_val(x))\n #define pte_present(x)\t(pte_val(x) & _PAGE_PRESENT)\n #define pte_clear(mm, addr, xp)\tdo { pte_val(*(xp)) = 0; } while (0)\ndiff --git a/arch/openrisc/kernel/head.S b/arch/openrisc/kernel/head.S\nindex bd760066f1cd..45890393947d 100644\n--- a/arch/openrisc/kernel/head.S\n+++ b/arch/openrisc/kernel/head.S\n@@ -1563,9 +1563,6 @@ _string_nl:\n  */\n \t.section .data,\"aw\"\n \t.align\t8192\n-\t.global  empty_zero_page\n-empty_zero_page:\n-\t.space  8192\n \n \t.global  swapper_pg_dir\n swapper_pg_dir:\ndiff --git a/arch/openrisc/kernel/or32_ksyms.c b/arch/openrisc/kernel/or32_ksyms.c\nindex 212e5f85004c..84a937a64e2a 100644\n--- a/arch/openrisc/kernel/or32_ksyms.c\n+++ b/arch/openrisc/kernel/or32_ksyms.c\n@@ -40,7 +40,6 @@ DECLARE_EXPORT(__ashldi3);\n DECLARE_EXPORT(__lshrdi3);\n DECLARE_EXPORT(__ucmpdi2);\n \n-EXPORT_SYMBOL(empty_zero_page);\n EXPORT_SYMBOL(__copy_tofrom_user);\n EXPORT_SYMBOL(__clear_user);\n EXPORT_SYMBOL(memset);\ndiff --git a/arch/openrisc/mm/init.c b/arch/openrisc/mm/init.c\nindex 78fb0734cdbc..89d8c6df8855 100644\n--- a/arch/openrisc/mm/init.c\n+++ b/arch/openrisc/mm/init.c\n@@ -188,9 +188,6 @@ void __init mem_init(void)\n {\n \tBUG_ON(!mem_map);\n \n-\t/* clear the zero-page */\n-\tmemset((void *)empty_zero_page, 0, PAGE_SIZE);\n-\n \tprintk(\"mem_init_done ...........................................\\n\");\n \tmem_init_done = 1;\n \treturn;\ndiff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h\nindex 2c139a4dbf4b..cbdc01a26ea0 100644\n--- a/arch/parisc/include/asm/pgtable.h\n+++ b/arch/parisc/include/asm/pgtable.h\n@@ -262,17 +262,6 @@ extern pgd_t swapper_pg_dir[]; /* declared in init_task.c */\n \n extern pte_t pg0[];\n \n-/* zero page used for uninitialized stuff */\n-\n-extern unsigned long *empty_zero_page;\n-\n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n #define pte_none(x)     (pte_val(x) == 0)\n #define pte_present(x)\t(pte_val(x) & _PAGE_PRESENT)\n #define pte_user(x)\t(pte_val(x) & _PAGE_USER)\ndiff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c\nindex 6a39e031e5ff..be3380c9bcda 100644\n--- a/arch/parisc/mm/init.c\n+++ b/arch/parisc/mm/init.c\n@@ -604,9 +604,6 @@ void __init mem_init(void)\n #endif\n }\n \n-unsigned long *empty_zero_page __ro_after_init;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n /*\n  * pagetable_init() sets up the page tables\n  *\n@@ -639,9 +636,6 @@ static void __init pagetable_init(void)\n \t\t\t  initrd_end - initrd_start, PAGE_KERNEL, 0);\n \t}\n #endif\n-\n-\tempty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);\n-\n }\n \n static void __init gateway_init(void)\ndiff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h\nindex dcd3a88caaf6..b27d94c06d0e 100644\n--- a/arch/powerpc/include/asm/pgtable.h\n+++ b/arch/powerpc/include/asm/pgtable.h\n@@ -76,12 +76,6 @@ static inline const void *pmd_page_vaddr(pmd_t pmd)\n }\n #define pmd_page_vaddr pmd_page_vaddr\n #endif\n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[];\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n \n extern pgd_t swapper_pg_dir[];\n \ndiff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c\nindex 3789a51bdaae..85508392a6b6 100644\n--- a/arch/powerpc/mm/mem.c\n+++ b/arch/powerpc/mm/mem.c\n@@ -34,9 +34,6 @@\n \n unsigned long long memory_limit __initdata;\n \n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n pgprot_t __phys_mem_access_prot(unsigned long pfn, unsigned long size,\n \t\t\t\tpgprot_t vma_prot)\n {\ndiff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h\nindex 9ecbf0366719..a6b496f4944f 100644\n--- a/arch/riscv/include/asm/pgtable.h\n+++ b/arch/riscv/include/asm/pgtable.h\n@@ -1258,13 +1258,6 @@ extern u64 satp_mode;\n void paging_init(void);\n void misc_mem_init(void);\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero,\n- * used for zero-mapped memory areas, etc.\n- */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n /*\n  * Use set_p*_safe(), and elide TLB flushing, when confident that *no*\n  * TLB flush will be required as a result of the \"set\". For example, use\ndiff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c\nindex 848efeb9e163..95ac79c62067 100644\n--- a/arch/riscv/mm/init.c\n+++ b/arch/riscv/mm/init.c\n@@ -69,10 +69,6 @@ unsigned long vmemmap_start_pfn __ro_after_init;\n EXPORT_SYMBOL(vmemmap_start_pfn);\n #endif\n \n-unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]\n-\t\t\t\t\t\t\t__page_aligned_bss;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n extern char _start[];\n void *_dtb_early_va __initdata;\n uintptr_t _dtb_early_pa __initdata;\ndiff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h\nindex 10fa8f2bb8d1..d5ce0950a323 100644\n--- a/arch/sh/include/asm/pgtable.h\n+++ b/arch/sh/include/asm/pgtable.h\n@@ -20,14 +20,6 @@\n #ifndef __ASSEMBLER__\n #include <asm/addrspace.h>\n #include <asm/fixmap.h>\n-\n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n #endif /* !__ASSEMBLER__ */\n \n /*\ndiff --git a/arch/sh/include/asm/setup.h b/arch/sh/include/asm/setup.h\nindex 84bb23a771f3..63c9efc06348 100644\n--- a/arch/sh/include/asm/setup.h\n+++ b/arch/sh/include/asm/setup.h\n@@ -7,7 +7,8 @@\n /*\n  * This is set up by the setup-routine at boot-time\n  */\n-#define PARAM\t((unsigned char *)empty_zero_page)\n+extern unsigned char *boot_params_page;\n+#define PARAM boot_params_page\n \n #define MOUNT_ROOT_RDONLY (*(unsigned long *) (PARAM+0x000))\n #define RAMDISK_FLAGS (*(unsigned long *) (PARAM+0x004))\ndiff --git a/arch/sh/kernel/head_32.S b/arch/sh/kernel/head_32.S\nindex b603b7968b38..0b91bb85d40a 100644\n--- a/arch/sh/kernel/head_32.S\n+++ b/arch/sh/kernel/head_32.S\n@@ -26,7 +26,7 @@\n #endif\n \n \t.section\t.empty_zero_page, \"aw\"\n-ENTRY(empty_zero_page)\n+ENTRY(boot_params_page)\n \t.long\t1\t\t/* MOUNT_ROOT_RDONLY */\n \t.long\t0\t\t/* RAMDISK_FLAGS */\n \t.long\t0x0200\t\t/* ORIG_ROOT_DEV */\n@@ -39,7 +39,7 @@ ENTRY(empty_zero_page)\n \t.long\t0x53453f00 + 29\t/* \"SE?\" = 29 bit */\n #endif\n 1:\n-\t.skip\tPAGE_SIZE - empty_zero_page - 1b\n+\t.skip\tPAGE_SIZE - boot_params_page - 1b\n \n \t__HEAD\n \ndiff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c\nindex 5858936cb431..041191002e2e 100644\n--- a/arch/sh/kernel/sh_ksyms_32.c\n+++ b/arch/sh/kernel/sh_ksyms_32.c\n@@ -20,7 +20,6 @@ EXPORT_SYMBOL(csum_partial);\n EXPORT_SYMBOL(csum_partial_copy_generic);\n EXPORT_SYMBOL(copy_page);\n EXPORT_SYMBOL(__clear_user);\n-EXPORT_SYMBOL(empty_zero_page);\n #ifdef CONFIG_FLATMEM\n /* need in pfn_valid macro */\n EXPORT_SYMBOL(min_low_pfn);\ndiff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c\nindex 464a3a63e2fa..4e40d5e96be9 100644\n--- a/arch/sh/mm/init.c\n+++ b/arch/sh/mm/init.c\n@@ -332,7 +332,6 @@ void __init mem_init(void)\n \tcpu_cache_init();\n \n \t/* clear the zero-page */\n-\tmemset(empty_zero_page, 0, PAGE_SIZE);\n \t__flush_wback_region(empty_zero_page, PAGE_SIZE);\n \n \tvsyscall_init();\ndiff --git a/arch/sparc/include/asm/pgtable_32.h b/arch/sparc/include/asm/pgtable_32.h\nindex a9f802d1dd64..f89b1250661d 100644\n--- a/arch/sparc/include/asm/pgtable_32.h\n+++ b/arch/sparc/include/asm/pgtable_32.h\n@@ -71,14 +71,6 @@ extern unsigned long ptr_in_current_pgd;\n extern unsigned long phys_base;\n extern unsigned long pfn_base;\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n /*\n  * In general all page table modifications should use the V8 atomic\n  * swap instruction.  This insures the mmu and the cpu are in sync\ndiff --git a/arch/sparc/include/asm/setup.h b/arch/sparc/include/asm/setup.h\nindex 72205684e51e..21bed5514028 100644\n--- a/arch/sparc/include/asm/setup.h\n+++ b/arch/sparc/include/asm/setup.h\n@@ -17,8 +17,6 @@ extern char reboot_command[];\n  */\n extern unsigned char boot_cpu_id;\n \n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];\n-\n extern int serial_console;\n static inline int con_is_present(void)\n {\ndiff --git a/arch/sparc/kernel/head_32.S b/arch/sparc/kernel/head_32.S\nindex 38345460d542..8c320fa25a67 100644\n--- a/arch/sparc/kernel/head_32.S\n+++ b/arch/sparc/kernel/head_32.S\n@@ -57,13 +57,6 @@ sun4e_notsup:\n \n \t.align PAGE_SIZE\n \n-/* This was the only reasonable way I could think of to properly align\n- * these page-table data structures.\n- */\n-\t.globl empty_zero_page\n-empty_zero_page:\t.skip PAGE_SIZE\n-EXPORT_SYMBOL(empty_zero_page)\n-\n \t.global root_flags\n \t.global ram_flags\n \t.global root_dev\ndiff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c\nindex fdc93dd12c3e..e0e66f91ceeb 100644\n--- a/arch/sparc/mm/init_32.c\n+++ b/arch/sparc/mm/init_32.c\n@@ -246,10 +246,6 @@ void __init arch_mm_preinit(void)\n \t\tprom_halt();\n \t}\n \n-\n-\t/* Saves us work later. */\n-\tmemset((void *)empty_zero_page, 0, PAGE_SIZE);\n-\n \ti = last_valid_pfn >> ((20 - PAGE_SHIFT) + 5);\n \ti += 1;\n \tsparc_valid_addr_bitmap = (unsigned long *)\ndiff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c\nindex 4f7bdb18774b..0cc8de2fea90 100644\n--- a/arch/sparc/mm/init_64.c\n+++ b/arch/sparc/mm/init_64.c\n@@ -2498,6 +2498,9 @@ static void __init register_page_bootmem_info(void)\n }\n void __init mem_init(void)\n {\n+\tphys_addr_t zero_page_pa = kern_base +\n+\t\t((unsigned long)&empty_zero_page[0] - KERNBASE);\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@@ -2510,13 +2513,7 @@ void __init mem_init(void)\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 = alloc_pages(GFP_KERNEL|__GFP_ZERO, 0);\n-\tif (mem_map_zero == NULL) {\n-\t\tprom_printf(\"paging_init: Cannot alloc zero page.\\n\");\n-\t\tprom_halt();\n-\t}\n-\tmark_page_reserved(mem_map_zero);\n-\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();\ndiff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h\nindex 3b42b0f45bf6..19e0608fb649 100644\n--- a/arch/um/include/asm/pgtable.h\n+++ b/arch/um/include/asm/pgtable.h\n@@ -34,9 +34,6 @@\n \n extern pgd_t swapper_pg_dir[PTRS_PER_PGD];\n \n-/* zero page used for uninitialized stuff */\n-extern unsigned long *empty_zero_page;\n-\n /* Just any arbitrary offset to the start of the vmalloc VM area: the\n  * current 8MB value just means that there will be a 8MB \"hole\" after the\n  * physical memory until the kernel virtual memory starts.  That means that\n@@ -74,12 +71,6 @@ extern unsigned long *empty_zero_page;\n  * get..\n  */\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) virt_to_page(empty_zero_page)\n-\n #define pte_clear(mm, addr, xp) pte_set_val(*(xp), (phys_t) 0, __pgprot(_PAGE_NEEDSYNC))\n \n #define pmd_none(x)\t(!((unsigned long)pmd_val(x) & ~_PAGE_NEEDSYNC))\ndiff --git a/arch/um/include/shared/kern_util.h b/arch/um/include/shared/kern_util.h\nindex 38321188c04c..9812efd14ec0 100644\n--- a/arch/um/include/shared/kern_util.h\n+++ b/arch/um/include/shared/kern_util.h\n@@ -38,7 +38,6 @@ extern void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs\n extern void uml_pm_wake(void);\n \n extern int start_uml(void);\n-extern void paging_init(void);\n \n extern void uml_cleanup(void);\n extern void do_uml_exitcalls(void);\ndiff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c\nindex 89c8c8b94a79..1eef0e42ef5d 100644\n--- a/arch/um/kernel/mem.c\n+++ b/arch/um/kernel/mem.c\n@@ -44,10 +44,6 @@ __section(\".kasan_init\") __used\n = kasan_init;\n #endif\n \n-/* allocated in paging_init, zeroed in mem_init, and unchanged thereafter */\n-unsigned long *empty_zero_page = NULL;\n-EXPORT_SYMBOL(empty_zero_page);\n-\n /*\n  * Initialized during boot, and readonly for initializing page tables\n  * afterwards\n@@ -65,9 +61,6 @@ void __init arch_mm_preinit(void)\n \t/* Safe to call after jump_label_init(). Enables KASAN. */\n \tkasan_init_generic();\n \n-\t/* clear the zero-page */\n-\tmemset(empty_zero_page, 0, PAGE_SIZE);\n-\n \t/* Map in the area just after the brk now that kmalloc is about\n \t * to be turned on.\n \t */\n@@ -89,15 +82,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)\n \tmax_zone_pfns[ZONE_NORMAL] = high_physmem >> PAGE_SHIFT;\n }\n \n-void __init paging_init(void)\n-{\n-\tempty_zero_page = (unsigned long *) memblock_alloc_low(PAGE_SIZE,\n-\t\t\t\t\t\t\t       PAGE_SIZE);\n-\tif (!empty_zero_page)\n-\t\tpanic(\"%s: Failed to allocate %lu bytes align=%lx\\n\",\n-\t\t      __func__, PAGE_SIZE, PAGE_SIZE);\n-}\n-\n /*\n  * This can't do anything because nothing in the kernel image can be freed\n  * since it's not in kernel physical memory.\ndiff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c\nindex e2b24e1ecfa6..2141f5f1f5a2 100644\n--- a/arch/um/kernel/um_arch.c\n+++ b/arch/um/kernel/um_arch.c\n@@ -413,7 +413,6 @@ void __init setup_arch(char **cmdline_p)\n \tuml_dtb_init();\n \tread_initrd();\n \n-\tpaging_init();\n \tstrscpy(boot_command_line, command_line, COMMAND_LINE_SIZE);\n \t*cmdline_p = command_line;\n \tsetup_hostinfo(host_info, sizeof host_info);\ndiff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h\nindex 1662c5a8f445..54289f4587a4 100644\n--- a/arch/x86/include/asm/pgtable.h\n+++ b/arch/x86/include/asm/pgtable.h\n@@ -47,14 +47,6 @@ void ptdump_walk_user_pgd_level_checkwx(void);\n #define debug_checkwx_user()\tdo { } while (0)\n #endif\n \n-/*\n- * ZERO_PAGE is a global shared page that is always zero: used\n- * for zero-mapped memory areas etc..\n- */\n-extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]\n-\t__visible;\n-#define ZERO_PAGE(vaddr) ((void)(vaddr),virt_to_page(empty_zero_page))\n-\n extern spinlock_t pgd_lock;\n extern struct list_head pgd_list;\n \ndiff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S\nindex 80ef5d386b03..5171cb746444 100644\n--- a/arch/x86/kernel/head_32.S\n+++ b/arch/x86/kernel/head_32.S\n@@ -441,10 +441,6 @@ initial_pg_fixmap:\n swapper_pg_dir:\n \t.fill 1024,4,0\n \t.fill PTI_USER_PGD_FILL,4,0\n-.globl empty_zero_page\n-empty_zero_page:\n-\t.fill 4096,1,0\n-EXPORT_SYMBOL(empty_zero_page)\n \n /*\n  * This starts the data section.\ndiff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S\nindex 21816b48537c..cbf7647a25d8 100644\n--- a/arch/x86/kernel/head_64.S\n+++ b/arch/x86/kernel/head_64.S\n@@ -712,10 +712,3 @@ SYM_PIC_ALIAS(phys_base);\n EXPORT_SYMBOL(phys_base)\n \n #include \"../xen/xen-head.S\"\n-\n-\t__PAGE_ALIGNED_BSS\n-SYM_DATA_START_PAGE_ALIGNED(empty_zero_page)\n-\t.skip PAGE_SIZE\n-SYM_DATA_END(empty_zero_page)\n-EXPORT_SYMBOL(empty_zero_page)\n-\ndiff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h\nindex 50a136213b2b..61f07d981a94 100644\n--- a/arch/xtensa/include/asm/pgtable.h\n+++ b/arch/xtensa/include/asm/pgtable.h\n@@ -209,10 +209,6 @@\n #define pgd_ERROR(e) \\\n \tprintk(\"%s:%d: bad pgd entry %08lx.\\n\", __FILE__, __LINE__, pgd_val(e))\n \n-extern unsigned long empty_zero_page[1024];\n-\n-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))\n-\n #ifdef CONFIG_MMU\n extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)];\n extern void paging_init(void);\ndiff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S\nindex 8484294bc623..4b0c5c5e685a 100644\n--- a/arch/xtensa/kernel/head.S\n+++ b/arch/xtensa/kernel/head.S\n@@ -381,6 +381,3 @@ ENTRY(swapper_pg_dir)\n \t.fill\tPAGE_SIZE, 1, 0\n END(swapper_pg_dir)\n #endif\n-ENTRY(empty_zero_page)\n-\t.fill\tPAGE_SIZE, 1, 0\n-END(empty_zero_page)\ndiff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c\nindex 62d81e76e18e..ced335b4df5f 100644\n--- a/arch/xtensa/kernel/xtensa_ksyms.c\n+++ b/arch/xtensa/kernel/xtensa_ksyms.c\n@@ -15,8 +15,6 @@\n #include <linux/module.h>\n #include <asm/pgtable.h>\n \n-EXPORT_SYMBOL(empty_zero_page);\n-\n unsigned int __sync_fetch_and_and_4(volatile void *p, unsigned int v)\n {\n \tBUG();\ndiff --git a/include/linux/pgtable.h b/include/linux/pgtable.h\nindex 9bacf4df9769..3d48eea57cd2 100644\n--- a/include/linux/pgtable.h\n+++ b/include/linux/pgtable.h\n@@ -1890,6 +1890,9 @@ static inline void pfnmap_setup_cachemode_pfn(unsigned long pfn, pgprot_t *prot)\n  * for different ranges in the virtual address space.\n  *\n  * zero_page_pfn identifies the first (or the only) pfn for these pages.\n+ *\n+ * For architectures that don't __HAVE_COLOR_ZERO_PAGE the zero page lives in\n+ * empty_zero_page in BSS.\n  */\n #ifdef __HAVE_COLOR_ZERO_PAGE\n static inline int is_zero_pfn(unsigned long pfn)\n@@ -1916,6 +1919,13 @@ static inline unsigned long zero_pfn(unsigned long addr)\n \n \treturn zero_page_pfn;\n }\n+\n+extern uint8_t empty_zero_page[PAGE_SIZE];\n+\n+#ifndef ZERO_PAGE\n+#define ZERO_PAGE(vaddr) ((void)(vaddr),virt_to_page(empty_zero_page))\n+#endif\n+\n #endif /* __HAVE_COLOR_ZERO_PAGE */\n \n #ifdef CONFIG_MMU\ndiff --git a/mm/mm_init.c b/mm/mm_init.c\nindex a0ca236eb4f5..1eac634ece1a 100644\n--- a/mm/mm_init.c\n+++ b/mm/mm_init.c\n@@ -56,6 +56,11 @@ EXPORT_SYMBOL(high_memory);\n unsigned long zero_page_pfn __ro_after_init;\n EXPORT_SYMBOL(zero_page_pfn);\n \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 #ifdef CONFIG_DEBUG_MEMORY_INIT\n int __meminitdata mminit_loglevel;\n \n",
    "prefixes": [
        "v3",
        "3/4"
    ]
}