Skip to content

Commit 30ec842

Browse files
kiryltorvalds
authored andcommitted
asm-generic: introduce __ARCH_USE_5LEVEL_HACK
We are going to introduce <asm-generic/pgtable-nop4d.h> to provide abstraction for properly (in opposite to 5level-fixup.h hack) folded p4d level. The new header will be included from pgtable-nopud.h. If an architecture uses <asm-generic/nop*d.h>, we cannot use 5level-fixup.h directly to quickly convert the architecture to 5-level paging as it would conflict with pgtable-nop4d.h. With this patch an architecture can define __ARCH_USE_5LEVEL_HACK before inclusion <asm-genenric/nop*d.h> to use 5level-fixup.h. Signed-off-by: Kirill A. Shutemov <[email protected]> Acked-by: Michal Hocko <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 505a60e commit 30ec842

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#ifndef _PGTABLE_NOP4D_HACK_H
2+
#define _PGTABLE_NOP4D_HACK_H
3+
4+
#ifndef __ASSEMBLY__
5+
#include <asm-generic/5level-fixup.h>
6+
7+
#define __PAGETABLE_PUD_FOLDED
8+
9+
/*
10+
* Having the pud type consist of a pgd gets the size right, and allows
11+
* us to conceptually access the pgd entry that this pud is folded into
12+
* without casting.
13+
*/
14+
typedef struct { pgd_t pgd; } pud_t;
15+
16+
#define PUD_SHIFT PGDIR_SHIFT
17+
#define PTRS_PER_PUD 1
18+
#define PUD_SIZE (1UL << PUD_SHIFT)
19+
#define PUD_MASK (~(PUD_SIZE-1))
20+
21+
/*
22+
* The "pgd_xxx()" functions here are trivial for a folded two-level
23+
* setup: the pud is never bad, and a pud always exists (as it's folded
24+
* into the pgd entry)
25+
*/
26+
static inline int pgd_none(pgd_t pgd) { return 0; }
27+
static inline int pgd_bad(pgd_t pgd) { return 0; }
28+
static inline int pgd_present(pgd_t pgd) { return 1; }
29+
static inline void pgd_clear(pgd_t *pgd) { }
30+
#define pud_ERROR(pud) (pgd_ERROR((pud).pgd))
31+
32+
#define pgd_populate(mm, pgd, pud) do { } while (0)
33+
/*
34+
* (puds are folded into pgds so this doesn't get actually called,
35+
* but the define is needed for a generic inline function.)
36+
*/
37+
#define set_pgd(pgdptr, pgdval) set_pud((pud_t *)(pgdptr), (pud_t) { pgdval })
38+
39+
static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
40+
{
41+
return (pud_t *)pgd;
42+
}
43+
44+
#define pud_val(x) (pgd_val((x).pgd))
45+
#define __pud(x) ((pud_t) { __pgd(x) })
46+
47+
#define pgd_page(pgd) (pud_page((pud_t){ pgd }))
48+
#define pgd_page_vaddr(pgd) (pud_page_vaddr((pud_t){ pgd }))
49+
50+
/*
51+
* allocating and freeing a pud is trivial: the 1-entry pud is
52+
* inside the pgd, so has no extra memory associated with it.
53+
*/
54+
#define pud_alloc_one(mm, address) NULL
55+
#define pud_free(mm, x) do { } while (0)
56+
#define __pud_free_tlb(tlb, x, a) do { } while (0)
57+
58+
#undef pud_addr_end
59+
#define pud_addr_end(addr, end) (end)
60+
61+
#endif /* __ASSEMBLY__ */
62+
#endif /* _PGTABLE_NOP4D_HACK_H */

include/asm-generic/pgtable-nopud.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
#ifndef __ASSEMBLY__
55

6+
#ifdef __ARCH_USE_5LEVEL_HACK
7+
#include <asm-generic/pgtable-nop4d-hack.h>
8+
#else
9+
610
#define __PAGETABLE_PUD_FOLDED
711

812
/*
@@ -58,4 +62,5 @@ static inline pud_t * pud_offset(pgd_t * pgd, unsigned long address)
5862
#define pud_addr_end(addr, end) (end)
5963

6064
#endif /* __ASSEMBLY__ */
65+
#endif /* !__ARCH_USE_5LEVEL_HACK */
6166
#endif /* _PGTABLE_NOPUD_H */

0 commit comments

Comments
 (0)