{"id":2219961,"url":"http://patchwork.ozlabs.org/api/1.2/patches/2219961/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260405125240.2558577-37-songmuchun@bytedance.com/","project":{"id":2,"url":"http://patchwork.ozlabs.org/api/1.2/projects/2/?format=json","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":"<20260405125240.2558577-37-songmuchun@bytedance.com>","list_archive_url":"https://lore.kernel.org/linuxppc-dev/20260405125240.2558577-37-songmuchun@bytedance.com/","date":"2026-04-05T12:52:27","name":"[36/49] powerpc/mm: use generic vmemmap_shared_tail_page() in compound vmemmap","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"4c587066b98c36f52f6e3ba81b0382f86c38feb2","submitter":{"id":78930,"url":"http://patchwork.ozlabs.org/api/1.2/people/78930/?format=json","name":"Muchun Song","email":"songmuchun@bytedance.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260405125240.2558577-37-songmuchun@bytedance.com/mbox/","series":[{"id":498783,"url":"http://patchwork.ozlabs.org/api/1.2/series/498783/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=498783","date":"2026-04-05T12:51:51","name":"mm: Generalize vmemmap optimization for DAX and HugeTLB","version":1,"mbox":"http://patchwork.ozlabs.org/series/498783/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2219961/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2219961/checks/","tags":{},"related":[],"headers":{"Return-Path":"\n <linuxppc-dev+bounces-19366-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=bytedance.com header.i=@bytedance.com\n header.a=rsa-sha256 header.s=google header.b=Aa4NB7kw;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=112.213.38.117; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-19366-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)","lists.ozlabs.org;\n arc=none smtp.remote-ip=\"2607:f8b0:4864:20::102c\"","lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=bytedance.com","lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=bytedance.com header.i=@bytedance.com\n header.a=rsa-sha256 header.s=google header.b=Aa4NB7kw;\n\tdkim-atps=neutral","lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=bytedance.com\n (client-ip=2607:f8b0:4864:20::102c; helo=mail-pj1-x102c.google.com;\n envelope-from=songmuchun@bytedance.com; receiver=lists.ozlabs.org)"],"Received":["from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117])\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 4fpXYX07wHz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 05 Apr 2026 22:57:35 +1000 (AEST)","from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4fpXYB2j2Dz2yvZ;\n\tSun, 05 Apr 2026 22:57:18 +1000 (AEST)","from mail-pj1-x102c.google.com (mail-pj1-x102c.google.com\n [IPv6:2607:f8b0:4864:20::102c])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4fpXY947ZSz2yvW\n\tfor <linuxppc-dev@lists.ozlabs.org>; Sun, 05 Apr 2026 22:57:17 +1000 (AEST)","by mail-pj1-x102c.google.com with SMTP id\n 98e67ed59e1d1-35c238f1063so1899571a91.1\n        for <linuxppc-dev@lists.ozlabs.org>;\n Sun, 05 Apr 2026 05:57:17 -0700 (PDT)","from n232-176-004.byted.org ([36.110.163.97])\n        by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35de66b4808sm3748505a91.2.2026.04.05.05.57.10\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Sun, 05 Apr 2026 05:57:15 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1775393838;\n\tcv=none;\n b=cT3PACsSryEeFt7zIo7HHM7r6OZmxfWc1qKKKHBOaUMo24xr1rC+maEBdRTRPoqFx+JP2Owa+Xe5LYBdjx5rPk0jjNAJ1llguat1ZmOcbIqAHKzj95Gr48k9ynwRVvDXAt3bqXyM2ntssc1lws1U2sLAHqZHIZ/TN5CsdekDKeO5zGja8il2qWEkNNfk/bwYJWG0PQDMGanXsf/ZgrNv0TKx8tICsRS9RRrLXX6XHunhhe59FxasmTe9/88aj4MRRfNjNVBLRhmFgHB9d8WnobimwAOteIOuaw9vhiy7X2RSXl0vMxfaHK00HwMxQyNHoTFd8Xf7ey/mdL2ua0JTzA==","ARC-Message-Signature":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1775393838; c=relaxed/relaxed;\n\tbh=dhCvzWzEYwqtXTRdhJr7F88/ilDc9KP9wceAmsw7dyk=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t MIME-Version;\n b=f8SwNQAEj6qCZSlNXHTRkTB8yKcRRfDCJmOhci7bGxxcLcmxdaSij84FMF/IrWxxTHB1Wl10YY1RQ3+QCYaDDtrGdsYZLazvKUAHYZszM/j5cCnQv3SoyL99eH+8512sILgGhHwrHAQx/BfchSX+F0Wffve/Npl6XKIa3x7IHYWDjHRn4YJkyQc0YtmjlX1h6pbqgTBeMYedxLItmf3zio6sUeKG253Da133Izh2fCrcbExnWS/Y86a0XShj5D5M5qNqJvnPPyYCCfvw8Nr4dzvSObL09XqaGHbMmaLKGhtrzGr463sZTLvch2Dc08kt/JlzwIWuFzaOHuy1YX20eA==","ARC-Authentication-Results":"i=1; lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=bytedance.com;\n dkim=pass (2048-bit key;\n unprotected) header.d=bytedance.com header.i=@bytedance.com\n header.a=rsa-sha256 header.s=google header.b=Aa4NB7kw; dkim-atps=neutral;\n spf=pass (client-ip=2607:f8b0:4864:20::102c; helo=mail-pj1-x102c.google.com;\n envelope-from=songmuchun@bytedance.com;\n receiver=lists.ozlabs.org) smtp.mailfrom=bytedance.com","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=bytedance.com; s=google; t=1775393836; x=1775998636;\n darn=lists.ozlabs.org;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n         :message-id:reply-to;\n        bh=dhCvzWzEYwqtXTRdhJr7F88/ilDc9KP9wceAmsw7dyk=;\n        b=Aa4NB7kwIxJkBZ1LzIpYH+qYbuXtLJiFVIQYRU/Ybj34k24eQzX6Z1U6T7uEBMqe8w\n         KqAnZZVol50AdYNGwmqRcSSFji5zyHDt8h7QSiwSqgJcM7hRtJZbjXZ2fa2UyTKcEtZS\n         MW+9MaZG++ruHCLsS4aQpRNYEe30JkEogx2KKpGTUUtej6Blkzwa18mDPZS+k1oyms9B\n         dKeWPIsNPxQvTBFXh+ZYhErvxKCjcwC4BEPxOGLROemEIh9v1hAERD/RWAQJjTSpKCx+\n         REU6o7H0+X6yEYLjRMgcY/qfu+EdpY8IqK0VKK0Wwhd6HGnmvw34SMXv8z/iqoZ7xA+z\n         Q0cg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1775393836; x=1775998636;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n         :to:cc:subject:date:message-id:reply-to;\n        bh=dhCvzWzEYwqtXTRdhJr7F88/ilDc9KP9wceAmsw7dyk=;\n        b=B64c1qr/IOIoEv33mpgnmFWA8Ju11MweC2U9ajZ5G8s05p2eGEwWzrja7eeJY4ktFs\n         cWl4zrpTFk9XwCI5W5NU8hyG80Je62qLntnp/D5VsVEnTvXoTLl90eVJV/vnxmBGwKKk\n         IPJhdorHWCgfPg0MaTMNODkTo5LjKrPKFHpwIiStkwNgPThpawetydQnARrBKNr0c9j7\n         OOjqELloRn7i61irm2RztmVvwym87qR0loc6k2LOPNO9nsWU0BoASk5AgZzmLxUZ9PKt\n         JusUWcJ96lm3bJmmWJV3vvDazzo6GiFkV7eIN8lyEeaQDK1gjaczBGitjR+sJU5FBpBy\n         8IIg==","X-Forwarded-Encrypted":"i=1;\n AJvYcCVKp2llQj7JFGVW1Le+4nKNYSwkEAUxIU92JhJm9hiHz2iAGSNlntZ6D3E6A/VJuhMiiz80r3YVQXtgL8E=@lists.ozlabs.org","X-Gm-Message-State":"AOJu0Yzjpl5WjSRkamLvHED03m72ZTC9OqUF0sru1WulPNZimSi5GsvV\n\tNCErPtxNqYyP9deimF0F79FytX6a+Vq61gUbinDUhMx/I3Pne3jaGsjwKddZwVZ/PBg=","X-Gm-Gg":"AeBDieudWFMdVzye3mO95wzYHNK05PnycSZY/WZJTXcx122nNn7BMInkHT2UK3Uz2CX\n\tn3dT2SU2RFxlhjtRhmmpJtBPr7wKA+YUIXqSI8RSqb+idjVSgrTWAYe4NV5WHm5H8eGlsh1XbNF\n\tBQnGbH7+qAaTpu72pMdi2zbzAT8IuOnemNK5PeZ/TAJYkASVSDnOtrVL6QczrYc0nimWekq9nSm\n\txyxl+2JuX/bJgbXZYTLiz5c1rMK8M6VUMloK0AZii1Q7u3mX7hWVPFCTlp9tsfJvXzCpYVY+c9v\n\tpgExqwNj6n3pczOr62dB5bPWYD3FptdMdCxDFAuRkkAFOPzt/9rcbAROzR1lGsYRXnl6lzb+S0R\n\tm4YzO70hOyS03vVLDp1BRoJDVct0HvrEiLqSuEV4HBW+r5ahKa9zcVj8+3QYqHr+5tA0QfkuoHJ\n\toz5M+v1mygMDHgBKSQyxO2OvD6XHvLVERQp1pDo6quaRI=","X-Received":"by 2002:a17:90b:3f4d:b0:35d:9482:2233 with SMTP id\n 98e67ed59e1d1-35de69a66e1mr8904624a91.24.1775393835707;\n        Sun, 05 Apr 2026 05:57:15 -0700 (PDT)","From":"Muchun Song <songmuchun@bytedance.com>","To":"Andrew Morton <akpm@linux-foundation.org>,\n\tDavid Hildenbrand <david@kernel.org>,\n\tMuchun Song <muchun.song@linux.dev>,\n\tOscar Salvador <osalvador@suse.de>,\n\tMichael Ellerman <mpe@ellerman.id.au>,\n\tMadhavan Srinivasan <maddy@linux.ibm.com>","Cc":"Lorenzo Stoakes <ljs@kernel.org>,\n\t\"Liam R . Howlett\" <Liam.Howlett@oracle.com>,\n\tVlastimil Babka <vbabka@kernel.org>,\n\tMike Rapoport <rppt@kernel.org>,\n\tSuren Baghdasaryan <surenb@google.com>,\n\tMichal Hocko <mhocko@suse.com>,\n\tNicholas Piggin <npiggin@gmail.com>,\n\tChristophe Leroy <chleroy@kernel.org>,\n\taneesh.kumar@linux.ibm.com,\n\tjoao.m.martins@oracle.com,\n\tlinux-mm@kvack.org,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tlinux-kernel@vger.kernel.org,\n\tMuchun Song <songmuchun@bytedance.com>","Subject":"[PATCH 36/49] powerpc/mm: use generic vmemmap_shared_tail_page() in\n compound vmemmap","Date":"Sun,  5 Apr 2026 20:52:27 +0800","Message-Id":"<20260405125240.2558577-37-songmuchun@bytedance.com>","X-Mailer":"git-send-email 2.20.1","In-Reply-To":"<20260405125240.2558577-1-songmuchun@bytedance.com>","References":"<20260405125240.2558577-1-songmuchun@bytedance.com>","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=DKIM_SIGNED,DKIM_VALID,\n\tDKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,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":"The ultimate goal is to unify the vmemmap optimization logic for both\nDAX and HugeTLB. To achieve this, all platforms need to align with the\nstandard HugeTLB approach of using vmemmap_shared_tail_page() for tail\npage mappings.\n\nThis patch updates PowerPC to utilize vmemmap_shared_tail_page() to\nretrieve the pre-allocated and initialized shared tail page, instead of\ndynamically looking up and constructing the tail page mapping via\nvmemmap_compound_tail_page().\n\nAs a byproduct of this alignment, it greatly simplifies the vmemmap\ncompound page mapping logic in radix_pgtable by removing\nvmemmap_compound_tail_page() entirely.\n\nSigned-off-by: Muchun Song <songmuchun@bytedance.com>\n---\n arch/powerpc/mm/book3s64/radix_pgtable.c | 81 +++---------------------\n 1 file changed, 9 insertions(+), 72 deletions(-)","diff":"diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c b/arch/powerpc/mm/book3s64/radix_pgtable.c\nindex ad44883b1030..5ce3deb464d5 100644\n--- a/arch/powerpc/mm/book3s64/radix_pgtable.c\n+++ b/arch/powerpc/mm/book3s64/radix_pgtable.c\n@@ -1256,59 +1256,6 @@ static pte_t * __meminit radix__vmemmap_populate_address(unsigned long addr, int\n \treturn pte;\n }\n \n-static pte_t * __meminit vmemmap_compound_tail_page(unsigned long addr,\n-\t\t\t\t\t\t    unsigned long pfn_offset, int node)\n-{\n-\tpgd_t *pgd;\n-\tp4d_t *p4d;\n-\tpud_t *pud;\n-\tpmd_t *pmd;\n-\tpte_t *pte;\n-\tunsigned long map_addr;\n-\n-\t/* the second vmemmap page which we use for duplication */\n-\tmap_addr = addr - pfn_offset * sizeof(struct page) + PAGE_SIZE;\n-\tpgd = pgd_offset_k(map_addr);\n-\tp4d = p4d_offset(pgd, map_addr);\n-\tpud = vmemmap_pud_alloc(p4d, node, map_addr);\n-\tif (!pud)\n-\t\treturn NULL;\n-\tpmd = vmemmap_pmd_alloc(pud, node, map_addr);\n-\tif (!pmd)\n-\t\treturn NULL;\n-\tif (pmd_leaf(*pmd))\n-\t\t/*\n-\t\t * The second page is mapped as a hugepage due to a nearby request.\n-\t\t * Force our mapping to page size without deduplication\n-\t\t */\n-\t\treturn NULL;\n-\tpte = vmemmap_pte_alloc(pmd, node, map_addr);\n-\tif (!pte)\n-\t\treturn NULL;\n-\t/*\n-\t * Check if there exist a mapping to the left\n-\t */\n-\tif (pte_none(*pte)) {\n-\t\t/*\n-\t\t * Populate the head page vmemmap page.\n-\t\t * It can fall in different pmd, hence\n-\t\t * vmemmap_populate_address()\n-\t\t */\n-\t\tpte = radix__vmemmap_populate_address(map_addr - PAGE_SIZE, node, NULL, NULL);\n-\t\tif (!pte)\n-\t\t\treturn NULL;\n-\t\t/*\n-\t\t * Populate the tail pages vmemmap page\n-\t\t */\n-\t\tpte = radix__vmemmap_pte_populate(pmd, map_addr, node, NULL, NULL);\n-\t\tif (!pte)\n-\t\t\treturn NULL;\n-\t\tvmemmap_verify(pte, node, map_addr, map_addr + PAGE_SIZE);\n-\t\treturn pte;\n-\t}\n-\treturn pte;\n-}\n-\n static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,\n \t\t\t\t\t\t     unsigned long start,\n \t\t\t\t\t\t     unsigned long end, int node,\n@@ -1327,6 +1274,13 @@ static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,\n \tpud_t *pud;\n \tpmd_t *pmd;\n \tpte_t *pte;\n+\tconst struct mem_section *ms = __pfn_to_section(start_pfn);\n+\tstruct page *tail_page;\n+\n+\ttail_page = vmemmap_shared_tail_page(section_order(ms),\n+\t\t\t\t\t     &NODE_DATA(node)->node_zones[section_zone(ms)]);\n+\tif (!tail_page)\n+\t\treturn -ENOMEM;\n \n \tfor (addr = start; addr < end; addr = next) {\n \n@@ -1358,9 +1312,8 @@ static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,\n \t\t\tnext = addr + PAGE_SIZE;\n \t\t\tcontinue;\n \t\t} else {\n-\t\t\tunsigned long nr_pages = pgmap_vmemmap_nr(pgmap);\n+\t\t\tunsigned long nr_pages = 1L << section_order(ms);\n \t\t\tunsigned long pfn_offset = addr_pfn - ALIGN_DOWN(addr_pfn, nr_pages);\n-\t\t\tpte_t *tail_page_pte;\n \n \t\t\t/*\n \t\t\t * if the address is aligned to huge page size it is the\n@@ -1386,24 +1339,8 @@ static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,\n \t\t\t\tnext = addr + 2 * PAGE_SIZE;\n \t\t\t\tcontinue;\n \t\t\t}\n-\t\t\t/*\n-\t\t\t * get the 2nd mapping details\n-\t\t\t * Also create it if that doesn't exist\n-\t\t\t */\n-\t\t\ttail_page_pte = vmemmap_compound_tail_page(addr, pfn_offset, node);\n-\t\t\tif (!tail_page_pte) {\n-\n-\t\t\t\tpte = radix__vmemmap_pte_populate(pmd, addr, node, NULL, NULL);\n-\t\t\t\tif (!pte)\n-\t\t\t\t\treturn -ENOMEM;\n-\t\t\t\tvmemmap_verify(pte, node, addr, addr + PAGE_SIZE);\n-\n-\t\t\t\taddr_pfn += 1;\n-\t\t\t\tnext = addr + PAGE_SIZE;\n-\t\t\t\tcontinue;\n-\t\t\t}\n \n-\t\t\tpte = radix__vmemmap_pte_populate(pmd, addr, node, NULL, pte_page(*tail_page_pte));\n+\t\t\tpte = radix__vmemmap_pte_populate(pmd, addr, node, NULL, tail_page);\n \t\t\tif (!pte)\n \t\t\t\treturn -ENOMEM;\n \t\t\tvmemmap_verify(pte, node, addr, addr + PAGE_SIZE);\n","prefixes":["36/49"]}