mips: add support for folded p4d page tables
Implement primitives necessary for the 4th level folding, add walks of p4d level where appropriate, replace 5leve-fixup.h with pgtable-nop4d.h and drop usage of __ARCH_USE_5LEVEL_HACK. Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Paul Burton <paulburton@kernel.org> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: James Hogan <jhogan@kernel.org> Cc: linux-mips@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org Cc: Mike Rapoport <rppt@kernel.org>
This commit is contained in:

committed by
Paul Burton

parent
31168f033e
commit
2bee1b5848
@@ -136,6 +136,7 @@ pgd_t *kvm_pgd_alloc(void)
|
||||
static pte_t *kvm_mips_walk_pgd(pgd_t *pgd, struct kvm_mmu_memory_cache *cache,
|
||||
unsigned long addr)
|
||||
{
|
||||
p4d_t *p4d;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
|
||||
@@ -145,7 +146,8 @@ static pte_t *kvm_mips_walk_pgd(pgd_t *pgd, struct kvm_mmu_memory_cache *cache,
|
||||
BUG();
|
||||
return NULL;
|
||||
}
|
||||
pud = pud_offset(pgd, addr);
|
||||
p4d = p4d_offset(pgd, addr);
|
||||
pud = pud_offset(p4d, addr);
|
||||
if (pud_none(*pud)) {
|
||||
pmd_t *new_pmd;
|
||||
|
||||
@@ -258,6 +260,7 @@ static bool kvm_mips_flush_gpa_pud(pud_t *pud, unsigned long start_gpa,
|
||||
static bool kvm_mips_flush_gpa_pgd(pgd_t *pgd, unsigned long start_gpa,
|
||||
unsigned long end_gpa)
|
||||
{
|
||||
p4d_t *p4d;
|
||||
pud_t *pud;
|
||||
unsigned long end = ~0ul;
|
||||
int i_min = pgd_index(start_gpa);
|
||||
@@ -269,7 +272,8 @@ static bool kvm_mips_flush_gpa_pgd(pgd_t *pgd, unsigned long start_gpa,
|
||||
if (!pgd_present(pgd[i]))
|
||||
continue;
|
||||
|
||||
pud = pud_offset(pgd + i, 0);
|
||||
p4d = p4d_offset(pgd, 0);
|
||||
pud = pud_offset(p4d + i, 0);
|
||||
if (i == i_max)
|
||||
end = end_gpa;
|
||||
|
||||
@@ -378,6 +382,7 @@ static int kvm_mips_##name##_pgd(pgd_t *pgd, unsigned long start, \
|
||||
unsigned long end) \
|
||||
{ \
|
||||
int ret = 0; \
|
||||
p4d_t *p4d; \
|
||||
pud_t *pud; \
|
||||
unsigned long cur_end = ~0ul; \
|
||||
int i_min = pgd_index(start); \
|
||||
@@ -388,7 +393,8 @@ static int kvm_mips_##name##_pgd(pgd_t *pgd, unsigned long start, \
|
||||
if (!pgd_present(pgd[i])) \
|
||||
continue; \
|
||||
\
|
||||
pud = pud_offset(pgd + i, 0); \
|
||||
p4d = p4d_offset(pgd, 0); \
|
||||
pud = pud_offset(p4d + i, 0); \
|
||||
if (i == i_max) \
|
||||
cur_end = end; \
|
||||
\
|
||||
@@ -916,6 +922,7 @@ static bool kvm_mips_flush_gva_pud(pud_t *pud, unsigned long start_gva,
|
||||
static bool kvm_mips_flush_gva_pgd(pgd_t *pgd, unsigned long start_gva,
|
||||
unsigned long end_gva)
|
||||
{
|
||||
p4d_t *p4d;
|
||||
pud_t *pud;
|
||||
unsigned long end = ~0ul;
|
||||
int i_min = pgd_index(start_gva);
|
||||
@@ -927,7 +934,8 @@ static bool kvm_mips_flush_gva_pgd(pgd_t *pgd, unsigned long start_gva,
|
||||
if (!pgd_present(pgd[i]))
|
||||
continue;
|
||||
|
||||
pud = pud_offset(pgd + i, 0);
|
||||
p4d = p4d_offset(pgd, 0);
|
||||
pud = pud_offset(p4d + i, 0);
|
||||
if (i == i_max)
|
||||
end = end_gva;
|
||||
|
||||
|
Reference in New Issue
Block a user