diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/mm/memory.c b/mm/memory.c index 1a435b81876c..f47ffe971012 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2648,8 +2648,9 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2648 | entry = maybe_mkwrite(pte_mkdirty(entry), vma); | 2648 | entry = maybe_mkwrite(pte_mkdirty(entry), vma); |
2649 | 2649 | ||
2650 | page_table = pte_offset_map_lock(mm, pmd, address, &ptl); | 2650 | page_table = pte_offset_map_lock(mm, pmd, address, &ptl); |
2651 | if (!pte_none(*page_table)) | 2651 | if (!pte_none(*page_table) || ksm_test_exit(mm)) |
2652 | goto release; | 2652 | goto release; |
2653 | |||
2653 | inc_mm_counter(mm, anon_rss); | 2654 | inc_mm_counter(mm, anon_rss); |
2654 | page_add_new_anon_rmap(page, vma, address); | 2655 | page_add_new_anon_rmap(page, vma, address); |
2655 | set_pte_at(mm, address, page_table, entry); | 2656 | set_pte_at(mm, address, page_table, entry); |
@@ -2791,7 +2792,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2791 | * handle that later. | 2792 | * handle that later. |
2792 | */ | 2793 | */ |
2793 | /* Only go through if we didn't race with anybody else... */ | 2794 | /* Only go through if we didn't race with anybody else... */ |
2794 | if (likely(pte_same(*page_table, orig_pte))) { | 2795 | if (likely(pte_same(*page_table, orig_pte) && !ksm_test_exit(mm))) { |
2795 | flush_icache_page(vma, page); | 2796 | flush_icache_page(vma, page); |
2796 | entry = mk_pte(page, vma->vm_page_prot); | 2797 | entry = mk_pte(page, vma->vm_page_prot); |
2797 | if (flags & FAULT_FLAG_WRITE) | 2798 | if (flags & FAULT_FLAG_WRITE) |