diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/mm/memory.c b/mm/memory.c index 31250faff390..32df03cf13a5 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -2219,7 +2219,6 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2219 | &ptl); | 2219 | &ptl); |
| 2220 | if (!pte_same(*page_table, orig_pte)) { | 2220 | if (!pte_same(*page_table, orig_pte)) { |
| 2221 | unlock_page(old_page); | 2221 | unlock_page(old_page); |
| 2222 | page_cache_release(old_page); | ||
| 2223 | goto unlock; | 2222 | goto unlock; |
| 2224 | } | 2223 | } |
| 2225 | page_cache_release(old_page); | 2224 | page_cache_release(old_page); |
| @@ -2289,7 +2288,6 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
| 2289 | &ptl); | 2288 | &ptl); |
| 2290 | if (!pte_same(*page_table, orig_pte)) { | 2289 | if (!pte_same(*page_table, orig_pte)) { |
| 2291 | unlock_page(old_page); | 2290 | unlock_page(old_page); |
| 2292 | page_cache_release(old_page); | ||
| 2293 | goto unlock; | 2291 | goto unlock; |
| 2294 | } | 2292 | } |
| 2295 | 2293 | ||
| @@ -2367,16 +2365,6 @@ gotten: | |||
| 2367 | } | 2365 | } |
| 2368 | __SetPageUptodate(new_page); | 2366 | __SetPageUptodate(new_page); |
| 2369 | 2367 | ||
| 2370 | /* | ||
| 2371 | * Don't let another task, with possibly unlocked vma, | ||
| 2372 | * keep the mlocked page. | ||
| 2373 | */ | ||
| 2374 | if ((vma->vm_flags & VM_LOCKED) && old_page) { | ||
| 2375 | lock_page(old_page); /* for LRU manipulation */ | ||
| 2376 | clear_page_mlock(old_page); | ||
| 2377 | unlock_page(old_page); | ||
| 2378 | } | ||
| 2379 | |||
| 2380 | if (mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL)) | 2368 | if (mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL)) |
| 2381 | goto oom_free_new; | 2369 | goto oom_free_new; |
| 2382 | 2370 | ||
| @@ -2444,10 +2432,20 @@ gotten: | |||
| 2444 | 2432 | ||
| 2445 | if (new_page) | 2433 | if (new_page) |
| 2446 | page_cache_release(new_page); | 2434 | page_cache_release(new_page); |
| 2447 | if (old_page) | ||
| 2448 | page_cache_release(old_page); | ||
| 2449 | unlock: | 2435 | unlock: |
| 2450 | pte_unmap_unlock(page_table, ptl); | 2436 | pte_unmap_unlock(page_table, ptl); |
| 2437 | if (old_page) { | ||
| 2438 | /* | ||
| 2439 | * Don't let another task, with possibly unlocked vma, | ||
| 2440 | * keep the mlocked page. | ||
| 2441 | */ | ||
| 2442 | if ((ret & VM_FAULT_WRITE) && (vma->vm_flags & VM_LOCKED)) { | ||
| 2443 | lock_page(old_page); /* LRU manipulation */ | ||
| 2444 | munlock_vma_page(old_page); | ||
| 2445 | unlock_page(old_page); | ||
| 2446 | } | ||
| 2447 | page_cache_release(old_page); | ||
| 2448 | } | ||
| 2451 | return ret; | 2449 | return ret; |
| 2452 | oom_free_new: | 2450 | oom_free_new: |
| 2453 | page_cache_release(new_page); | 2451 | page_cache_release(new_page); |
