Skip to content

Commit 60e50f3

Browse files
rppttorvalds
authored andcommitted
m68k: mm: use pgtable-nopXd instead of 4level-fixup
m68k 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 m68k with include/asm-generic/pgtable-nopmd.h for two-level configurations and with include/asm-generic/pgtable-nopud.h for three-lelve configurations and adjust page table manipulation macros and functions accordingly. [[email protected]: fix merge glitch] [[email protected]: more merge glitch fixes] [[email protected]: s/bad_pgd/bad_pud/, per Mike] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Mike Rapoport <[email protected]> Acked-by: Greg Ungerer <[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: 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 f6f7cae commit 60e50f3

File tree

15 files changed

+129
-92
lines changed

15 files changed

+129
-92
lines changed

arch/m68k/include/asm/mcf_pgalloc.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
2828
return (pmd_t *) pgd;
2929
}
3030

31-
#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); })
32-
#define pmd_alloc_one(mm, address) ({ BUG(); ((pmd_t *)2); })
33-
3431
#define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
3532
(unsigned long)(page_address(page)))
3633

@@ -45,8 +42,6 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
4542
__free_page(page);
4643
}
4744

48-
#define __pmd_free_tlb(tlb, pmd, address) do { } while (0)
49-
5045
static inline struct page *pte_alloc_one(struct mm_struct *mm)
5146
{
5247
struct page *page = alloc_pages(GFP_DMA, 0);
@@ -100,6 +95,4 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
10095
return new_pgd;
10196
}
10297

103-
#define pgd_populate(mm, pmd, pte) BUG()
104-
10598
#endif /* M68K_MCF_PGALLOC_H */

arch/m68k/include/asm/mcf_pgtable.h

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,9 @@ static inline int pmd_bad2(pmd_t *pmd) { return 0; }
198198
#define pmd_present(pmd) (!pmd_none2(&(pmd)))
199199
static inline void pmd_clear(pmd_t *pmdp) { pmd_val(*pmdp) = 0; }
200200

201-
static inline int pgd_none(pgd_t pgd) { return 0; }
202-
static inline int pgd_bad(pgd_t pgd) { return 0; }
203-
static inline int pgd_present(pgd_t pgd) { return 1; }
204-
static inline void pgd_clear(pgd_t *pgdp) {}
205-
206201
#define pte_ERROR(e) \
207202
printk(KERN_ERR "%s:%d: bad pte %08lx.\n", \
208203
__FILE__, __LINE__, pte_val(e))
209-
#define pmd_ERROR(e) \
210-
printk(KERN_ERR "%s:%d: bad pmd %08lx.\n", \
211-
__FILE__, __LINE__, pmd_val(e))
212204
#define pgd_ERROR(e) \
213205
printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", \
214206
__FILE__, __LINE__, pgd_val(e))
@@ -339,14 +331,6 @@ extern pgd_t kernel_pg_dir[PTRS_PER_PGD];
339331
*/
340332
#define pgd_offset_k(address) pgd_offset(&init_mm, address)
341333

342-
/*
343-
* Find an entry in the second-level pagetable.
344-
*/
345-
static inline pmd_t *pmd_offset(pgd_t *pgd, unsigned long address)
346-
{
347-
return (pmd_t *) pgd;
348-
}
349-
350334
/*
351335
* Find an entry in the third-level pagetable.
352336
*/
@@ -360,12 +344,16 @@ static inline pmd_t *pmd_offset(pgd_t *pgd, unsigned long address)
360344
static inline void nocache_page(void *vaddr)
361345
{
362346
pgd_t *dir;
347+
p4d_t *p4dp;
348+
pud_t *pudp;
363349
pmd_t *pmdp;
364350
pte_t *ptep;
365351
unsigned long addr = (unsigned long) vaddr;
366352

367353
dir = pgd_offset_k(addr);
368-
pmdp = pmd_offset(dir, addr);
354+
p4dp = p4d_offset(dir, addr);
355+
pudp = pud_offset(p4dp, addr);
356+
pmdp = pmd_offset(pudp, addr);
369357
ptep = pte_offset_kernel(pmdp, addr);
370358
*ptep = pte_mknocache(*ptep);
371359
}
@@ -376,12 +364,16 @@ static inline void nocache_page(void *vaddr)
376364
static inline void cache_page(void *vaddr)
377365
{
378366
pgd_t *dir;
367+
p4d_t *p4dp;
368+
pud_t *pudp;
379369
pmd_t *pmdp;
380370
pte_t *ptep;
381371
unsigned long addr = (unsigned long) vaddr;
382372

383373
dir = pgd_offset_k(addr);
384-
pmdp = pmd_offset(dir, addr);
374+
p4dp = p4d_offset(dir, addr);
375+
pudp = pud_offset(p4dp, addr);
376+
pmdp = pmd_offset(pudp, addr);
385377
ptep = pte_offset_kernel(pmdp, addr);
386378
*ptep = pte_mkcache(*ptep);
387379
}

arch/m68k/include/asm/mmu_context.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ static inline void load_ksp_mmu(struct task_struct *task)
100100
struct mm_struct *mm;
101101
int asid;
102102
pgd_t *pgd;
103+
p4d_t *p4d;
104+
pud_t *pud;
103105
pmd_t *pmd;
104106
pte_t *pte;
105107
unsigned long mmuar;
@@ -127,7 +129,15 @@ static inline void load_ksp_mmu(struct task_struct *task)
127129
if (pgd_none(*pgd))
128130
goto bug;
129131

130-
pmd = pmd_offset(pgd, mmuar);
132+
p4d = p4d_offset(pgd, mmuar);
133+
if (p4d_none(*p4d))
134+
goto bug;
135+
136+
pud = pud_offset(p4d, mmuar);
137+
if (pud_none(*pud))
138+
goto bug;
139+
140+
pmd = pmd_offset(pud, mmuar);
131141
if (pmd_none(*pmd))
132142
goto bug;
133143

arch/m68k/include/asm/motorola_pgalloc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page
106106
}
107107
#define pmd_pgtable(pmd) pmd_page(pmd)
108108

109-
static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
109+
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
110110
{
111-
pgd_set(pgd, pmd);
111+
pud_set(pud, pmd);
112112
}
113113

114114
#endif /* _MOTOROLA_PGALLOC_H */

arch/m68k/include/asm/motorola_pgtable.h

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,14 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
117117
}
118118
}
119119

120-
static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
120+
static inline void pud_set(pud_t *pudp, pmd_t *pmdp)
121121
{
122-
pgd_val(*pgdp) = _PAGE_TABLE | _PAGE_ACCESSED | __pa(pmdp);
122+
pud_val(*pudp) = _PAGE_TABLE | _PAGE_ACCESSED | __pa(pmdp);
123123
}
124124

125125
#define __pte_page(pte) ((unsigned long)__va(pte_val(pte) & PAGE_MASK))
126126
#define __pmd_page(pmd) ((unsigned long)__va(pmd_val(pmd) & _TABLE_MASK))
127-
#define __pgd_page(pgd) ((unsigned long)__va(pgd_val(pgd) & _TABLE_MASK))
127+
#define pud_page_vaddr(pud) ((unsigned long)__va(pud_val(pud) & _TABLE_MASK))
128128

129129

130130
#define pte_none(pte) (!pte_val(pte))
@@ -147,11 +147,11 @@ static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
147147
#define pmd_page(pmd) virt_to_page(__va(pmd_val(pmd)))
148148

149149

150-
#define pgd_none(pgd) (!pgd_val(pgd))
151-
#define pgd_bad(pgd) ((pgd_val(pgd) & _DESCTYPE_MASK) != _PAGE_TABLE)
152-
#define pgd_present(pgd) (pgd_val(pgd) & _PAGE_TABLE)
153-
#define pgd_clear(pgdp) ({ pgd_val(*pgdp) = 0; })
154-
#define pgd_page(pgd) (mem_map + ((unsigned long)(__va(pgd_val(pgd)) - PAGE_OFFSET) >> PAGE_SHIFT))
150+
#define pud_none(pud) (!pud_val(pud))
151+
#define pud_bad(pud) ((pud_val(pud) & _DESCTYPE_MASK) != _PAGE_TABLE)
152+
#define pud_present(pud) (pud_val(pud) & _PAGE_TABLE)
153+
#define pud_clear(pudp) ({ pud_val(*pudp) = 0; })
154+
#define pud_page(pud) (mem_map + ((unsigned long)(__va(pud_val(pud)) - PAGE_OFFSET) >> PAGE_SHIFT))
155155

156156
#define pte_ERROR(e) \
157157
printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
@@ -209,9 +209,9 @@ static inline pgd_t *pgd_offset_k(unsigned long address)
209209

210210

211211
/* Find an entry in the second-level page table.. */
212-
static inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address)
212+
static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address)
213213
{
214-
return (pmd_t *)__pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PMD-1));
214+
return (pmd_t *)pud_page_vaddr(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PMD-1));
215215
}
216216

217217
/* Find an entry in the third-level page table.. */
@@ -239,11 +239,15 @@ static inline void nocache_page(void *vaddr)
239239

240240
if (CPU_IS_040_OR_060) {
241241
pgd_t *dir;
242+
p4d_t *p4dp;
243+
pud_t *pudp;
242244
pmd_t *pmdp;
243245
pte_t *ptep;
244246

245247
dir = pgd_offset_k(addr);
246-
pmdp = pmd_offset(dir, addr);
248+
p4dp = p4d_offset(dir, addr);
249+
pudp = pud_offset(p4dp, addr);
250+
pmdp = pmd_offset(pudp, addr);
247251
ptep = pte_offset_kernel(pmdp, addr);
248252
*ptep = pte_mknocache(*ptep);
249253
}
@@ -255,11 +259,15 @@ static inline void cache_page(void *vaddr)
255259

256260
if (CPU_IS_040_OR_060) {
257261
pgd_t *dir;
262+
p4d_t *p4dp;
263+
pud_t *pudp;
258264
pmd_t *pmdp;
259265
pte_t *ptep;
260266

261267
dir = pgd_offset_k(addr);
262-
pmdp = pmd_offset(dir, addr);
268+
p4dp = p4d_offset(dir, addr);
269+
pudp = pud_offset(p4dp, addr);
270+
pmdp = pmd_offset(pudp, addr);
263271
ptep = pte_offset_kernel(pmdp, addr);
264272
*ptep = pte_mkcache(*ptep);
265273
}

arch/m68k/include/asm/page.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,22 @@
2121
/*
2222
* These are used to make use of C type-checking..
2323
*/
24-
typedef struct { unsigned long pte; } pte_t;
24+
#if !defined(CONFIG_MMU) || CONFIG_PGTABLE_LEVELS == 3
2525
typedef struct { unsigned long pmd[16]; } pmd_t;
26+
#define pmd_val(x) ((&x)->pmd[0])
27+
#define __pmd(x) ((pmd_t) { { (x) }, })
28+
#endif
29+
30+
typedef struct { unsigned long pte; } pte_t;
2631
typedef struct { unsigned long pgd; } pgd_t;
2732
typedef struct { unsigned long pgprot; } pgprot_t;
2833
typedef struct page *pgtable_t;
2934

3035
#define pte_val(x) ((x).pte)
31-
#define pmd_val(x) ((&x)->pmd[0])
3236
#define pgd_val(x) ((x).pgd)
3337
#define pgprot_val(x) ((x).pgprot)
3438

3539
#define __pte(x) ((pte_t) { (x) } )
36-
#define __pmd(x) ((pmd_t) { { (x) }, })
3740
#define __pgd(x) ((pgd_t) { (x) } )
3841
#define __pgprot(x) ((pgprot_t) { (x) } )
3942

arch/m68k/include/asm/pgtable_mm.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
#ifndef _M68K_PGTABLE_H
33
#define _M68K_PGTABLE_H
44

5-
#include <asm-generic/4level-fixup.h>
5+
6+
#if defined(CONFIG_SUN3) || defined(CONFIG_COLDFIRE)
7+
#include <asm-generic/pgtable-nopmd.h>
8+
#else
9+
#include <asm-generic/pgtable-nopud.h>
10+
#endif
611

712
#include <asm/setup.h>
813

@@ -30,9 +35,7 @@
3035

3136

3237
/* PMD_SHIFT determines the size of the area a second-level page table can map */
33-
#ifdef CONFIG_SUN3
34-
#define PMD_SHIFT 17
35-
#else
38+
#if CONFIG_PGTABLE_LEVELS == 3
3639
#define PMD_SHIFT 22
3740
#endif
3841
#define PMD_SIZE (1UL << PMD_SHIFT)

arch/m68k/include/asm/sun3_pgalloc.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717

1818
extern const char bad_pmd_string[];
1919

20-
#define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); })
21-
2220
#define __pte_free_tlb(tlb,pte,addr) \
2321
do { \
2422
pgtable_pte_page_dtor(pte); \
@@ -41,7 +39,6 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page
4139
* inside the pgd, so has no extra memory associated with it.
4240
*/
4341
#define pmd_free(mm, x) do { } while (0)
44-
#define __pmd_free_tlb(tlb, x, addr) do { } while (0)
4542

4643
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
4744
{
@@ -58,6 +55,4 @@ static inline pgd_t * pgd_alloc(struct mm_struct *mm)
5855
return new_pgd;
5956
}
6057

61-
#define pgd_populate(mm, pmd, pte) BUG()
62-
6358
#endif /* SUN3_PGALLOC_H */

arch/m68k/include/asm/sun3_pgtable.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
110110

111111
#define pmd_set(pmdp,ptep) do {} while (0)
112112

113-
static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
114-
{
115-
pgd_val(*pgdp) = virt_to_phys(pmdp);
116-
}
117-
118113
#define __pte_page(pte) \
119114
((unsigned long) __va ((pte_val (pte) & SUN3_PAGE_PGNUM_MASK) << PAGE_SHIFT))
120115
#define __pmd_page(pmd) \
@@ -145,16 +140,9 @@ static inline int pmd_present2 (pmd_t *pmd) { return pmd_val (*pmd) & SUN3_PMD_V
145140
#define pmd_present(pmd) (!pmd_none2(&(pmd)))
146141
static inline void pmd_clear (pmd_t *pmdp) { pmd_val (*pmdp) = 0; }
147142

148-
static inline int pgd_none (pgd_t pgd) { return 0; }
149-
static inline int pgd_bad (pgd_t pgd) { return 0; }
150-
static inline int pgd_present (pgd_t pgd) { return 1; }
151-
static inline void pgd_clear (pgd_t *pgdp) {}
152-
153143

154144
#define pte_ERROR(e) \
155145
pr_err("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
156-
#define pmd_ERROR(e) \
157-
pr_err("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
158146
#define pgd_ERROR(e) \
159147
pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
160148

@@ -194,12 +182,6 @@ extern pgd_t kernel_pg_dir[PTRS_PER_PGD];
194182
/* Find an entry in a kernel pagetable directory. */
195183
#define pgd_offset_k(address) pgd_offset(&init_mm, address)
196184

197-
/* Find an entry in the second-level pagetable. */
198-
static inline pmd_t *pmd_offset (pgd_t *pgd, unsigned long address)
199-
{
200-
return (pmd_t *) pgd;
201-
}
202-
203185
/* Find an entry in the third-level pagetable. */
204186
#define pte_index(address) ((address >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
205187
#define pte_offset_kernel(pmd, address) ((pte_t *) __pmd_page(*pmd) + pte_index(address))

arch/m68k/kernel/sys_m68k.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,8 @@ sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
465465
for (;;) {
466466
struct mm_struct *mm = current->mm;
467467
pgd_t *pgd;
468+
p4d_t *p4d;
469+
pud_t *pud;
468470
pmd_t *pmd;
469471
pte_t *pte;
470472
spinlock_t *ptl;
@@ -474,7 +476,13 @@ sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
474476
pgd = pgd_offset(mm, (unsigned long)mem);
475477
if (!pgd_present(*pgd))
476478
goto bad_access;
477-
pmd = pmd_offset(pgd, (unsigned long)mem);
479+
p4d = p4d_offset(pgd, (unsigned long)mem);
480+
if (!p4d_present(*p4d))
481+
goto bad_access;
482+
pud = pud_offset(p4d, (unsigned long)mem);
483+
if (!pud_present(*pud))
484+
goto bad_access;
485+
pmd = pmd_offset(pud, (unsigned long)mem);
478486
if (!pmd_present(*pmd))
479487
goto bad_access;
480488
pte = pte_offset_map_lock(mm, pmd, (unsigned long)mem, &ptl);

0 commit comments

Comments
 (0)