From: "David Hildenbrand (Arm)" <[email protected]>
Let's define (pgd|p4d|pud)_leaf(), hard-coding it to "false". Note
that we missed to define pud_leaf() before, allowing architectures to
unknowingly overwrite it.
Still use static inline functions (type checking), and while at it, just
use "bool" as a return value.
We can now drop the arm64 custom variant that did that. As it documents:
Note: reusing the original pointer means that we may
dereference the same (live) page-table entry multiple times.
This is safe because it is still only loaded once in the
context of each level and the CPU guarantees same-address
read-after-read ordering.
We now have the same situation. Don't document that, as we will be
removing the double read next.
Signed-off-by: David Hildenbrand (Arm) <[email protected]>
Signed-off-by: Yeoreum Yun <[email protected]>
---
arch/arm64/include/asm/pgtable.h | 23 -----------------------
include/asm-generic/pgtable-nop4d.h | 2 ++
include/asm-generic/pgtable-nopmd.h | 3 ++-
include/asm-generic/pgtable-nopud.h | 2 ++
4 files changed, 6 insertions(+), 24 deletions(-)
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index a2681d7553584..6185fc291fd7d 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -1188,29 +1188,6 @@ static inline bool pgtable_l5_enabled(void) { return
false; }
#define p4d_clear_fixmap()
#define p4d_offset_kimg(dir,addr) ((p4d_t *)dir)
-
-static inline
-p4d_t *p4d_offset_lockless_folded(pgd_t *pgdp, pgd_t pgd, unsigned long addr)
-{
- /*
- * With runtime folding of the pud, pud_offset_lockless() passes
- * the 'pgd_t *' we return here to p4d_to_folded_pud(), which
- * will offset the pointer assuming that it points into
- * a page-table page. However, the fast GUP path passes us a
- * pgd_t allocated on the stack and so we must use the original
- * pointer in 'pgdp' to construct the p4d pointer instead of
- * using the generic p4d_offset_lockless() implementation.
- *
- * Note: reusing the original pointer means that we may
- * dereference the same (live) page-table entry multiple times.
- * This is safe because it is still only loaded once in the
- * context of each level and the CPU guarantees same-address
- * read-after-read ordering.
- */
- return p4d_offset(pgdp, addr);
-}
-#define p4d_offset_lockless p4d_offset_lockless_folded
-
#endif /* CONFIG_PGTABLE_LEVELS > 4 */
#define pgd_ERROR(e) \
diff --git a/include/asm-generic/pgtable-nop4d.h
b/include/asm-generic/pgtable-nop4d.h
index 89c21f84cffbe..c6a5a43899b50 100644
--- a/include/asm-generic/pgtable-nop4d.h
+++ b/include/asm-generic/pgtable-nop4d.h
@@ -22,6 +22,8 @@ static inline int pgd_none(pgd_t pgd) { return 0; }
static inline int pgd_bad(pgd_t pgd) { return 0; }
static inline int pgd_present(pgd_t pgd) { return 1; }
static inline void pgd_clear(pgd_t *pgd) { }
+static inline bool pgd_leaf(pgd_t pgd) { return false; }
+#define pgd_leaf pgd_leaf
#define p4d_ERROR(p4d) (pgd_ERROR((p4d).pgd))
#define pgd_populate(mm, pgd, p4d) do { } while (0)
diff --git a/include/asm-generic/pgtable-nopmd.h
b/include/asm-generic/pgtable-nopmd.h
index 36b6490ed1808..dbd38b4c3a056 100644
--- a/include/asm-generic/pgtable-nopmd.h
+++ b/include/asm-generic/pgtable-nopmd.h
@@ -31,7 +31,8 @@ static inline int pud_none(pud_t pud) { return 0; }
static inline int pud_bad(pud_t pud) { return 0; }
static inline int pud_present(pud_t pud) { return 1; }
static inline int pud_user(pud_t pud) { return 0; }
-static inline int pud_leaf(pud_t pud) { return 0; }
+static inline bool pud_leaf(pud_t pud) { return false; }
+#define pud_leaf pud_leaf
static inline void pud_clear(pud_t *pud) { }
#define pmd_ERROR(pmd) (pud_ERROR((pmd).pud))
diff --git a/include/asm-generic/pgtable-nopud.h
b/include/asm-generic/pgtable-nopud.h
index 356cbfbaab247..6c9bca78047c4 100644
--- a/include/asm-generic/pgtable-nopud.h
+++ b/include/asm-generic/pgtable-nopud.h
@@ -29,6 +29,8 @@ static inline int p4d_none(p4d_t p4d) { return 0; }
static inline int p4d_bad(p4d_t p4d) { return 0; }
static inline int p4d_present(p4d_t p4d) { return 1; }
static inline void p4d_clear(p4d_t *p4d) { }
+static inline bool p4d_leaf(p4d_t p4d) { return false; }
+#define p4d_leaf p4d_leaf
#define pud_ERROR(pud) (p4d_ERROR((pud).p4d))
#define p4d_populate(mm, p4d, pud) do { } while (0)
--
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}