From d6f51ddf2a29c7278443f03a20a3db9649f14446 Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" Date: Mon, 9 Nov 2015 22:47:10 +0200 Subject: [PATCH 1/4] x86/asm: Fix pud/pmd interfaces to handle large PAT bit On Mon, Nov 09, 2015 at 02:39:31PM -0500, Boris Ostrovsky wrote: > On 11/09/2015 02:16 PM, Toshi Kani wrote: > >On Mon, 2015-11-09 at 13:06 -0500, Boris Ostrovsky wrote: > >>On 09/17/2015 02:24 PM, Toshi Kani wrote: > >>>Now that we have pud/pmd mask interfaces, which handle pfn & flags > >>>mask properly for the large PAT bit. > >>> > >>>Fix pud/pmd pfn & flags interfaces by replacing PTE_PFN_MASK and > >>>PTE_FLAGS_MASK with the pud/pmd mask interfaces. > >>> > >>>Suggested-by: Juergen Gross > >>>Signed-off-by: Toshi Kani > >>>Cc: Juergen Gross > >>>Cc: Konrad Wilk > >>>Cc: Thomas Gleixner > >>>Cc: H. Peter Anvin > >>>Cc: Ingo Molnar > >>>Cc: Borislav Petkov > >>>--- > >>> arch/x86/include/asm/pgtable.h | 14 ++++++++------ > >>> arch/x86/include/asm/pgtable_types.h | 4 ++-- > >>> 2 files changed, 10 insertions(+), 8 deletions(-) > >>> > >> > >>Looks like this commit is causing this splat for 32-bit kernels. I am > >>attaching my config file, just in case. > >Thanks for the report! I'd like to reproduce the issue since I am not sure how > >this change caused it... > > > >I tried to build a kernel with the attached config file, and got the following > >error. Not sure what I am missing. > > > >---- > >$ make -j24 ARCH=i386 > > : > > LD drivers/built-in.o > > LINK vmlinux > >./.config: line 44: $'\r': command not found > > I wonder whether my email client added ^Ms to the file that I send. It > shouldn't have. > > >Makefile:929: recipe for target 'vmlinux' failed > >make: *** [vmlinux] Error 127 > >---- > > > >Do you have steps to reproduce the issue? Or do you see it during boot-time? > > This always happens just after system has booted, it may still be going over > init scripts. I am booting with ramdisk, don't know whether it has anything > to do with this problem. > > FWIW, it looks like pmd_pfn_mask() inline is causing this. Reverting it > alone makes this crash go away. Could you check the patch below? Signed-off-by: Konrad Rzeszutek Wilk --- arch/x86/include/asm/pgtable_types.h | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index dd5b0aa..c1e7972 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h @@ -279,17 +279,14 @@ static inline pmdval_t native_pmd_val(pmd_t pmd) static inline pudval_t pud_pfn_mask(pud_t pud) { if (native_pud_val(pud) & _PAGE_PSE) - return PUD_PAGE_MASK & PHYSICAL_PAGE_MASK; + return ~((1ULL << PUD_SHIFT) - 1) & PHYSICAL_PAGE_MASK; else return PTE_PFN_MASK; } static inline pudval_t pud_flags_mask(pud_t pud) { - if (native_pud_val(pud) & _PAGE_PSE) - return ~(PUD_PAGE_MASK & (pudval_t)PHYSICAL_PAGE_MASK); - else - return ~PTE_PFN_MASK; + return ~pud_pfn_mask(pud); } static inline pudval_t pud_flags(pud_t pud) @@ -300,17 +297,14 @@ static inline pudval_t pud_flags(pud_t pud) static inline pmdval_t pmd_pfn_mask(pmd_t pmd) { if (native_pmd_val(pmd) & _PAGE_PSE) - return PMD_PAGE_MASK & PHYSICAL_PAGE_MASK; + return ~((1ULL << PMD_SHIFT) - 1) & PHYSICAL_PAGE_MASK; else return PTE_PFN_MASK; } static inline pmdval_t pmd_flags_mask(pmd_t pmd) { - if (native_pmd_val(pmd) & _PAGE_PSE) - return ~(PMD_PAGE_MASK & (pmdval_t)PHYSICAL_PAGE_MASK); - else - return ~PTE_PFN_MASK; + return ~pmd_pfn_mask(pmd); } static inline pmdval_t pmd_flags(pmd_t pmd) -- 2.5.0