Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp814505pxk; Mon, 31 Aug 2020 01:32:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwvwo1GE6o0Wn7YQMegj226m/Jb6nQpakDrqMS+54omgE4CTYTL3LUY/GEKwgQqirnqQWQ/ X-Received: by 2002:a17:906:cf9d:: with SMTP id um29mr129584ejb.74.1598862757080; Mon, 31 Aug 2020 01:32:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598862757; cv=none; d=google.com; s=arc-20160816; b=AYkuZhhxPiPjMyQQjvV2V4CrkzVXcTxso3b4zFzzS/ysaHPpWKbKAG270uSOH1ZwzC 6VCZNoCqedJStot3imedLssoSQFzW95UmoCf6a8rCx8kCHUpjH/RhmEhbT5/StlG+xNx tIgyPEQVlQ7XvMtvq80Rj7kkk1Vcxqio3+NJ/5siOuwG0N66nwsw03s9DR/MGFogOWyH l21uYWEK4x2drjQIrg05LARxt4hp8hOBN+0bIIZSFS7Jj8fD3vxQXQrBSk3HMFm4ZZwv ZeJz47RFSETJBCIE+RLq9nhFutFScwLJiqIcIEQqn3pwgAf16fwtQzGIPQ/fgz1uBt7H bl/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:cc:to:subject:from:message-id; bh=pumbLq8MKChxUHRivUJd/eAfahjtNZzszwGxMftWIyU=; b=taKRctMZdfYoUMzlqKEu67LFYkk63puj86UVfWmZbx7LkbpQco0u7p54wg/T+sYWyJ VjOQG9gwCtd/e6zSBo3w+hQ3n9MgGaBmUhx3D+7SautQ3mN9JLKe2dnlzeLz9QRkkLCT aci6NPxlvBXHsIt1c9hRfz593fUsvbwxDDaAdY8YMysanj519ckAtVgfrp3ncNfzZSpX iZDfvmjr8UDtJYKJrCZAy4yOdGGMs5rsDgOEq2DVk0XzU3+5QNonVxjYmnI/yWqQImgD QEdQB7mK7pLtRO8v0IfHI6XHNDpBmHCM+tPUDTeeamPekW1sfCd/LxBhSvuPS+GDOy4o vAeA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id kt6si2073425ejb.276.2020.08.31.01.32.14; Mon, 31 Aug 2020 01:32:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728372AbgHaIat (ORCPT + 99 others); Mon, 31 Aug 2020 04:30:49 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:17519 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728083AbgHaIar (ORCPT ); Mon, 31 Aug 2020 04:30:47 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 4Bg3LR36qlz9v477; Mon, 31 Aug 2020 10:30:39 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id K6lQaRa8maTz; Mon, 31 Aug 2020 10:30:39 +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 4Bg3LR1m3Hz9v470; Mon, 31 Aug 2020 10:30:39 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 49AD48B79B; Mon, 31 Aug 2020 10:30:44 +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 zLN717HQK_Vm; Mon, 31 Aug 2020 10:30:44 +0200 (CEST) Received: from po17688vm.idsi0.si.c-s.fr (po15451.idsi0.si.c-s.fr [172.25.230.104]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 0F8548B799; Mon, 31 Aug 2020 10:30:44 +0200 (CEST) Received: by po17688vm.idsi0.si.c-s.fr (Postfix, from userid 0) id 7D05B65D48; Mon, 31 Aug 2020 08:30:43 +0000 (UTC) Message-Id: From: Christophe Leroy Subject: [PATCH 1/2] powerpc/8xx: Refactor calculation of number of entries per PTE in page tables To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Date: Mon, 31 Aug 2020 08:30:43 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 8xx, the number of entries occupied by a PTE in the page tables depends on the size of the page. At the time being, this calculation is done in two places: in pte_update() and in set_huge_pte_at() Refactor this calculation into a helper called number_of_cells_per_pte(). For the time being, the val param is unused. It will be used by following patch. Instead of opencoding is_hugepd(), use hugepd_ok() with a forward declaration. Signed-off-by: Christophe Leroy --- arch/powerpc/include/asm/nohash/32/pgtable.h | 18 ++++++++++++------ arch/powerpc/mm/pgtable.c | 6 ++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h index b9e134d0f03a..80bbc21b87f0 100644 --- a/arch/powerpc/include/asm/nohash/32/pgtable.h +++ b/arch/powerpc/include/asm/nohash/32/pgtable.h @@ -227,6 +227,17 @@ static inline void pmd_clear(pmd_t *pmdp) */ #ifdef CONFIG_PPC_8xx static pmd_t *pmd_off(struct mm_struct *mm, unsigned long addr); +static int hugepd_ok(hugepd_t hpd); + +static int number_of_cells_per_pte(pmd_t *pmd, pte_basic_t val, int huge) +{ + if (!huge) + return PAGE_SIZE / SZ_4K; + else if (hugepd_ok(*((hugepd_t *)pmd))) + return 1; + else + return SZ_512K / SZ_4K; +} static inline pte_basic_t pte_update(struct mm_struct *mm, unsigned long addr, pte_t *p, unsigned long clr, unsigned long set, int huge) @@ -237,12 +248,7 @@ static inline pte_basic_t pte_update(struct mm_struct *mm, unsigned long addr, p int num, i; pmd_t *pmd = pmd_off(mm, addr); - if (!huge) - num = PAGE_SIZE / SZ_4K; - else if ((pmd_val(*pmd) & _PMD_PAGE_MASK) != _PMD_PAGE_8M) - num = SZ_512K / SZ_4K; - else - num = 1; + num = number_of_cells_per_pte(pmd, new, huge); for (i = 0; i < num; i++, entry++, new += SZ_4K) *entry = new; diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 9c0547d77af3..2dcad640b869 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -266,8 +266,7 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ pmd_t *pmd = pmd_off(mm, addr); pte_basic_t val; pte_basic_t *entry = &ptep->pte; - int num = is_hugepd(*((hugepd_t *)pmd)) ? 1 : SZ_512K / SZ_4K; - int i; + int num, i; /* * Make sure hardware valid bit is not set. We don't do @@ -280,6 +279,9 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_ pte = set_pte_filter(pte); val = pte_val(pte); + + num = number_of_cells_per_pte(pmd, val, 1); + for (i = 0; i < num; i++, entry++, val += SZ_4K) *entry = val; } -- 2.25.0