[PATCH 2/3] mmu_notifier: Call mmu_notifier_invalidate_range() from VMM

2014-10-28 Thread Joerg Roedel
From: Joerg Roedel 

Add calls to the new mmu_notifier_invalidate_range()
function to all places in the VMM that need it.

Reviewed-by: Andrea Arcangeli 
Reviewed-by: Jérôme Glisse 
Signed-off-by: Joerg Roedel 
---
 include/linux/mmu_notifier.h | 41 +
 kernel/events/uprobes.c  |  2 +-
 mm/fremap.c  |  2 +-
 mm/huge_memory.c |  9 +
 mm/hugetlb.c |  7 ++-
 mm/ksm.c |  4 ++--
 mm/memory.c  |  3 ++-
 mm/migrate.c |  3 ++-
 mm/rmap.c|  2 +-
 9 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
index 1790790..966da2b 100644
--- a/include/linux/mmu_notifier.h
+++ b/include/linux/mmu_notifier.h
@@ -284,6 +284,44 @@ static inline void mmu_notifier_mm_destroy(struct 
mm_struct *mm)
__young;\
 })
 
+#defineptep_clear_flush_notify(__vma, __address, __ptep)   
\
+({ \
+   unsigned long ___addr = __address & PAGE_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pte_t ___pte;   \
+   \
+   ___pte = ptep_clear_flush(__vma, __address, __ptep);\
+   mmu_notifier_invalidate_range(___mm, ___addr,   \
+   ___addr + PAGE_SIZE);   \
+   \
+   ___pte; \
+})
+
+#define pmdp_clear_flush_notify(__vma, __haddr, __pmd) \
+({ \
+   unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pmd_t ___pmd;   \
+   \
+   ___pmd = pmdp_clear_flush(__vma, __haddr, __pmd);   \
+   mmu_notifier_invalidate_range(___mm, ___haddr,  \
+ ___haddr + HPAGE_PMD_SIZE);   \
+   \
+   ___pmd; \
+})
+
+#define pmdp_get_and_clear_notify(__mm, __haddr, __pmd)
\
+({ \
+   unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
+   pmd_t ___pmd;   \
+   \
+   ___pmd = pmdp_get_and_clear(__mm, __haddr, __pmd);  \
+   mmu_notifier_invalidate_range(__mm, ___haddr,   \
+ ___haddr + HPAGE_PMD_SIZE);   \
+   \
+   ___pmd; \
+})
+
 /*
  * set_pte_at_notify() sets the pte _after_ running the notifier.
  * This is safe to start by updating the secondary MMUs, because the primary 
MMU
@@ -362,6 +400,9 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct 
*mm)
 
 #define ptep_clear_flush_young_notify ptep_clear_flush_young
 #define pmdp_clear_flush_young_notify pmdp_clear_flush_young
+#defineptep_clear_flush_notify ptep_clear_flush
+#define pmdp_clear_flush_notify pmdp_clear_flush
+#define pmdp_get_and_clear_notify pmdp_get_and_clear
 #define set_pte_at_notify set_pte_at
 
 #endif /* CONFIG_MMU_NOTIFIER */
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 1d0af8a..bc143cf 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -193,7 +193,7 @@ static int __replace_page(struct vm_area_struct *vma, 
unsigned long addr,
}
 
flush_cache_page(vma, addr, pte_pfn(*ptep));
-   ptep_clear_flush(vma, addr, ptep);
+   ptep_clear_flush_notify(vma, addr, ptep);
set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot));
 
page_remove_rmap(page);
diff --git a/mm/fremap.c b/mm/fremap.c
index 72b8fa3..9129013 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -37,7 +37,7 @@ static void zap_pte(struct mm_struct *mm, struct 
vm_area_struct *vma,
 
if (pte_present(pte)) {
flush_cache_page(vma, addr, pte_pfn(pte));
-   pte = ptep_clear_flush(vma, addr, ptep);
+   pte = ptep_clear_flush_notify(vma, addr, ptep);
page = vm_normal_page(vma, addr, pte);
 

[PATCH 2/3] mmu_notifier: Call mmu_notifier_invalidate_range() from VMM

2014-09-09 Thread Joerg Roedel
From: Joerg Roedel 

Add calls to the new mmu_notifier_invalidate_range()
function to all places if the VMM that need it.

Reviewed-by: Andrea Arcangeli 
Reviewed-by: Jérôme Glisse 
Signed-off-by: Joerg Roedel 
---
 include/linux/mmu_notifier.h | 41 +
 kernel/events/uprobes.c  |  2 +-
 mm/fremap.c  |  2 +-
 mm/huge_memory.c |  9 +
 mm/hugetlb.c |  7 ++-
 mm/ksm.c |  4 ++--
 mm/memory.c  |  3 ++-
 mm/migrate.c |  3 ++-
 mm/rmap.c|  2 +-
 9 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
index 5d03f31..877d1c8 100644
--- a/include/linux/mmu_notifier.h
+++ b/include/linux/mmu_notifier.h
@@ -275,6 +275,44 @@ static inline void mmu_notifier_mm_destroy(struct 
mm_struct *mm)
__young;\
 })
 
+#defineptep_clear_flush_notify(__vma, __address, __ptep)   
\
+({ \
+   unsigned long ___addr = __address & PAGE_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pte_t ___pte;   \
+   \
+   ___pte = ptep_clear_flush(__vma, __address, __ptep);\
+   mmu_notifier_invalidate_range(___mm, ___addr,   \
+   ___addr + PAGE_SIZE);   \
+   \
+   ___pte; \
+})
+
+#define pmdp_clear_flush_notify(__vma, __haddr, __pmd) \
+({ \
+   unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pmd_t ___pmd;   \
+   \
+   ___pmd = pmdp_clear_flush(__vma, __haddr, __pmd);   \
+   mmu_notifier_invalidate_range(___mm, ___haddr,  \
+ ___haddr + HPAGE_PMD_SIZE);   \
+   \
+   ___pmd; \
+})
+
+#define pmdp_get_and_clear_notify(__mm, __haddr, __pmd)
\
+({ \
+   unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
+   pmd_t ___pmd;   \
+   \
+   ___pmd = pmdp_get_and_clear(__mm, __haddr, __pmd);  \
+   mmu_notifier_invalidate_range(__mm, ___haddr,   \
+ ___haddr + HPAGE_PMD_SIZE);   \
+   \
+   ___pmd; \
+})
+
 /*
  * set_pte_at_notify() sets the pte _after_ running the notifier.
  * This is safe to start by updating the secondary MMUs, because the primary 
MMU
@@ -352,6 +390,9 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct 
*mm)
 
 #define ptep_clear_flush_young_notify ptep_clear_flush_young
 #define pmdp_clear_flush_young_notify pmdp_clear_flush_young
+#defineptep_clear_flush_notify ptep_clear_flush
+#define pmdp_clear_flush_notify pmdp_clear_flush
+#define pmdp_get_and_clear_notify pmdp_get_and_clear
 #define set_pte_at_notify set_pte_at
 
 #endif /* CONFIG_MMU_NOTIFIER */
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 1d0af8a..bc143cf 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -193,7 +193,7 @@ static int __replace_page(struct vm_area_struct *vma, 
unsigned long addr,
}
 
flush_cache_page(vma, addr, pte_pfn(*ptep));
-   ptep_clear_flush(vma, addr, ptep);
+   ptep_clear_flush_notify(vma, addr, ptep);
set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot));
 
page_remove_rmap(page);
diff --git a/mm/fremap.c b/mm/fremap.c
index 72b8fa3..9129013 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -37,7 +37,7 @@ static void zap_pte(struct mm_struct *mm, struct 
vm_area_struct *vma,
 
if (pte_present(pte)) {
flush_cache_page(vma, addr, pte_pfn(pte));
-   pte = ptep_clear_flush(vma, addr, ptep);
+   pte = ptep_clear_flush_notify(vma, addr, ptep);
page = vm_normal_page(vma, addr, pte);
 

Re: [PATCH 2/3] mmu_notifier: Call mmu_notifier_invalidate_range() from VMM

2014-08-16 Thread Oded Gabbay


On 29/07/14 19:18, Joerg Roedel wrote:
> From: Joerg Roedel 
> 
> Add calls to the new mmu_notifier_invalidate_range()
> function to all places if the VMM that need it.
> 
> Signed-off-by: Joerg Roedel 
> ---
>  include/linux/mmu_notifier.h | 28 
>  kernel/events/uprobes.c  |  2 +-
>  mm/fremap.c  |  2 +-
>  mm/huge_memory.c |  9 +
>  mm/hugetlb.c |  7 ++-
>  mm/ksm.c |  4 ++--
>  mm/memory.c  |  3 ++-
>  mm/migrate.c |  3 ++-
>  mm/rmap.c|  2 +-
>  9 files changed, 48 insertions(+), 12 deletions(-)
> 
> diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
> index 1bac99c..f760e95 100644
> --- a/include/linux/mmu_notifier.h
> +++ b/include/linux/mmu_notifier.h
> @@ -273,6 +273,32 @@ static inline void mmu_notifier_mm_destroy(struct 
> mm_struct *mm)
>   __young;\
>  })
>  
> +#define  ptep_clear_flush_notify(__vma, __address, __ptep)   
> \
> +({   \
> + unsigned long ___addr = __address & PAGE_MASK;  \
> + struct mm_struct *___mm = (__vma)->vm_mm;   \
> + pte_t ___pte;   \
> + \
> + ___pte = ptep_clear_flush(__vma, __address, __ptep);\
> + mmu_notifier_invalidate_range(___mm, ___addr,   \
> + ___addr + PAGE_SIZE);   \
> + \
> + ___pte; \
> +})
> +
> +#define pmdp_clear_flush_notify(__vma, __haddr, __pmd)   
> \
> +({   \
> + unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
> + struct mm_struct *___mm = (__vma)->vm_mm;   \
> + pmd_t ___pmd;   \
> + \
> + ___pmd = pmdp_clear_flush(__vma, __haddr, __pmd);   \
> + mmu_notifier_invalidate_range(___mm, ___haddr,  \
> +   ___haddr + HPAGE_PMD_SIZE);   \
> + \
> + ___pmd; \
> +})
> +
>  /*
>   * set_pte_at_notify() sets the pte _after_ running the notifier.
>   * This is safe to start by updating the secondary MMUs, because the primary 
> MMU
> @@ -346,6 +372,8 @@ static inline void mmu_notifier_mm_destroy(struct 
> mm_struct *mm)
>  
>  #define ptep_clear_flush_young_notify ptep_clear_flush_young
>  #define pmdp_clear_flush_young_notify pmdp_clear_flush_young
> +#define  ptep_clear_flush_notify ptep_clear_flush
> +#define pmdp_clear_flush_notify pmdp_clear_flush
>  #define set_pte_at_notify set_pte_at
>  
>  #endif /* CONFIG_MMU_NOTIFIER */
> diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
> index 6f3254e..642262d 100644
> --- a/kernel/events/uprobes.c
> +++ b/kernel/events/uprobes.c
> @@ -186,7 +186,7 @@ static int __replace_page(struct vm_area_struct *vma, 
> unsigned long addr,
>   }
>  
>   flush_cache_page(vma, addr, pte_pfn(*ptep));
> - ptep_clear_flush(vma, addr, ptep);
> + ptep_clear_flush_notify(vma, addr, ptep);
>   set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot));
>  
>   page_remove_rmap(page);
> diff --git a/mm/fremap.c b/mm/fremap.c
> index 72b8fa3..9129013 100644
> --- a/mm/fremap.c
> +++ b/mm/fremap.c
> @@ -37,7 +37,7 @@ static void zap_pte(struct mm_struct *mm, struct 
> vm_area_struct *vma,
>  
>   if (pte_present(pte)) {
>   flush_cache_page(vma, addr, pte_pfn(pte));
> - pte = ptep_clear_flush(vma, addr, ptep);
> + pte = ptep_clear_flush_notify(vma, addr, ptep);
>   page = vm_normal_page(vma, addr, pte);
>   if (page) {
>   if (pte_dirty(pte))
> diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> index 33514d8..b322c97 100644
> --- a/mm/huge_memory.c
> +++ b/mm/huge_memory.c
> @@ -1031,7 +1031,7 @@ static int do_huge_pmd_wp_page_fallback(struct 
> mm_struct *mm,
>   goto out_free_pages;
>   VM_BUG_ON_PAGE(!PageHead(page), page);
>  
> - pmdp_clear_flush(vma, haddr, pmd);
> + pmdp_clear_flush_notify(vma, haddr, pmd);
>   /* leave pmd empty until pte is filled */
>  
>   pgtable = pgtable_trans_huge_withdraw(mm, pmd);
> @@ -1168,7 +1168,7 @@ alloc:
>   pmd_t entry;
>   entry = mk_huge_pmd(new_page, vma->vm_page_prot);
>

[PATCH 2/3] mmu_notifier: Call mmu_notifier_invalidate_range() from VMM

2014-07-29 Thread Joerg Roedel
From: Joerg Roedel 

Add calls to the new mmu_notifier_invalidate_range()
function to all places if the VMM that need it.

Signed-off-by: Joerg Roedel 
---
 include/linux/mmu_notifier.h | 28 
 kernel/events/uprobes.c  |  2 +-
 mm/fremap.c  |  2 +-
 mm/huge_memory.c |  9 +
 mm/hugetlb.c |  7 ++-
 mm/ksm.c |  4 ++--
 mm/memory.c  |  3 ++-
 mm/migrate.c |  3 ++-
 mm/rmap.c|  2 +-
 9 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
index 1bac99c..f760e95 100644
--- a/include/linux/mmu_notifier.h
+++ b/include/linux/mmu_notifier.h
@@ -273,6 +273,32 @@ static inline void mmu_notifier_mm_destroy(struct 
mm_struct *mm)
__young;\
 })
 
+#defineptep_clear_flush_notify(__vma, __address, __ptep)   
\
+({ \
+   unsigned long ___addr = __address & PAGE_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pte_t ___pte;   \
+   \
+   ___pte = ptep_clear_flush(__vma, __address, __ptep);\
+   mmu_notifier_invalidate_range(___mm, ___addr,   \
+   ___addr + PAGE_SIZE);   \
+   \
+   ___pte; \
+})
+
+#define pmdp_clear_flush_notify(__vma, __haddr, __pmd) \
+({ \
+   unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pmd_t ___pmd;   \
+   \
+   ___pmd = pmdp_clear_flush(__vma, __haddr, __pmd);   \
+   mmu_notifier_invalidate_range(___mm, ___haddr,  \
+ ___haddr + HPAGE_PMD_SIZE);   \
+   \
+   ___pmd; \
+})
+
 /*
  * set_pte_at_notify() sets the pte _after_ running the notifier.
  * This is safe to start by updating the secondary MMUs, because the primary 
MMU
@@ -346,6 +372,8 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct 
*mm)
 
 #define ptep_clear_flush_young_notify ptep_clear_flush_young
 #define pmdp_clear_flush_young_notify pmdp_clear_flush_young
+#defineptep_clear_flush_notify ptep_clear_flush
+#define pmdp_clear_flush_notify pmdp_clear_flush
 #define set_pte_at_notify set_pte_at
 
 #endif /* CONFIG_MMU_NOTIFIER */
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 6f3254e..642262d 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -186,7 +186,7 @@ static int __replace_page(struct vm_area_struct *vma, 
unsigned long addr,
}
 
flush_cache_page(vma, addr, pte_pfn(*ptep));
-   ptep_clear_flush(vma, addr, ptep);
+   ptep_clear_flush_notify(vma, addr, ptep);
set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot));
 
page_remove_rmap(page);
diff --git a/mm/fremap.c b/mm/fremap.c
index 72b8fa3..9129013 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -37,7 +37,7 @@ static void zap_pte(struct mm_struct *mm, struct 
vm_area_struct *vma,
 
if (pte_present(pte)) {
flush_cache_page(vma, addr, pte_pfn(pte));
-   pte = ptep_clear_flush(vma, addr, ptep);
+   pte = ptep_clear_flush_notify(vma, addr, ptep);
page = vm_normal_page(vma, addr, pte);
if (page) {
if (pte_dirty(pte))
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 33514d8..b322c97 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1031,7 +1031,7 @@ static int do_huge_pmd_wp_page_fallback(struct mm_struct 
*mm,
goto out_free_pages;
VM_BUG_ON_PAGE(!PageHead(page), page);
 
-   pmdp_clear_flush(vma, haddr, pmd);
+   pmdp_clear_flush_notify(vma, haddr, pmd);
/* leave pmd empty until pte is filled */
 
pgtable = pgtable_trans_huge_withdraw(mm, pmd);
@@ -1168,7 +1168,7 @@ alloc:
pmd_t entry;
entry = mk_huge_pmd(new_page, vma->vm_page_prot);
entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma);
-   pmdp_clear_flush(vma, haddr, pmd);
+   pmdp_clear_flush_notify(vma, haddr, pmd);
page

[PATCH 2/3] mmu_notifier: Call mmu_notifier_invalidate_range() from VMM

2014-07-24 Thread Joerg Roedel
From: Joerg Roedel 

Add calls to the new mmu_notifier_invalidate_range()
function to all places if the VMM that need it.

Signed-off-by: Joerg Roedel 
---
 include/linux/mmu_notifier.h | 28 
 kernel/events/uprobes.c  |  2 +-
 mm/fremap.c  |  2 +-
 mm/huge_memory.c |  9 +
 mm/hugetlb.c |  7 ++-
 mm/ksm.c |  4 ++--
 mm/memory.c  |  3 ++-
 mm/migrate.c |  3 ++-
 mm/rmap.c|  2 +-
 9 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h
index f333668..6959dc8 100644
--- a/include/linux/mmu_notifier.h
+++ b/include/linux/mmu_notifier.h
@@ -273,6 +273,32 @@ static inline void mmu_notifier_mm_destroy(struct 
mm_struct *mm)
__young;\
 })
 
+#defineptep_clear_flush_notify(__vma, __address, __ptep)   
\
+({ \
+   unsigned long ___addr = __address & PAGE_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pte_t ___pte;   \
+   \
+   ___pte = ptep_clear_flush(__vma, __address, __ptep);\
+   mmu_notifier_invalidate_range(___mm, ___addr,   \
+   ___addr + PAGE_SIZE);   \
+   \
+   ___pte; \
+})
+
+#define pmdp_clear_flush_notify(__vma, __haddr, __pmd) \
+({ \
+   unsigned long ___haddr = __haddr & HPAGE_PMD_MASK;  \
+   struct mm_struct *___mm = (__vma)->vm_mm;   \
+   pmd_t ___pmd;   \
+   \
+   ___pmd = pmdp_clear_flush(__vma, __haddr, __pmd);   \
+   mmu_notifier_invalidate_range(___mm, ___haddr,  \
+ ___haddr + HPAGE_PMD_SIZE);   \
+   \
+   ___pmd; \
+})
+
 /*
  * set_pte_at_notify() sets the pte _after_ running the notifier.
  * This is safe to start by updating the secondary MMUs, because the primary 
MMU
@@ -346,6 +372,8 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct 
*mm)
 
 #define ptep_clear_flush_young_notify ptep_clear_flush_young
 #define pmdp_clear_flush_young_notify pmdp_clear_flush_young
+#defineptep_clear_flush_notify ptep_clear_flush
+#define pmdp_clear_flush_notify pmdp_clear_flush
 #define set_pte_at_notify set_pte_at
 
 #endif /* CONFIG_MMU_NOTIFIER */
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 6f3254e..642262d 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -186,7 +186,7 @@ static int __replace_page(struct vm_area_struct *vma, 
unsigned long addr,
}
 
flush_cache_page(vma, addr, pte_pfn(*ptep));
-   ptep_clear_flush(vma, addr, ptep);
+   ptep_clear_flush_notify(vma, addr, ptep);
set_pte_at_notify(mm, addr, ptep, mk_pte(kpage, vma->vm_page_prot));
 
page_remove_rmap(page);
diff --git a/mm/fremap.c b/mm/fremap.c
index 72b8fa3..9129013 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -37,7 +37,7 @@ static void zap_pte(struct mm_struct *mm, struct 
vm_area_struct *vma,
 
if (pte_present(pte)) {
flush_cache_page(vma, addr, pte_pfn(pte));
-   pte = ptep_clear_flush(vma, addr, ptep);
+   pte = ptep_clear_flush_notify(vma, addr, ptep);
page = vm_normal_page(vma, addr, pte);
if (page) {
if (pte_dirty(pte))
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 33514d8..b322c97 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1031,7 +1031,7 @@ static int do_huge_pmd_wp_page_fallback(struct mm_struct 
*mm,
goto out_free_pages;
VM_BUG_ON_PAGE(!PageHead(page), page);
 
-   pmdp_clear_flush(vma, haddr, pmd);
+   pmdp_clear_flush_notify(vma, haddr, pmd);
/* leave pmd empty until pte is filled */
 
pgtable = pgtable_trans_huge_withdraw(mm, pmd);
@@ -1168,7 +1168,7 @@ alloc:
pmd_t entry;
entry = mk_huge_pmd(new_page, vma->vm_page_prot);
entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma);
-   pmdp_clear_flush(vma, haddr, pmd);
+   pmdp_clear_flush_notify(vma, haddr, pmd);
page