[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87efcoeudx.fsf@concordia.ellerman.id.au>
Date: Wed, 17 Oct 2018 21:32:10 +1100
From: Michael Ellerman <mpe@...erman.id.au>
To: Christophe Leroy <christophe.leroy@....fr>,
Bartlomiej Zolnierkiewicz <b.zolnierkie@...sung.com>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Dominik Brodowski <linux@...inikbrodowski.net>,
Geoff Levand <geoff@...radead.org>,
Jens Axboe <axboe@...nel.dk>,
Kumar Gala <galak@...nel.crashing.org>,
Li Yang <leoyang.li@....com>,
Nicholas Piggin <npiggin@...il.com>,
Paul Mackerras <paulus@...ba.org>,
Scott Wood <oss@...error.net>, aneesh.kumar@...ux.vnet.ibm.com
Cc: linux-arm-kernel@...ts.infradead.org, linux-block@...r.kernel.org,
linux-fbdev@...r.kernel.org, linux-kernel@...r.kernel.org,
linuxppc-dev@...ts.ozlabs.org, dri-devel@...ts.freedesktop.org
Subject: Re: Crash on FSL Book3E due to pte_pgprot()? (was Re: [PATCH v3 12/24] powerpc/mm: use pte helpers in generic code)
Christophe Leroy <christophe.leroy@....fr> writes:
> On 10/17/2018 12:59 AM, Michael Ellerman wrote:
...
>> The question is what's the right way to fix it? Should pte_pgprot() not
>> be filtering those bits out on book3e?
>
> I think we should not use pte_pggrot() for that then. What about the
> below fix ?
Thanks, that almost works.
pte_mkprivileged() also needs to not strip _PAGE_BAP_SR.
But there's also a use of pte_pgprot() in mm/memory.c, and I think that
is also broken now that we don't add PAGE_KERNEL back in.
Aneesh is going to do a patch to make pte_pgprot() only mask the PFN
which is what other arches do.
cheers
> From: Christophe Leroy <christophe.leroy@....fr>
> Date: Wed, 17 Oct 2018 05:56:25 +0000
> Subject: [PATCH] powerpc/mm: don't use pte_pgprot() in ioremap_prot()
>
> pte_pgprot() filters out some required flags like _PAGE_PRESENT.
>
> This patch replaces pte_pgprot() by __pgprot(pte_val())
> in ioremap_prot()
>
> Fixes: 26973fa5ac0e ("powerpc/mm: use pte helpers in generic code")
> Signed-off-by: Christophe Leroy <christophe.leroy@....fr>
> ---
> arch/powerpc/mm/pgtable_32.c | 3 ++-
> arch/powerpc/mm/pgtable_64.c | 4 ++--
> 2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
> index 5877f5aa8f5d..a606e2f4937b 100644
> --- a/arch/powerpc/mm/pgtable_32.c
> +++ b/arch/powerpc/mm/pgtable_32.c
> @@ -122,7 +122,8 @@ ioremap_prot(phys_addr_t addr, unsigned long size,
> unsigned long flags)
> pte = pte_exprotect(pte);
> pte = pte_mkprivileged(pte);
>
> - return __ioremap_caller(addr, size, pte_pgprot(pte),
> __builtin_return_address(0));
> + return __ioremap_caller(addr, size, __pgprot(pte_val(pte)),
> + __builtin_return_address(0));
> }
> EXPORT_SYMBOL(ioremap_prot);
>
> diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c
> index fb1375c07e8c..836bf436cabb 100644
> --- a/arch/powerpc/mm/pgtable_64.c
> +++ b/arch/powerpc/mm/pgtable_64.c
> @@ -245,8 +245,8 @@ void __iomem * ioremap_prot(phys_addr_t addr,
> unsigned long size,
> pte = pte_mkprivileged(pte);
>
> if (ppc_md.ioremap)
> - return ppc_md.ioremap(addr, size, pte_pgprot(pte), caller);
> - return __ioremap_caller(addr, size, pte_pgprot(pte), caller);
> + return ppc_md.ioremap(addr, size, __pgprot(pte_val(pte)), caller);
> + return __ioremap_caller(addr, size, __pgprot(pte_val(pte)), caller);
> }
>
>
> --
> 2.13.3
Powered by blists - more mailing lists