aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/include
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2012-10-01 06:58:34 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-10-09 08:16:56 -0400
commit378b1e7a80a59325ca1036e892462db728126f84 (patch)
tree6d25959ac7401eee48f76441ca42c2759aef15b4 /arch/s390/include
parent521b3d790c16fad9d83c72d610c1e416ad3f7ae3 (diff)
s390/mm: fix pmd_huge() usage for kernel mapping
pmd_huge() will always return 0 on !HUGETLBFS, however we use that helper function when walking the kernel page tables to decide if we have a 1MB page frame or not. Since we create 1MB frames for the kernel 1:1 mapping independently of HUGETLBFS this can lead to incorrect storage accesses since the code can assume that we have a pointer to a page table instead of a pointer to a 1MB frame. Fix this by adding a pmd_large() primitive like other architectures have it already and remove all references to HUGETLBFS/HUGETLBPAGE from the code that walks kernel page tables. Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/include')
-rw-r--r--arch/s390/include/asm/pgtable.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
index 979fe3dc0788..75b91bb772bd 100644
--- a/arch/s390/include/asm/pgtable.h
+++ b/arch/s390/include/asm/pgtable.h
@@ -507,6 +507,15 @@ static inline int pmd_none(pmd_t pmd)
507 return (pmd_val(pmd) & _SEGMENT_ENTRY_INV) != 0UL; 507 return (pmd_val(pmd) & _SEGMENT_ENTRY_INV) != 0UL;
508} 508}
509 509
510static inline int pmd_large(pmd_t pmd)
511{
512#ifdef CONFIG_64BIT
513 return !!(pmd_val(pmd) & _SEGMENT_ENTRY_LARGE);
514#else
515 return 0;
516#endif
517}
518
510static inline int pmd_bad(pmd_t pmd) 519static inline int pmd_bad(pmd_t pmd)
511{ 520{
512 unsigned long mask = ~_SEGMENT_ENTRY_ORIGIN & ~_SEGMENT_ENTRY_INV; 521 unsigned long mask = ~_SEGMENT_ENTRY_ORIGIN & ~_SEGMENT_ENTRY_INV;