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


Reply via email to