oom: give the dying task a higher priority
[sfrench/cifs-2.6.git] / mm / ksm.c
index 6c3e99b4ae7c0726851ea5281fbb39f90f7b9ea2..9f2acc998a37d0f293eb52e6efdccefc17dfa272 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -318,19 +318,14 @@ static void hold_anon_vma(struct rmap_item *rmap_item,
                          struct anon_vma *anon_vma)
 {
        rmap_item->anon_vma = anon_vma;
-       atomic_inc(&anon_vma->external_refcount);
+       get_anon_vma(anon_vma);
 }
 
-static void drop_anon_vma(struct rmap_item *rmap_item)
+static void ksm_drop_anon_vma(struct rmap_item *rmap_item)
 {
        struct anon_vma *anon_vma = rmap_item->anon_vma;
 
-       if (atomic_dec_and_lock(&anon_vma->external_refcount, &anon_vma->lock)) {
-               int empty = list_empty(&anon_vma->head);
-               spin_unlock(&anon_vma->lock);
-               if (empty)
-                       anon_vma_free(anon_vma);
-       }
+       drop_anon_vma(anon_vma);
 }
 
 /*
@@ -415,7 +410,7 @@ static void break_cow(struct rmap_item *rmap_item)
         * It is not an accident that whenever we want to break COW
         * to undo, we also need to drop a reference to the anon_vma.
         */
-       drop_anon_vma(rmap_item);
+       ksm_drop_anon_vma(rmap_item);
 
        down_read(&mm->mmap_sem);
        if (ksm_test_exit(mm))
@@ -470,7 +465,7 @@ static void remove_node_from_stable_tree(struct stable_node *stable_node)
                        ksm_pages_sharing--;
                else
                        ksm_pages_shared--;
-               drop_anon_vma(rmap_item);
+               ksm_drop_anon_vma(rmap_item);
                rmap_item->address &= PAGE_MASK;
                cond_resched();
        }
@@ -558,7 +553,7 @@ static void remove_rmap_item_from_tree(struct rmap_item *rmap_item)
                else
                        ksm_pages_shared--;
 
-               drop_anon_vma(rmap_item);
+               ksm_drop_anon_vma(rmap_item);
                rmap_item->address &= PAGE_MASK;
 
        } else if (rmap_item->address & UNSTABLE_FLAG) {
@@ -1566,7 +1561,7 @@ again:
                struct anon_vma_chain *vmac;
                struct vm_area_struct *vma;
 
-               spin_lock(&anon_vma->lock);
+               anon_vma_lock(anon_vma);
                list_for_each_entry(vmac, &anon_vma->head, same_anon_vma) {
                        vma = vmac->vma;
                        if (rmap_item->address < vma->vm_start ||
@@ -1589,7 +1584,7 @@ again:
                        if (!search_new_forks || !mapcount)
                                break;
                }
-               spin_unlock(&anon_vma->lock);
+               anon_vma_unlock(anon_vma);
                if (!mapcount)
                        goto out;
        }
@@ -1619,7 +1614,7 @@ again:
                struct anon_vma_chain *vmac;
                struct vm_area_struct *vma;
 
-               spin_lock(&anon_vma->lock);
+               anon_vma_lock(anon_vma);
                list_for_each_entry(vmac, &anon_vma->head, same_anon_vma) {
                        vma = vmac->vma;
                        if (rmap_item->address < vma->vm_start ||
@@ -1637,11 +1632,11 @@ again:
                        ret = try_to_unmap_one(page, vma,
                                        rmap_item->address, flags);
                        if (ret != SWAP_AGAIN || !page_mapped(page)) {
-                               spin_unlock(&anon_vma->lock);
+                               anon_vma_unlock(anon_vma);
                                goto out;
                        }
                }
-               spin_unlock(&anon_vma->lock);
+               anon_vma_unlock(anon_vma);
        }
        if (!search_new_forks++)
                goto again;
@@ -1671,7 +1666,7 @@ again:
                struct anon_vma_chain *vmac;
                struct vm_area_struct *vma;
 
-               spin_lock(&anon_vma->lock);
+               anon_vma_lock(anon_vma);
                list_for_each_entry(vmac, &anon_vma->head, same_anon_vma) {
                        vma = vmac->vma;
                        if (rmap_item->address < vma->vm_start ||
@@ -1688,11 +1683,11 @@ again:
 
                        ret = rmap_one(page, vma, rmap_item->address, arg);
                        if (ret != SWAP_AGAIN) {
-                               spin_unlock(&anon_vma->lock);
+                               anon_vma_unlock(anon_vma);
                                goto out;
                        }
                }
-               spin_unlock(&anon_vma->lock);
+               anon_vma_unlock(anon_vma);
        }
        if (!search_new_forks++)
                goto again;