From patchwork Mon Jun 24 14:45:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Leroy X-Patchwork-Id: 13709624 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 91405C2BD09 for ; Mon, 24 Jun 2024 14:46:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1F9336B03E3; Mon, 24 Jun 2024 10:46:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1A9606B03E5; Mon, 24 Jun 2024 10:46:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 022856B03E7; Mon, 24 Jun 2024 10:46:50 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id D94316B03E3 for ; Mon, 24 Jun 2024 10:46:50 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 8D916120FFA for ; Mon, 24 Jun 2024 14:46:50 +0000 (UTC) X-FDA: 82266058980.01.16F4781 Received: from pegase1.c-s.fr (pegase1.c-s.fr [93.17.236.30]) by imf14.hostedemail.com (Postfix) with ESMTP id 4E22210000D for ; Mon, 24 Jun 2024 14:46:48 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=csgroup.eu; spf=pass (imf14.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=1719240395; 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=I8vQpQ1rZeJvViqNX4Wlu0JR1OaLpcn38af5Q49wlvGqVoUuzg9X0mp3NIGU1uALp895SM 3tlqQqyHca2shORpG/yurLWG9FMG2BCTpgq2uriRnanz4nNmrIFFlq1CLZoFzTawgRaS9i hgudc+pFZ93vmNU3fdPYD1IllKQUAII= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719240395; a=rsa-sha256; cv=none; b=DIgeuEcxBMhBiM7RqKJqsGeBVVomWtO7yPMkxcRCcbiBCzWr0FNv/tsd5DL8uNV5irSwwb JZCo4y1ESn7tjF5bFCHRKTaQjVm/BWUSTrBiulknt724lHc0IKJLnSiYjdb6447ub59hV9 KHBzcYjMojrpKMwaWK7UDcGoDNrGJZM= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=csgroup.eu; spf=pass (imf14.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 4W79kn0kLlz9vGD; Mon, 24 Jun 2024 16:46:09 +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 U1fcgMW5sVgy; Mon, 24 Jun 2024 16:46:09 +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 4W79kh2qRPz9vDm; Mon, 24 Jun 2024 16:46:04 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 5BAC68B76D; Mon, 24 Jun 2024 16:46:04 +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 hFDsl1EDVmHi; Mon, 24 Jun 2024 16:46:04 +0200 (CEST) Received: from PO20335.idsi0.si.c-s.fr (unknown [192.168.233.33]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 925798B766; Mon, 24 Jun 2024 16:46:03 +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 v6 10/23] powerpc/mm: Fix __find_linux_pte() on 32 bits with PMD leaf entries Date: Mon, 24 Jun 2024 16:45:36 +0200 Message-ID: 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=1719240334; l=5393; i=christophe.leroy@csgroup.eu; s=20211009; h=from:subject:message-id; bh=CWlk/wMDjpU6vF1ScRB8cosnmevy/J5Gz15W8u/6MPI=; b=iyM+xiUQDRf/JpRC3SsOLdMp3/Rsgrpzfp+ZcvBBScJXQv4LKFMrFDKlwbEKbo4ZaGXJe/b49 /D7ScX1ZNXlDtI5KzM+09OQgIxemuIWjReVUtA7qnp5yzvwYdulRmjh X-Developer-Key: i=christophe.leroy@csgroup.eu; a=ed25519; pk=HIzTzUj91asvincQGOFx6+ZF5AoUuP9GdOtQChs7Mm0= X-Rspamd-Queue-Id: 4E22210000D X-Stat-Signature: uew99ep15zgqypzpuzqaarzgoaskf8mf X-Rspamd-Server: rspam09 X-Rspam-User: X-HE-Tag: 1719240408-721788 X-HE-Meta: U2FsdGVkX1+p2YvT8abJsNdcXYiitUMcqjfWpMOl0VY+bZYBb3uB4R4ptAHo3/Zs5pEahU80Mm919wrdqI5I6xoHCwlHU9gXRlMVj72jn1hNiJ//ni7bQFgY5wO+tmJ6MAgrsDv81mjicFkXnJauqTlmCUUCTeczdsyeUqUzivX/TOSQhkZlN9zJ7D+upYGyEPWau32oYBFuwp2JjIoKToz3aLBmUlrc3dCtFblZm3UXUfGMy1io41WNaKpip4k6PisCJfvQc7IzGbh2XCRLSt9DnF42Sfxc9+24Cxp4QmHcLa4jHMgikw2rLPHjKCNlmJ+q0PyJmAPYhhejBBmoYSBIJm0eyclqqI6CJ/Y8aP9663EIA7QjDhGjK+7VKrvk8sTEjvXqGujKFaw7HbHBUC3qe1BF6G1Lc79THEQldBjcsBkV10eEI4cUYrG4U8vF5CWLAtw1HvRC8n2AdHM5QATJpqT1pbmL+txjnn8q2uOgjsRuEvXdLfSr9fKLSCeOiqqBugVfXywJCsdOxG3LtLrRMCMfpis4g0ciw8GIcPDRyDlAqSwAFNUA9yxYFPJ0S9WE4ANO5020AVrAWjxBjjoZz5fA0ZeVeALya/D8Y2HYbsoJWwBnT9j5dw3TRNC98pc6nQtH2fzfGSEKSX7eU8NgIkC9W33wIZRQi2OccfMQCckbiOb8rcf5kPjWlJ7FhPiaY35uf17V2aS/veSBP9aQ8N1ETsaKh4ib9kJOkTfJ27Qy6YVRQU56yp7oP/EPg6w4RTCo/E+z030lVwrOMXik2/XjugZDnb8nd5h6FXNqP6NtMreqPynSS9k+8n7RPuo8+LTw7x80wP++jtUbRy0qptzX6cgi6zXFz/c5IVuLxBXwXbLjRfxSuczKR77A6QYfJJ9dad0HeZkg2HisVCRICLEfLJMdvzMKBE1p4IeOQHjyLsTuKooRtQaH/PVLc/PR/Lb/OJbXVy0Qmu6 bxpXDOrf AKiKunteVoG01i/j7gdECHXd7RCEyp6RKqD4QieG7wwgv/uK+qm6xMnFQVA+krt8d///ghqOwfrxOx+6S1FySNiamMrPbQKqapOBsQsfpBI/4Ylp2uBocqQjfHoU/eKCYHjLt2cYSSKA+kdZSf1fwzSQKeqsEVte+8HFjqQN9fhN7wcg= 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); /*