|
|
@@ -1477,9 +1477,15 @@ static inline void pgtable_page_dtor(struct page *page)
|
|
|
|
|
|
#if USE_SPLIT_PMD_PTLOCKS
|
|
|
|
|
|
+static struct page *pmd_to_page(pmd_t *pmd)
|
|
|
+{
|
|
|
+ unsigned long mask = ~(PTRS_PER_PMD * sizeof(pmd_t) - 1);
|
|
|
+ return virt_to_page((void *)((unsigned long) pmd & mask));
|
|
|
+}
|
|
|
+
|
|
|
static inline spinlock_t *pmd_lockptr(struct mm_struct *mm, pmd_t *pmd)
|
|
|
{
|
|
|
- return ptlock_ptr(virt_to_page(pmd));
|
|
|
+ return ptlock_ptr(pmd_to_page(pmd));
|
|
|
}
|
|
|
|
|
|
static inline bool pgtable_pmd_page_ctor(struct page *page)
|
|
|
@@ -1498,7 +1504,7 @@ static inline void pgtable_pmd_page_dtor(struct page *page)
|
|
|
ptlock_free(page);
|
|
|
}
|
|
|
|
|
|
-#define pmd_huge_pte(mm, pmd) (virt_to_page(pmd)->pmd_huge_pte)
|
|
|
+#define pmd_huge_pte(mm, pmd) (pmd_to_page(pmd)->pmd_huge_pte)
|
|
|
|
|
|
#else
|
|
|
|