Re: [PATCH 08/12] parisc: use pgtable-nopXd instead of 4level-fixup

2019-10-23 Thread Rolf Eike Beer
diff --git a/arch/parisc/include/asm/page.h 
b/arch/parisc/include/asm/page.h

index 93caf17..1d339ee 100644
--- a/arch/parisc/include/asm/page.h
+++ b/arch/parisc/include/asm/page.h
@@ -42,48 +42,54 @@ typedef struct { unsigned long pte; } pte_t; /*
either 32 or 64bit */

 /* NOTE: even on 64 bits, these entries are __u32 because we allocate
  * the pmd and pgd in ZONE_DMA (i.e. under 4GB) */
-typedef struct { __u32 pmd; } pmd_t;
 typedef struct { __u32 pgd; } pgd_t;
 typedef struct { unsigned long pgprot; } pgprot_t;

-#define pte_val(x) ((x).pte)
-/* These do not work lvalues, so make sure we don't use them as such. 
*/

+#if CONFIG_PGTABLE_LEVELS == 3
+typedef struct { __u32 pmd; } pmd_t;
+#define __pmd(x)   ((pmd_t) { (x) } )
+/* pXd_val() do not work lvalues, so make sure we don't use them as 
such. */


For me it sounds like there is something missing, maybe an "as" before 
lvalues?

And it was "These", so plural, and now it is singular, so do -> does?

Eike


[PATCH 08/12] parisc: use pgtable-nopXd instead of 4level-fixup

2019-10-23 Thread Mike Rapoport
From: Mike Rapoport 

parisc has two or three levels of page tables and can use appropriate
pgtable-nopXd and folding of the upper layers.

Replace usage of include/asm-generic/4level-fixup.h and explicit
definitions of __PAGETABLE_PxD_FOLDED in parisc with
include/asm-generic/pgtable-nopmd.h for two-level configurations and with
include/asm-generic/pgtable-nopmd.h for three-lelve configurations and
adjust page table manipulation macros and functions accordingly.

Signed-off-by: Mike Rapoport 
---
 arch/parisc/include/asm/page.h| 30 +-
 arch/parisc/include/asm/pgalloc.h | 41 +++---
 arch/parisc/include/asm/pgtable.h | 52 +++
 arch/parisc/include/asm/tlb.h |  2 ++
 arch/parisc/kernel/cache.c| 13 ++
 arch/parisc/kernel/pci-dma.c  |  9 +--
 arch/parisc/mm/fixmap.c   | 10 +---
 7 files changed, 81 insertions(+), 76 deletions(-)

diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
index 93caf17..1d339ee 100644
--- a/arch/parisc/include/asm/page.h
+++ b/arch/parisc/include/asm/page.h
@@ -42,48 +42,54 @@ typedef struct { unsigned long pte; } pte_t; /* either 32 
or 64bit */
 
 /* NOTE: even on 64 bits, these entries are __u32 because we allocate
  * the pmd and pgd in ZONE_DMA (i.e. under 4GB) */
-typedef struct { __u32 pmd; } pmd_t;
 typedef struct { __u32 pgd; } pgd_t;
 typedef struct { unsigned long pgprot; } pgprot_t;
 
-#define pte_val(x) ((x).pte)
-/* These do not work lvalues, so make sure we don't use them as such. */
+#if CONFIG_PGTABLE_LEVELS == 3
+typedef struct { __u32 pmd; } pmd_t;
+#define __pmd(x)   ((pmd_t) { (x) } )
+/* pXd_val() do not work lvalues, so make sure we don't use them as such. */
 #define pmd_val(x) ((x).pmd + 0)
+#endif
+
+#define pte_val(x) ((x).pte)
 #define pgd_val(x) ((x).pgd + 0)
 #define pgprot_val(x)  ((x).pgprot)
 
 #define __pte(x)   ((pte_t) { (x) } )
-#define __pmd(x)   ((pmd_t) { (x) } )
 #define __pgd(x)   ((pgd_t) { (x) } )
 #define __pgprot(x)((pgprot_t) { (x) } )
 
-#define __pmd_val_set(x,n) (x).pmd = (n)
-#define __pgd_val_set(x,n) (x).pgd = (n)
-
 #else
 /*
  * .. while these make it easier on the compiler
  */
 typedef unsigned long pte_t;
+
+#if CONFIG_PGTABLE_LEVELS == 3
 typedef __u32 pmd_t;
+#define pmd_val(x)  (x)
+#define __pmd(x)   (x)
+#endif
+
 typedef __u32 pgd_t;
 typedef unsigned long pgprot_t;
 
 #define pte_val(x)  (x)
-#define pmd_val(x)  (x)
 #define pgd_val(x)  (x)
 #define pgprot_val(x)   (x)
 
 #define __pte(x)(x)
-#define __pmd(x)   (x)
 #define __pgd(x)(x)
 #define __pgprot(x) (x)
 
-#define __pmd_val_set(x,n) (x) = (n)
-#define __pgd_val_set(x,n) (x) = (n)
-
 #endif /* STRICT_MM_TYPECHECKS */
 
+#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
+#if CONFIG_PGTABLE_LEVELS == 3
+#define set_pud(pudptr, pudval) (*(pudptr) = (pudval))
+#endif
+
 typedef struct page *pgtable_t;
 
 typedef struct __physmem_range {
diff --git a/arch/parisc/include/asm/pgalloc.h 
b/arch/parisc/include/asm/pgalloc.h
index d98647c..9ac74da 100644
--- a/arch/parisc/include/asm/pgalloc.h
+++ b/arch/parisc/include/asm/pgalloc.h
@@ -34,13 +34,13 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
/* Populate first pmd with allocated memory.  We mark it
 * with PxD_FLAG_ATTACHED as a signal to the system that this
 * pmd entry may not be cleared. */
-   __pgd_val_set(*actual_pgd, (PxD_FLAG_PRESENT | 
-   PxD_FLAG_VALID | 
-   PxD_FLAG_ATTACHED) 
-   + (__u32)(__pa((unsigned long)pgd) >> PxD_VALUE_SHIFT));
+   set_pgd(actual_pgd, __pgd((PxD_FLAG_PRESENT |
+   PxD_FLAG_VALID |
+   PxD_FLAG_ATTACHED)
+   + (__u32)(__pa((unsigned long)pgd) >> 
PxD_VALUE_SHIFT)));
/* The first pmd entry also is marked with PxD_FLAG_ATTACHED as
 * a signal that this pmd may not be freed */
-   __pgd_val_set(*pgd, PxD_FLAG_ATTACHED);
+   set_pgd(pgd, __pgd(PxD_FLAG_ATTACHED));
 #endif
}
spin_lock_init(pgd_spinlock(actual_pgd));
@@ -59,10 +59,10 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t 
*pgd)
 
 /* Three Level Page Table Support for pmd's */
 
-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
+static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
 {
-   __pgd_val_set(*pgd, (PxD_FLAG_PRESENT | PxD_FLAG_VALID) +
-   (__u32)(__pa((unsigned long)pmd) >> PxD_VALUE_SHIFT));
+   set_pud(pud, __pud((PxD_FLAG_PRESENT | PxD_FLAG_VALID) +
+   (__u32)(__pa((unsigned long)pmd) >> PxD_VALUE_SHIFT)));
 }
 
 static inline