[PATCH kvm-unit-tests 14/18] arm: get rid of pud

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We do not need four levels of page tables in either 32-bit or 64-bit
ARM, so remove the useless indirection.

Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
---
 lib/arm/asm/page.h            |  4 ----
 lib/arm/asm/pgtable.h         | 22 ++++++++--------------
 lib/arm/mmu.c                 |  3 +--
 lib/arm64/asm/page.h          | 12 +++---------
 lib/arm64/asm/pgtable-hwdef.h | 17 ++---------------
 lib/arm64/asm/pgtable.h       | 10 ++--------
 6 files changed, 16 insertions(+), 52 deletions(-)

diff --git a/lib/arm/asm/page.h b/lib/arm/asm/page.h
index 3802641..fc1b30e 100644
--- a/lib/arm/asm/page.h
+++ b/lib/arm/asm/page.h
@@ -34,10 +34,6 @@ typedef struct { pteval_t pgprot; } pgprot_t;
 #define __pgd(x)		((pgd_t) { (x) } )
 #define __pgprot(x)		((pgprot_t) { (x) } )
 
-typedef struct { pgd_t pgd; } pud_t;
-#define pud_val(x)		(pgd_val((x).pgd))
-#define __pud(x)		((pud_t) { __pgd(x) } )
-
 #ifndef __virt_to_phys
 #define __phys_to_virt(x)	((unsigned long) (x))
 #define __virt_to_phys(x)	(x)
diff --git a/lib/arm/asm/pgtable.h b/lib/arm/asm/pgtable.h
index a38f5da..27603db 100644
--- a/lib/arm/asm/pgtable.h
+++ b/lib/arm/asm/pgtable.h
@@ -4,7 +4,6 @@
  * Adapted from arch/arm/include/asm/pgtable.h
  *              arch/arm/include/asm/pgtable-3level.h
  *              arch/arm/include/asm/pgalloc.h
- *              include/asm-generic/pgtable-nopud.h
  *
  * Note: some Linux function APIs have been modified. Nothing crazy,
  *       but if a function took, for example, an mm_struct, then
@@ -16,7 +15,6 @@
  */
 
 #define pgd_none(pgd)		(!pgd_val(pgd))
-#define pud_none(pud)		(!pud_val(pud))
 #define pmd_none(pmd)		(!pmd_val(pmd))
 #define pte_none(pte)		(!pte_val(pte))
 
@@ -32,19 +30,15 @@ static inline pgd_t *pgd_alloc(void)
 	return pgd;
 }
 
-#define pud_offset(pgd, addr)	((pud_t *)pgd)
-#define pud_free(pud)
-#define pud_alloc(pgd, addr)	pud_offset(pgd, addr)
-
-static inline pmd_t *pud_page_vaddr(pud_t pud)
+static inline pmd_t *pgd_page_vaddr(pgd_t pgd)
 {
-	return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK);
+	return __va(pgd_val(pgd) & PHYS_MASK & (s32)PAGE_MASK);
 }
 
 #define pmd_index(addr) \
 	(((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
-#define pmd_offset(pud, addr) \
-	(pud_page_vaddr(*(pud)) + pmd_index(addr))
+#define pmd_offset(pgd, addr) \
+	(pgd_page_vaddr(*(pgd)) + pmd_index(addr))
 
 #define pmd_free(pmd) free(pmd)
 static inline pmd_t *pmd_alloc_one(void)
@@ -53,13 +47,13 @@ static inline pmd_t *pmd_alloc_one(void)
 	memset(pmd, 0, PTRS_PER_PMD * sizeof(pmd_t));
 	return pmd;
 }
-static inline pmd_t *pmd_alloc(pud_t *pud, unsigned long addr)
+static inline pmd_t *pmd_alloc(pgd_t *pgd, unsigned long addr)
 {
-	if (pud_none(*pud)) {
+	if (pgd_none(*pgd)) {
 		pmd_t *pmd = pmd_alloc_one();
-		pud_val(*pud) = __pa(pmd) | PMD_TYPE_TABLE;
+		pgd_val(*pgd) = __pa(pmd) | PMD_TYPE_TABLE;
 	}
-	return pmd_offset(pud, addr);
+	return pmd_offset(pgd, addr);
 }
 
 static inline pte_t *pmd_page_vaddr(pmd_t pmd)
diff --git a/lib/arm/mmu.c b/lib/arm/mmu.c
index 227e25b..4e7581d 100644
--- a/lib/arm/mmu.c
+++ b/lib/arm/mmu.c
@@ -81,8 +81,7 @@ void mmu_set_range_ptes(pgd_t *pgtable, unsigned long virt_offset,
 
 	for (; vaddr < virt_end; vaddr += PAGE_SIZE, paddr += PAGE_SIZE) {
 		pgd_t *pgd = pgd_offset(pgtable, vaddr);
-		pud_t *pud = pud_alloc(pgd, vaddr);
-		pmd_t *pmd = pmd_alloc(pud, vaddr);
+		pmd_t *pmd = pmd_alloc(pgd, vaddr);
 		pte_t *pte = pte_alloc(pmd, vaddr);
 
 		pte_val(*pte) = paddr;
diff --git a/lib/arm64/asm/page.h b/lib/arm64/asm/page.h
index 35ea0ed..01b4cf6 100644
--- a/lib/arm64/asm/page.h
+++ b/lib/arm64/asm/page.h
@@ -3,7 +3,6 @@
 /*
  * Adapted from
  *   arch/arm64/include/asm/pgtable-types.h
- *   include/asm-generic/pgtable-nopud.h
  *   include/asm-generic/pgtable-nopmd.h
  *
  * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@xxxxxxxxxx>
@@ -28,7 +27,6 @@
 
 typedef u64 pteval_t;
 typedef u64 pmdval_t;
-typedef u64 pudval_t;
 typedef u64 pgdval_t;
 typedef struct { pteval_t pte; } pte_t;
 typedef struct { pgdval_t pgd; } pgd_t;
@@ -42,13 +40,9 @@ typedef struct { pteval_t pgprot; } pgprot_t;
 #define __pgd(x)		((pgd_t) { (x) } )
 #define __pgprot(x)		((pgprot_t) { (x) } )
 
-typedef struct { pgd_t pgd; } pud_t;
-#define pud_val(x)		(pgd_val((x).pgd))
-#define __pud(x)		((pud_t) { __pgd(x) } )
-
-typedef struct { pud_t pud; } pmd_t;
-#define pmd_val(x)		(pud_val((x).pud))
-#define __pmd(x)		((pmd_t) { __pud(x) } )
+typedef struct { pgd_t pgd; } pmd_t;
+#define pmd_val(x)		(pgd_val((x).pgd))
+#define __pmd(x)		((pmd_t) { __pgd(x) } )
 
 #ifndef __virt_to_phys
 #define __phys_to_virt(x)	((unsigned long) (x))
diff --git a/lib/arm64/asm/pgtable-hwdef.h b/lib/arm64/asm/pgtable-hwdef.h
index 8e9c295..045a3ce 100644
--- a/lib/arm64/asm/pgtable-hwdef.h
+++ b/lib/arm64/asm/pgtable-hwdef.h
@@ -22,13 +22,8 @@
 #define PGDIR_MASK		(~(PGDIR_SIZE-1))
 #define PTRS_PER_PGD		(1 << (VA_BITS - PGDIR_SHIFT))
 
-/* From include/asm-generic/pgtable-nopud.h */
-#define PUD_SHIFT		PGDIR_SHIFT
-#define PTRS_PER_PUD		1
-#define PUD_SIZE		(UL(1) << PUD_SHIFT)
-#define PUD_MASK		(~(PUD_SIZE-1))
 /* From include/asm-generic/pgtable-nopmd.h */
-#define PMD_SHIFT		PUD_SHIFT
+#define PMD_SHIFT		PGDIR_SHIFT
 #define PTRS_PER_PMD		1
 #define PMD_SIZE		(UL(1) << PMD_SHIFT)
 #define PMD_MASK		(~(PMD_SIZE-1))
@@ -43,15 +38,7 @@
 /*
  * Hardware page table definitions.
  *
- * Level 1 descriptor (PUD).
- */
-#define PUD_TYPE_TABLE		(_AT(pudval_t, 3) << 0)
-#define PUD_TABLE_BIT		(_AT(pgdval_t, 1) << 1)
-#define PUD_TYPE_MASK		(_AT(pgdval_t, 3) << 0)
-#define PUD_TYPE_SECT		(_AT(pgdval_t, 1) << 0)
-
-/*
- * Level 2 descriptor (PMD).
+ * Level 1 descriptor (PMD).
  */
 #define PMD_TYPE_MASK		(_AT(pmdval_t, 3) << 0)
 #define PMD_TYPE_FAULT		(_AT(pmdval_t, 0) << 0)
diff --git a/lib/arm64/asm/pgtable.h b/lib/arm64/asm/pgtable.h
index 217cdb6..14d7e3c 100644
--- a/lib/arm64/asm/pgtable.h
+++ b/lib/arm64/asm/pgtable.h
@@ -3,7 +3,6 @@
 /*
  * Adapted from arch/arm64/include/asm/pgtable.h
  *              include/asm-generic/pgtable-nopmd.h
- *              include/asm-generic/pgtable-nopud.h
  *              include/linux/mm.h
  *
  * Note: some Linux function APIs have been modified. Nothing crazy,
@@ -20,7 +19,6 @@
 #include <asm/pgtable-hwdef.h>
 
 #define pgd_none(pgd)		(!pgd_val(pgd))
-#define pud_none(pud)		(!pud_val(pud))
 #define pmd_none(pmd)		(!pmd_val(pmd))
 #define pte_none(pte)		(!pte_val(pte))
 
@@ -36,13 +34,9 @@ static inline pgd_t *pgd_alloc(void)
 	return pgd;
 }
 
-#define pud_offset(pgd, addr)	((pud_t *)pgd)
-#define pud_free(pud)
-#define pud_alloc(pgd, addr)	pud_offset(pgd, addr)
-
-#define pmd_offset(pud, addr)	((pmd_t *)pud)
+#define pmd_offset(pgd, addr)	((pmd_t *)pgd)
 #define pmd_free(pmd)
-#define pmd_alloc(pud, addr)	pmd_offset(pud, addr)
+#define pmd_alloc(pgd, addr)	pmd_offset(pgd, addr)
 
 static inline pte_t *pmd_page_vaddr(pmd_t pmd)
 {
-- 
2.14.2






[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux