From patchwork Mon Jun 10 05:54:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Leroy X-Patchwork-Id: 13691507 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E0096C27C5E for ; Mon, 10 Jun 2024 05:55:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 733BD6B009F; Mon, 10 Jun 2024 01:55:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6BC546B00A0; Mon, 10 Jun 2024 01:55:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 535F96B00A1; Mon, 10 Jun 2024 01:55:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 2DFE56B009F for ; Mon, 10 Jun 2024 01:55:25 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id C9F0E40D63 for ; Mon, 10 Jun 2024 05:55:24 +0000 (UTC) X-FDA: 82213916568.16.CF19D48 Received: from pegase1.c-s.fr (pegase1.c-s.fr [93.17.236.30]) by imf03.hostedemail.com (Postfix) with ESMTP id 909582000B for ; Mon, 10 Jun 2024 05:55:22 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=csgroup.eu; spf=pass (imf03.hostedemail.com: domain of christophe.leroy@csgroup.eu designates 93.17.236.30 as permitted sender) smtp.mailfrom=christophe.leroy@csgroup.eu ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1717998922; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wEsVJ8gVSgYk+6dtILVTpKnQo4KMpLrJnCRKpJLSQLY=; b=L5AFEytIu7BTE6+4mNutDJH5Cg/iAw1ivDpycjSZCpPCQimR46v9B6Y40G6GQjpkNon17Z 2j6j9daUYFdokBQzevDPKZhAVFPs4NNXdb2s4oKwefYxweQm0p68f00puSJodgnJ+e36aq 8itWig1A9uvIaeSXZ40wb22yXmxPhYo= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1717998922; a=rsa-sha256; cv=none; b=aYt0hwxBesKnNfgzt0YX1DGj6QDXkvyHAmhk/EbaSwStZebWT6RXWfXmDpHLJO/nyTs0Y0 Qnfgyy9sf2PU0djRq/lUWxKaVcdj7tSgtFlVnyCd2/fYyY/cg5pm4ri3yN27sM7yGRgnx/ 2BAF4SfPGK9W4clne1+qDRLR37058uo= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=csgroup.eu; spf=pass (imf03.hostedemail.com: domain of christophe.leroy@csgroup.eu designates 93.17.236.30 as permitted sender) smtp.mailfrom=christophe.leroy@csgroup.eu Received: from localhost (mailhub3.si.c-s.fr [192.168.12.233]) by localhost (Postfix) with ESMTP id 4VyLcQ5CXcz9v49; Mon, 10 Jun 2024 07:55:02 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iqfAjQD7avPv; Mon, 10 Jun 2024 07:55:02 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 4VyLcL0Zx7z9v4H; Mon, 10 Jun 2024 07:54:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 0FEE88B764; Mon, 10 Jun 2024 07:54:58 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id SC-ApNoJwjO9; Mon, 10 Jun 2024 07:54:57 +0200 (CEST) Received: from PO20335.idsi0.si.c-s.fr (unknown [172.25.230.108]) by messagerie.si.c-s.fr (Postfix) with ESMTP id D3AB68B76E; Mon, 10 Jun 2024 07:54:57 +0200 (CEST) From: Christophe Leroy To: Andrew Morton , Jason Gunthorpe , Peter Xu , Oscar Salvador , Michael Ellerman , Nicholas Piggin Cc: Christophe Leroy , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org Subject: [PATCH v5 05/18] powerpc/mm: Fix __find_linux_pte() on 32 bits with PMD leaf entries Date: Mon, 10 Jun 2024 07:54:50 +0200 Message-ID: <3a87a60173171326096e9779399908a1ee158dde.1717955558.git.christophe.leroy@csgroup.eu> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: MIME-Version: 1.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1717998887; l=5393; i=christophe.leroy@csgroup.eu; s=20211009; h=from:subject:message-id; bh=CWlk/wMDjpU6vF1ScRB8cosnmevy/J5Gz15W8u/6MPI=; b=Un+r2iQmI2Y1S/rVW9QsGLuXIKWohARWQ92NTopwZF1NuYv2CBYWbJHtrI0Ce1JGN8ZDLg0Hz h8tNwgah91PBIKWw7FrOe/23DN1WWtWcLAxirXOO0suuXzXE7HhrAl3 X-Developer-Key: i=christophe.leroy@csgroup.eu; a=ed25519; pk=HIzTzUj91asvincQGOFx6+ZF5AoUuP9GdOtQChs7Mm0= X-Stat-Signature: k4sz5ku5fekcmq7y1qisyq4gh5kwixi6 X-Rspamd-Queue-Id: 909582000B X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1717998922-565110 X-HE-Meta: U2FsdGVkX19vPSkquFCXVaqui9UbgYXm06WLyp5x+aKtiRcbYfsuI96ji9a8or7InIFg4ecBIvksJ2l6927YbYCPOl26hJ7upndX0cOvtbgZyFm3/Qay3LXbV82GrhBj6y22xGDQlWDDU9tFWYCS24LJ/0lhKiSqnNd8GJB6S+Gu8wHJCK+VBZ4Ix1iNcXxgzHdNjixv393oH/697CzUC8CbTql9/Zku5I7MYoIHhg4A5NkbUSbHzglhv9SPrzoAg0IIs/rqzauAcrYHbO3aJ8D85Ae1/YmCwiN1vU9EZZV/dJKsFIVEHj64bewh7s9k0vnFkBVgFUISe1A4qayxCdSPcJY3kGyvWuB6aFVOmdbvgFDgZU0io0NHWf8x//lOyR1W65ydWfd/ldFNX5wyibSwOeePw2bmP2jEo3El0SLF7fCj0CM+s7HzDnjyOlxvaV6EweWx32rU0GOybvnm1tobok64upLh99+/bxzLjJZ10EdKvIyAeUgHwFqALjw3lqrZMdqIq9JmioHJ2MewN5O+qWBv2hMKo0quVTD+Y432cBlSAUo5ZXITC6XDy1lZFXvZmkN9BKkwUEDDo2cBKj4oa/sMX0xqvENEYJjHJ3z/Bep7eT1odcv0cyG3EdnBvX35eI6Ukt8xC0ldHoD2L0Rb/6AX8iWWFsx38sBjnWpHkTsPCT+xG0YW1jsS89doMbG0NdLYDnjyqAJEB3Yp2KsLecuKiyzALtsGeo35r13lO6T5kbJEwOPZWgUmsdDt3M4XrAZ4VN6rwP34guMV8+WWmRtDLMDq6DgsD+Z/5LygUp1V6VK5FOMGr8nQQl4w8DmbRnBogIyQLZhrMMQxHuhjKYKRGsPq271Cr1y0snjw9b2gJ6eyHhOAUolqhaBKNHzZXd0tsp/i4qcWAJlj1w4YBG5XJFVqzs2397OHaPfZrZZQJrkL7D0K5Ub8Ye0P+KY7PFzCOIosUxh/jEK o3mTyu1O 7f5ZIwxVuDpzUQOqVmzRYw3avQvHD7lSB1Jxu2ug7x4Ee0ZC7wmKAw/kkaIMpkroxrRJ9mIq0yIt6kkhAC7beMZefbnD1ttdJ+Oo4Ug8V0ZoH66McXKpKc7TW8sflGXjKoFfwMVvW2IpoT5HIcHxXenYLBaCfsdYC83EBndZP1xAdtgI= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Building on 32 bits with pmd_leaf() not returning always false leads to the following error: CC arch/powerpc/mm/pgtable.o arch/powerpc/mm/pgtable.c: In function '__find_linux_pte': arch/powerpc/mm/pgtable.c:506:1: error: function may return address of local variable [-Werror=return-local-addr] 506 | } | ^ arch/powerpc/mm/pgtable.c:394:15: note: declared here 394 | pud_t pud, *pudp; | ^~~ arch/powerpc/mm/pgtable.c:394:15: note: declared here This is due to pmd_offset() being a no-op in that case. So rework it for powerpc/32 so that pXd_offset() are used on real pointers and not on on-stack copies. Behind fixing the problem, it also has the advantage of simplifying __find_linux_pte() including the removal of stack frame: After this patch: 00000018 <__find_linux_pte>: 18: 2c 06 00 00 cmpwi r6,0 1c: 41 82 00 0c beq 28 <__find_linux_pte+0x10> 20: 39 20 00 00 li r9,0 24: 91 26 00 00 stw r9,0(r6) 28: 2f 85 00 00 cmpwi cr7,r5,0 2c: 41 9e 00 0c beq cr7,38 <__find_linux_pte+0x20> 30: 39 20 00 00 li r9,0 34: 99 25 00 00 stb r9,0(r5) 38: 54 89 65 3a rlwinm r9,r4,12,20,29 3c: 7c 63 48 2e lwzx r3,r3,r9 40: 2f 83 00 00 cmpwi cr7,r3,0 44: 41 9e 00 30 beq cr7,74 <__find_linux_pte+0x5c> 48: 54 69 07 3a rlwinm r9,r3,0,28,29 4c: 2f 89 00 0c cmpwi cr7,r9,12 50: 54 63 00 26 clrrwi r3,r3,12 54: 54 84 b5 36 rlwinm r4,r4,22,20,27 58: 3c 63 c0 00 addis r3,r3,-16384 5c: 7c 63 22 14 add r3,r3,r4 60: 4c be 00 20 bnelr+ cr7 64: 4d 82 00 20 beqlr 68: 39 20 00 17 li r9,23 6c: 91 26 00 00 stw r9,0(r6) 70: 4e 80 00 20 blr 74: 38 60 00 00 li r3,0 78: 4e 80 00 20 blr Before this patch: 00000018 <__find_linux_pte>: 18: 2c 06 00 00 cmpwi r6,0 1c: 94 21 ff e0 stwu r1,-32(r1) 20: 41 82 00 0c beq 2c <__find_linux_pte+0x14> 24: 39 20 00 00 li r9,0 28: 91 26 00 00 stw r9,0(r6) 2c: 2f 85 00 00 cmpwi cr7,r5,0 30: 41 9e 00 0c beq cr7,3c <__find_linux_pte+0x24> 34: 39 20 00 00 li r9,0 38: 99 25 00 00 stb r9,0(r5) 3c: 54 89 65 3a rlwinm r9,r4,12,20,29 40: 7c 63 48 2e lwzx r3,r3,r9 44: 54 69 07 3a rlwinm r9,r3,0,28,29 48: 2f 89 00 0c cmpwi cr7,r9,12 4c: 90 61 00 0c stw r3,12(r1) 50: 41 9e 00 4c beq cr7,9c <__find_linux_pte+0x84> 54: 80 61 00 0c lwz r3,12(r1) 58: 54 69 07 3a rlwinm r9,r3,0,28,29 5c: 2f 89 00 0c cmpwi cr7,r9,12 60: 90 61 00 08 stw r3,8(r1) 64: 41 9e 00 38 beq cr7,9c <__find_linux_pte+0x84> 68: 80 61 00 08 lwz r3,8(r1) 6c: 2f 83 00 00 cmpwi cr7,r3,0 70: 41 9e 00 54 beq cr7,c4 <__find_linux_pte+0xac> 74: 54 69 07 3a rlwinm r9,r3,0,28,29 78: 2f 89 00 0c cmpwi cr7,r9,12 7c: 54 69 00 26 clrrwi r9,r3,12 80: 54 8a b5 36 rlwinm r10,r4,22,20,27 84: 3c 69 c0 00 addis r3,r9,-16384 88: 7c 63 52 14 add r3,r3,r10 8c: 54 84 93 be srwi r4,r4,14 90: 41 9e 00 14 beq cr7,a4 <__find_linux_pte+0x8c> 94: 38 21 00 20 addi r1,r1,32 98: 4e 80 00 20 blr 9c: 54 69 00 26 clrrwi r9,r3,12 a0: 54 84 93 be srwi r4,r4,14 a4: 3c 69 c0 00 addis r3,r9,-16384 a8: 54 84 25 36 rlwinm r4,r4,4,20,27 ac: 7c 63 22 14 add r3,r3,r4 b0: 41 a2 ff e4 beq 94 <__find_linux_pte+0x7c> b4: 39 20 00 17 li r9,23 b8: 91 26 00 00 stw r9,0(r6) bc: 38 21 00 20 addi r1,r1,32 c0: 4e 80 00 20 blr c4: 38 60 00 00 li r3,0 c8: 38 21 00 20 addi r1,r1,32 cc: 4e 80 00 20 blr Signed-off-by: Christophe Leroy Reviewed-by: Oscar Salvador --- v3: Removed p4dp and pudp locals for PPC32 and add a comment. v4: Properly set pdshift on PPC32 case v5: Enhanced commit message --- arch/powerpc/mm/pgtable.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 9e7ba9c3851f..bce8a8619589 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -382,8 +382,10 @@ pte_t *__find_linux_pte(pgd_t *pgdir, unsigned long ea, bool *is_thp, unsigned *hpage_shift) { pgd_t *pgdp; +#ifdef CONFIG_PPC64 p4d_t p4d, *p4dp; pud_t pud, *pudp; +#endif pmd_t pmd, *pmdp; pte_t *ret_pte; hugepd_t *hpdp = NULL; @@ -401,8 +403,12 @@ pte_t *__find_linux_pte(pgd_t *pgdir, unsigned long ea, * page fault or a page unmap. The return pte_t * is still not * stable. So should be checked there for above conditions. * Top level is an exception because it is folded into p4d. + * + * On PPC32, P4D/PUD/PMD are folded into PGD so go straight to + * PMD level. */ pgdp = pgdir + pgd_index(ea); +#ifdef CONFIG_PPC64 p4dp = p4d_offset(pgdp, ea); p4d = READ_ONCE(*p4dp); pdshift = P4D_SHIFT; @@ -442,8 +448,11 @@ pte_t *__find_linux_pte(pgd_t *pgdir, unsigned long ea, goto out_huge; } - pdshift = PMD_SHIFT; pmdp = pmd_offset(&pud, ea); +#else + pmdp = pmd_offset(pud_offset(p4d_offset(pgdp, ea), ea), ea); +#endif + pdshift = PMD_SHIFT; pmd = READ_ONCE(*pmdp); /*