diff options
author | KalimochoAz <calimochoazucarado@gmail.com> | 2012-06-13 21:29:37 +0200 |
---|---|---|
committer | KalimochoAz <calimochoazucarado@gmail.com> | 2012-06-13 21:29:37 +0200 |
commit | 6303791f24e88b81b858fbacd26523ac4af8ef83 (patch) | |
tree | d75a11331a3b775d7db7e281c909b610fb9e03f6 /mm | |
parent | e5cf67e56e4f4e7dc90ea645f011d35ad5f7a271 (diff) | |
parent | 26a7895e70104811258cf023d06a21f92ab590c6 (diff) | |
download | kernel_samsung_crespo-6303791f24e88b81b858fbacd26523ac4af8ef83.zip kernel_samsung_crespo-6303791f24e88b81b858fbacd26523ac4af8ef83.tar.gz kernel_samsung_crespo-6303791f24e88b81b858fbacd26523ac4af8ef83.tar.bz2 |
Merge branch 'linux-3.0.y' into HEAD
Diffstat (limited to 'mm')
-rw-r--r-- | mm/mempolicy.c | 41 | ||||
-rw-r--r-- | mm/vmscan.c | 2 |
2 files changed, 18 insertions, 25 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index a85171d..3dac2d1 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -606,27 +606,6 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, return first; } -/* Apply policy to a single VMA */ -static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new) -{ - int err = 0; - struct mempolicy *old = vma->vm_policy; - - pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", - vma->vm_start, vma->vm_end, vma->vm_pgoff, - vma->vm_ops, vma->vm_file, - vma->vm_ops ? vma->vm_ops->set_policy : NULL); - - if (vma->vm_ops && vma->vm_ops->set_policy) - err = vma->vm_ops->set_policy(vma, new); - if (!err) { - mpol_get(new); - vma->vm_policy = new; - mpol_put(old); - } - return err; -} - /* Step 2: apply policy to a range and do splits. */ static int mbind_range(struct mm_struct *mm, unsigned long start, unsigned long end, struct mempolicy *new_pol) @@ -666,9 +645,23 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, if (err) goto out; } - err = policy_vma(vma, new_pol); - if (err) - goto out; + + /* + * Apply policy to a single VMA. The reference counting of + * policy for vma_policy linkages has already been handled by + * vma_merge and split_vma as necessary. If this is a shared + * policy then ->set_policy will increment the reference count + * for an sp node. + */ + pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", + vma->vm_start, vma->vm_end, vma->vm_pgoff, + vma->vm_ops, vma->vm_file, + vma->vm_ops ? vma->vm_ops->set_policy : NULL); + if (vma->vm_ops && vma->vm_ops->set_policy) { + err = vma->vm_ops->set_policy(vma, new_pol); + if (err) + goto out; + } } out: diff --git a/mm/vmscan.c b/mm/vmscan.c index 6072d74..769935d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -665,7 +665,7 @@ static enum page_references page_check_references(struct page *page, return PAGEREF_RECLAIM; if (referenced_ptes) { - if (PageAnon(page)) + if (PageSwapBacked(page)) return PAGEREF_ACTIVATE; /* * All mapped pages start out with page table |