Skip to content

Commit 7c2763c

Browse files
rppttorvalds
authored andcommitted
nds32: use pgtable-nopmd instead of 4level-fixup
nds32 has only two-level page tables and can use pgtable-nopmd and folding of the upper layers. Replace usage of include/asm-generic/4level-fixup.h and explicit definition of __PAGETABLE_PMD_FOLDED in nds32 with include/asm-generic/pgtable-nopmd.h and adjust page table manipulation macros and functions accordingly. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Mike Rapoport <[email protected]> Cc: Anatoly Pugachev <[email protected]> Cc: Anton Ivanov <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: "David S. Miller" <[email protected]> Cc: Geert Uytterhoeven <[email protected]> Cc: Greentime Hu <[email protected]> Cc: Greg Ungerer <[email protected]> Cc: Helge Deller <[email protected]> Cc: "James E.J. Bottomley" <[email protected]> Cc: Jeff Dike <[email protected]> Cc: "Kirill A. Shutemov" <[email protected]> Cc: Mark Salter <[email protected]> Cc: Matt Turner <[email protected]> Cc: Michal Simek <[email protected]> Cc: Peter Rosin <[email protected]> Cc: Richard Weinberger <[email protected]> Cc: Rolf Eike Beer <[email protected]> Cc: Russell King <[email protected]> Cc: Russell King <[email protected]> Cc: Sam Creasey <[email protected]> Cc: Vincent Chen <[email protected]> Cc: Vineet Gupta <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent ed48e1f commit 7c2763c

File tree

9 files changed

+47
-35
lines changed

9 files changed

+47
-35
lines changed

arch/nds32/include/asm/page.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,14 @@ void clear_page(void *page);
4141
void copy_page(void *to, void *from);
4242

4343
typedef unsigned long pte_t;
44-
typedef unsigned long pmd_t;
4544
typedef unsigned long pgd_t;
4645
typedef unsigned long pgprot_t;
4746

4847
#define pte_val(x) (x)
49-
#define pmd_val(x) (x)
5048
#define pgd_val(x) (x)
5149
#define pgprot_val(x) (x)
5250

5351
#define __pte(x) (x)
54-
#define __pmd(x) (x)
5552
#define __pgd(x) (x)
5653
#define __pgprot(x) (x)
5754

arch/nds32/include/asm/pgalloc.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
/*
1616
* Since we have only two-level page tables, these are trivial
1717
*/
18-
#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); })
19-
#define pmd_free(mm, pmd) do { } while (0)
20-
#define pgd_populate(mm, pmd, pte) BUG()
2118
#define pmd_pgtable(pmd) pmd_page(pmd)
2219

2320
extern pgd_t *pgd_alloc(struct mm_struct *mm);

arch/nds32/include/asm/pgtable.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
#ifndef _ASMNDS32_PGTABLE_H
55
#define _ASMNDS32_PGTABLE_H
66

7-
#define __PAGETABLE_PMD_FOLDED 1
8-
#include <asm-generic/4level-fixup.h>
7+
#include <asm-generic/pgtable-nopmd.h>
98
#include <linux/sizes.h>
109

1110
#include <asm/memory.h>
@@ -18,26 +17,20 @@
1817
#ifdef CONFIG_ANDES_PAGE_SIZE_4KB
1918
#define PGDIR_SHIFT 22
2019
#define PTRS_PER_PGD 1024
21-
#define PMD_SHIFT 22
22-
#define PTRS_PER_PMD 1
2320
#define PTRS_PER_PTE 1024
2421
#endif
2522

2623
#ifdef CONFIG_ANDES_PAGE_SIZE_8KB
2724
#define PGDIR_SHIFT 24
2825
#define PTRS_PER_PGD 256
29-
#define PMD_SHIFT 24
30-
#define PTRS_PER_PMD 1
3126
#define PTRS_PER_PTE 2048
3227
#endif
3328

3429
#ifndef __ASSEMBLY__
3530
extern void __pte_error(const char *file, int line, unsigned long val);
36-
extern void __pmd_error(const char *file, int line, unsigned long val);
3731
extern void __pgd_error(const char *file, int line, unsigned long val);
3832

3933
#define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte_val(pte))
40-
#define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd_val(pmd))
4134
#define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd))
4235
#endif /* !__ASSEMBLY__ */
4336

@@ -368,9 +361,6 @@ static inline pmd_t __mk_pmd(pte_t * ptep, unsigned long prot)
368361
/* to find an entry in a kernel page-table-directory */
369362
#define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
370363

371-
/* Find an entry in the second-level page table.. */
372-
#define pmd_offset(dir, addr) ((pmd_t *)(dir))
373-
374364
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
375365
{
376366
const unsigned long mask = 0xfff;

arch/nds32/include/asm/tlb.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,5 @@
77
#include <asm-generic/tlb.h>
88

99
#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
10-
#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tln)->mm, pmd)
1110

1211
#endif

arch/nds32/kernel/pm.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ unsigned int *phy_addr_sp_tmp;
1414
static void nds32_suspend2ram(void)
1515
{
1616
pgd_t *pgdv;
17+
p4d_t *p4dv;
1718
pud_t *pudv;
1819
pmd_t *pmdv;
1920
pte_t *ptev;
2021

2122
pgdv = (pgd_t *)__va((__nds32__mfsr(NDS32_SR_L1_PPTB) &
2223
L1_PPTB_mskBASE)) + pgd_index((unsigned int)cpu_resume);
2324

24-
pudv = pud_offset(pgdv, (unsigned int)cpu_resume);
25+
p4dv = p4d_offset(pgdv, (unsigned int)cpu_resume);
26+
pudv = pud_offset(p4dv, (unsigned int)cpu_resume);
2527
pmdv = pmd_offset(pudv, (unsigned int)cpu_resume);
2628
ptev = pte_offset_map(pmdv, (unsigned int)cpu_resume);
2729

arch/nds32/mm/fault.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
3131
pr_alert("[%08lx] *pgd=%08lx", addr, pgd_val(*pgd));
3232

3333
do {
34+
p4d_t *p4d;
35+
pud_t *pud;
3436
pmd_t *pmd;
3537

3638
if (pgd_none(*pgd))
@@ -41,7 +43,9 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
4143
break;
4244
}
4345

44-
pmd = pmd_offset(pgd, addr);
46+
p4d = p4d_offset(pgd, addr);
47+
pud = pud_offset(p4d, addr);
48+
pmd = pmd_offset(pud, addr);
4549
#if PTRS_PER_PMD != 1
4650
pr_alert(", *pmd=%08lx", pmd_val(*pmd));
4751
#endif
@@ -359,6 +363,7 @@ void do_page_fault(unsigned long entry, unsigned long addr,
359363

360364
unsigned int index = pgd_index(addr);
361365
pgd_t *pgd, *pgd_k;
366+
p4d_t *p4d, *p4d_k;
362367
pud_t *pud, *pud_k;
363368
pmd_t *pmd, *pmd_k;
364369
pte_t *pte_k;
@@ -369,8 +374,13 @@ void do_page_fault(unsigned long entry, unsigned long addr,
369374
if (!pgd_present(*pgd_k))
370375
goto no_context;
371376

372-
pud = pud_offset(pgd, addr);
373-
pud_k = pud_offset(pgd_k, addr);
377+
p4d = p4d_offset(pgd, addr);
378+
p4d_k = p4d_offset(pgd_k, addr);
379+
if (!p4d_present(*p4d_k))
380+
goto no_context;
381+
382+
pud = pud_offset(p4d, addr);
383+
pud_k = pud_offset(p4d_k, addr);
374384
if (!pud_present(*pud_k))
375385
goto no_context;
376386

arch/nds32/mm/init.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ static void __init map_ram(void)
5454
{
5555
unsigned long v, p, e;
5656
pgd_t *pge;
57+
p4d_t *p4e;
5758
pud_t *pue;
5859
pmd_t *pme;
5960
pte_t *pte;
@@ -69,7 +70,8 @@ static void __init map_ram(void)
6970

7071
while (p < e) {
7172
int j;
72-
pue = pud_offset(pge, v);
73+
p4e = p4d_offset(pge, v);
74+
pue = pud_offset(p4e, v);
7375
pme = pmd_offset(pue, v);
7476

7577
if ((u32) pue != (u32) pge || (u32) pme != (u32) pge) {
@@ -100,6 +102,7 @@ static void __init fixedrange_init(void)
100102
{
101103
unsigned long vaddr;
102104
pgd_t *pgd;
105+
p4d_t *p4d;
103106
pud_t *pud;
104107
pmd_t *pmd;
105108
#ifdef CONFIG_HIGHMEM
@@ -111,7 +114,8 @@ static void __init fixedrange_init(void)
111114
*/
112115
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1);
113116
pgd = swapper_pg_dir + pgd_index(vaddr);
114-
pud = pud_offset(pgd, vaddr);
117+
p4d = p4d_offset(pgd, vaddr);
118+
pud = pud_offset(p4d, vaddr);
115119
pmd = pmd_offset(pud, vaddr);
116120
fixmap_pmd_p = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
117121
if (!fixmap_pmd_p)
@@ -126,7 +130,8 @@ static void __init fixedrange_init(void)
126130
vaddr = PKMAP_BASE;
127131

128132
pgd = swapper_pg_dir + pgd_index(vaddr);
129-
pud = pud_offset(pgd, vaddr);
133+
p4d = p4d_offset(pgd, vaddr);
134+
pud = pud_offset(p4d, vaddr);
130135
pmd = pmd_offset(pud, vaddr);
131136
pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
132137
if (!pte)

arch/nds32/mm/mm-nds32.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ void setup_mm_for_reboot(char mode)
7474
{
7575
unsigned long pmdval;
7676
pgd_t *pgd;
77+
p4d_t *p4d;
78+
pud_t *pud;
7779
pmd_t *pmd;
7880
int i;
7981

@@ -84,7 +86,9 @@ void setup_mm_for_reboot(char mode)
8486

8587
for (i = 0; i < USER_PTRS_PER_PGD; i++) {
8688
pmdval = (i << PGDIR_SHIFT);
87-
pmd = pmd_offset(pgd + i, i << PGDIR_SHIFT);
89+
p4d = p4d_offset(pgd, i << PGDIR_SHIFT);
90+
pud = pud_offset(p4d, i << PGDIR_SHIFT);
91+
pmd = pmd_offset(pud + i, i << PGDIR_SHIFT);
8892
set_pmd(pmd, __pmd(pmdval));
8993
}
9094
}

arch/nds32/mm/proc.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@ extern struct cache_info L1_cache_info[2];
1616

1717
int va_kernel_present(unsigned long addr)
1818
{
19+
p4d_t *p4d;
20+
pud_t *pud;
1921
pmd_t *pmd;
2022
pte_t *ptep, pte;
2123

22-
pmd = pmd_offset(pgd_offset_k(addr), addr);
24+
p4d = p4d_offset(pgd_offset_k(addr), addr);
25+
pud = pud_offset(p4d, addr);
26+
pmd = pmd_offset(pud, addr);
2327
if (!pmd_none(*pmd)) {
2428
ptep = pte_offset_map(pmd, addr);
2529
pte = *ptep;
@@ -32,20 +36,24 @@ int va_kernel_present(unsigned long addr)
3236
pte_t va_present(struct mm_struct * mm, unsigned long addr)
3337
{
3438
pgd_t *pgd;
39+
p4d_t *p4d;
3540
pud_t *pud;
3641
pmd_t *pmd;
3742
pte_t *ptep, pte;
3843

3944
pgd = pgd_offset(mm, addr);
4045
if (!pgd_none(*pgd)) {
41-
pud = pud_offset(pgd, addr);
42-
if (!pud_none(*pud)) {
43-
pmd = pmd_offset(pud, addr);
44-
if (!pmd_none(*pmd)) {
45-
ptep = pte_offset_map(pmd, addr);
46-
pte = *ptep;
47-
if (pte_present(pte))
48-
return pte;
46+
p4d = p4d_offset(pgd, addr);
47+
if (!p4d_none(*p4d)) {
48+
pud = pud_offset(p4d, addr);
49+
if (!pud_none(*pud)) {
50+
pmd = pmd_offset(pud, addr);
51+
if (!pmd_none(*pmd)) {
52+
ptep = pte_offset_map(pmd, addr);
53+
pte = *ptep;
54+
if (pte_present(pte))
55+
return pte;
56+
}
4957
}
5058
}
5159
}

0 commit comments

Comments
 (0)