@@ -1180,29 +1180,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_set_fixmap(addr) ((pgd_t *)set_fixmap_offset(FIX_PGD, addr))
@@ -39,6 +39,13 @@ static inline p4d_t *p4d_offset(pgd_t *pgd, unsigned long address)
return (p4d_t *)pgd;
}
+static inline p4d_t *p4d_offset_lockless(pgd_t *pgdp, pgd_t pgd,
+ unsigned long address)
+{
+ return (p4d_t *)pgdp;
+}
+#define p4d_offset_lockless p4d_offset_lockless
+
#define p4d_val(x) (pgd_val((x).pgd))
#define __p4d(x) ((p4d_t) { __pgd(x) })
@@ -49,6 +49,13 @@ static inline pmd_t * pmd_offset(pud_t * pud, unsigned long address)
}
#define pmd_offset pmd_offset
+static inline pmd_t *pmd_offset_lockless(pud_t *pudp, pud_t pud,
+ unsigned long address)
+{
+ return (pmd_t *)pudp;
+}
+#define pmd_offset_lockless pmd_offset_lockless
+
#define pmd_val(x) (pud_val((x).pud))
#define __pmd(x) ((pmd_t) { __pud(x) } )
@@ -47,6 +47,13 @@ static inline pud_t *pud_offset(p4d_t *p4d, unsigned long address)
}
#define pud_offset pud_offset
+static inline pud_t *pud_offset_lockless(p4d_t *p4dp, p4d_t p4d,
+ unsigned long address)
+{
+ return (pud_t *)p4dp;
+}
+#define pud_offset_lockless pud_offset_lockless
+
#define pud_val(x) (p4d_val((x).p4d))
#define __pud(x) ((pud_t) { __p4d(x) })