|
@@ -2219,7 +2219,6 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
&ptl);
|
|
|
if (!pte_same(*page_table, orig_pte)) {
|
|
|
unlock_page(old_page);
|
|
|
- page_cache_release(old_page);
|
|
|
goto unlock;
|
|
|
}
|
|
|
page_cache_release(old_page);
|
|
@@ -2289,7 +2288,6 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
&ptl);
|
|
|
if (!pte_same(*page_table, orig_pte)) {
|
|
|
unlock_page(old_page);
|
|
|
- page_cache_release(old_page);
|
|
|
goto unlock;
|
|
|
}
|
|
|
|
|
@@ -2367,16 +2365,6 @@ gotten:
|
|
|
}
|
|
|
__SetPageUptodate(new_page);
|
|
|
|
|
|
- /*
|
|
|
- * Don't let another task, with possibly unlocked vma,
|
|
|
- * keep the mlocked page.
|
|
|
- */
|
|
|
- if ((vma->vm_flags & VM_LOCKED) && old_page) {
|
|
|
- lock_page(old_page); /* for LRU manipulation */
|
|
|
- clear_page_mlock(old_page);
|
|
|
- unlock_page(old_page);
|
|
|
- }
|
|
|
-
|
|
|
if (mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))
|
|
|
goto oom_free_new;
|
|
|
|
|
@@ -2444,10 +2432,20 @@ gotten:
|
|
|
|
|
|
if (new_page)
|
|
|
page_cache_release(new_page);
|
|
|
- if (old_page)
|
|
|
- page_cache_release(old_page);
|
|
|
unlock:
|
|
|
pte_unmap_unlock(page_table, ptl);
|
|
|
+ if (old_page) {
|
|
|
+ /*
|
|
|
+ * Don't let another task, with possibly unlocked vma,
|
|
|
+ * keep the mlocked page.
|
|
|
+ */
|
|
|
+ if ((ret & VM_FAULT_WRITE) && (vma->vm_flags & VM_LOCKED)) {
|
|
|
+ lock_page(old_page); /* LRU manipulation */
|
|
|
+ munlock_vma_page(old_page);
|
|
|
+ unlock_page(old_page);
|
|
|
+ }
|
|
|
+ page_cache_release(old_page);
|
|
|
+ }
|
|
|
return ret;
|
|
|
oom_free_new:
|
|
|
page_cache_release(new_page);
|