Messages in this thread Patch in this message | | | Date | Thu, 23 Aug 2012 19:17:35 +0200 | From | Gerald Schaefer <> | Subject | [RFC patch 2/7] thp: introduce pmdp_invalidate() |
| |
On System z, a valid page table entry must not be changed while it is attached to any CPU. So instead of pmd_mknotpresent() and set_pmd_at(), an IDTE operation would be necessary there. This patch introduces the pmdp_invalidate() function, to allow architecture-specific implementations.
Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> --- include/asm-generic/pgtable.h | 11 +++++++++++ mm/huge_memory.c | 3 +-- 2 files changed, 12 insertions(+), 2 deletions(-)
--- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h @@ -93,6 +93,17 @@ static inline pmd_t pmdp_get_and_clear(s #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif +#ifndef __HAVE_ARCH_PMDP_INVALIDATE +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +static inline void pmdp_invalidate(struct vm_area_struct *vma, + unsigned long address, pmd_t *pmdp) +{ + set_pmd_at(vma->vm_mm, address, pmd, pmd_mknotpresent(*pmd)); + flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); +} +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ +#endif + #ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long address, pte_t *ptep, --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1374,8 +1374,7 @@ static int __split_huge_page_map(struct * SMP TLB and finally we write the non-huge version * of the pmd entry with pmd_populate. */ - set_pmd_at(mm, address, pmd, pmd_mknotpresent(*pmd)); - flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); + pmdp_invalidate(vma, address, pmd); pmd_populate(mm, pmd, pgtable); ret = 1; }
| |