From: "David Hildenbrand (Arm)" <[email protected]> These helpers that silently fallback to the folded level are dangerous, especially with some upcoming changes.
Make all code compile-out any calls to these helpers with dummy value. So let's make the compiler complain if these helpers are abused with dummy pXdp value. Signed-off-by: David Hildenbrand (Arm) <[email protected]> --- include/asm-generic/pgtable-nop4d.h | 8 ++++++-- include/asm-generic/pgtable-nopmd.h | 8 ++++++-- include/asm-generic/pgtable-nopud.h | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/asm-generic/pgtable-nop4d.h b/include/asm-generic/pgtable-nop4d.h index 9e9e4557761d..05c3acc0884b 100644 --- a/include/asm-generic/pgtable-nop4d.h +++ b/include/asm-generic/pgtable-nop4d.h @@ -70,8 +70,12 @@ static __always_inline p4d_t *__p4d_offset_lockless(pgd_t *pgdp, pgd_t pgd, #define p4d_val(x) (pgd_val((x).pgd)) #define __p4d(x) ((p4d_t) { __pgd(x) }) -#define pgd_page(pgd) (p4d_page((p4d_t){ pgd })) -#define pgd_page_vaddr(pgd) ((unsigned long)(p4d_pgtable((p4d_t){ pgd }))) +#define pgd_page(pgd) ({ BUILD_BUG(); (struct page *)NULL; }) +#define pgd_page_vaddr(pgd) \ +({ \ + pgd_check_dummy(pgd); \ + (unsigned long)p4d_pgtable((p4d_t) { pgd }); \ +}) /* * allocating and freeing a p4d is trivial: the 1-entry p4d is diff --git a/include/asm-generic/pgtable-nopmd.h b/include/asm-generic/pgtable-nopmd.h index f92ddcea444f..aa4902f63c0e 100644 --- a/include/asm-generic/pgtable-nopmd.h +++ b/include/asm-generic/pgtable-nopmd.h @@ -80,8 +80,12 @@ static __always_inline pmd_t *__pmd_offset_lockless(pud_t *pudp, pud_t pud, #define pmd_val(x) (pud_val((x).pud)) #define __pmd(x) ((pmd_t) { __pud(x) } ) -#define pud_page(pud) (pmd_page((pmd_t){ pud })) -#define pud_pgtable(pud) ((pmd_t *)(pmd_page_vaddr((pmd_t){ pud }))) +#define pud_page(pud) ({ BUILD_BUG(); (struct page *)NULL; }) +#define pud_pgtable(pud) \ +({ \ + pud_check_dummy(pud); \ + ((pmd_t *)(pmd_page_vaddr((pmd_t) { pud }))); \ +}) /* * allocating and freeing a pmd is trivial: the 1-entry pmd is diff --git a/include/asm-generic/pgtable-nopud.h b/include/asm-generic/pgtable-nopud.h index 7475d0bd0f2e..3264673c0c38 100644 --- a/include/asm-generic/pgtable-nopud.h +++ b/include/asm-generic/pgtable-nopud.h @@ -77,8 +77,12 @@ static __always_inline pud_t *__pud_offset_lockless(p4d_t *p4dp, p4d_t p4d, #define pud_val(x) (p4d_val((x).p4d)) #define __pud(x) ((pud_t) { __p4d(x) }) -#define p4d_page(p4d) (pud_page((pud_t){ p4d })) -#define p4d_pgtable(p4d) ((pud_t *)(pud_pgtable((pud_t){ p4d }))) +#define p4d_page(p4d) ({ BUILD_BUG(); (struct page *)NULL; }) +#define p4d_pgtable(p4d) \ +({ \ + p4d_check_dummy(p4d); \ + ((pud_t *)(pud_pgtable((pud_t) { p4d }))); \ +}) /* * allocating and freeing a pud is trivial: the 1-entry pud is -- 2.43.0

