diff options
| author | Lee Schermerhorn <lee.schermerhorn@hp.com> | 2008-04-28 02:13:08 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-28 08:58:23 -0700 | 
| commit | f0be3d32b05d3fea2fcdbbb81a39dac2a7163169 (patch) | |
| tree | 5794ce6a8befbce82cd3e44ff15fbf3bb5f2f3bf /mm/mempolicy.c | |
| parent | 3b1163006332302117b1b2acf226d4014ff46525 (diff) | |
mempolicy: rename mpol_free to mpol_put
This is a change that was requested some time ago by Mel Gorman.  Makes sense
to me, so here it is.
Note: I retain the name "mpol_free_shared_policy()" because it actually does
free the shared_policy, which is NOT a reference counted object.  However, ...
The mempolicy object[s] referenced by the shared_policy are reference counted,
so mpol_put() is used to release the reference held by the shared_policy.  The
mempolicy might not be freed at this time, because some task attached to the
shared object associated with the shared policy may be in the process of
allocating a page based on the mempolicy.  In that case, the task performing
the allocation will hold a reference on the mempolicy, obtained via
mpol_shared_policy_lookup().  The mempolicy will be freed when all tasks
holding such a reference have called mpol_put() for the mempolicy.
Signed-off-by: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/mempolicy.c')
| -rw-r--r-- | mm/mempolicy.c | 26 | 
1 files changed, 13 insertions, 13 deletions
| diff --git a/mm/mempolicy.c b/mm/mempolicy.c index c1b907789d84..ce2c5b6bf9f8 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -529,7 +529,7 @@ static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new)  	if (!err) {  		mpol_get(new);  		vma->vm_policy = new; -		mpol_free(old); +		mpol_put(old);  	}  	return err;  } @@ -595,7 +595,7 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags,  	new = mpol_new(mode, flags, nodes);  	if (IS_ERR(new))  		return PTR_ERR(new); -	mpol_free(current->mempolicy); +	mpol_put(current->mempolicy);  	current->mempolicy = new;  	mpol_set_task_struct_flag();  	if (new && new->policy == MPOL_INTERLEAVE && @@ -948,7 +948,7 @@ static long do_mbind(unsigned long start, unsigned long len,  	}  	up_write(&mm->mmap_sem); -	mpol_free(new); +	mpol_put(new);  	return err;  } @@ -1446,14 +1446,14 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr,  		nid = interleave_nid(pol, vma, addr, HPAGE_SHIFT);  		if (unlikely(pol != &default_policy &&  				pol != current->mempolicy)) -			__mpol_free(pol);	/* finished with pol */ +			__mpol_put(pol);	/* finished with pol */  		return node_zonelist(nid, gfp_flags);  	}  	zl = zonelist_policy(GFP_HIGHUSER, pol);  	if (unlikely(pol != &default_policy && pol != current->mempolicy)) {  		if (pol->policy != MPOL_BIND) -			__mpol_free(pol);	/* finished with pol */ +			__mpol_put(pol);	/* finished with pol */  		else  			*mpol = pol;	/* unref needed after allocation */  	} @@ -1512,7 +1512,7 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)  		nid = interleave_nid(pol, vma, addr, PAGE_SHIFT);  		if (unlikely(pol != &default_policy &&  				pol != current->mempolicy)) -			__mpol_free(pol);	/* finished with pol */ +			__mpol_put(pol);	/* finished with pol */  		return alloc_page_interleave(gfp, 0, nid);  	}  	zl = zonelist_policy(gfp, pol); @@ -1522,7 +1522,7 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr)  		 */  		struct page *page =  __alloc_pages_nodemask(gfp, 0,  						zl, nodemask_policy(gfp, pol)); -		__mpol_free(pol); +		__mpol_put(pol);  		return page;  	}  	/* @@ -1624,7 +1624,7 @@ int __mpol_equal(struct mempolicy *a, struct mempolicy *b)  }  /* Slow path of a mpol destructor. */ -void __mpol_free(struct mempolicy *p) +void __mpol_put(struct mempolicy *p)  {  	if (!atomic_dec_and_test(&p->refcnt))  		return; @@ -1720,7 +1720,7 @@ static void sp_delete(struct shared_policy *sp, struct sp_node *n)  {  	pr_debug("deleting %lx-l%lx\n", n->start, n->end);  	rb_erase(&n->nd, &sp->root); -	mpol_free(n->policy); +	mpol_put(n->policy);  	kmem_cache_free(sn_cache, n);  } @@ -1780,7 +1780,7 @@ restart:  		sp_insert(sp, new);  	spin_unlock(&sp->lock);  	if (new2) { -		mpol_free(new2->policy); +		mpol_put(new2->policy);  		kmem_cache_free(sn_cache, new2);  	}  	return 0; @@ -1805,7 +1805,7 @@ void mpol_shared_policy_init(struct shared_policy *info, unsigned short policy,  			/* Policy covers entire file */  			pvma.vm_end = TASK_SIZE;  			mpol_set_shared_policy(info, &pvma, newpol); -			mpol_free(newpol); +			mpol_put(newpol);  		}  	}  } @@ -1848,7 +1848,7 @@ void mpol_free_shared_policy(struct shared_policy *p)  		n = rb_entry(next, struct sp_node, nd);  		next = rb_next(&n->nd);  		rb_erase(&n->nd, &p->root); -		mpol_free(n->policy); +		mpol_put(n->policy);  		kmem_cache_free(sn_cache, n);  	}  	spin_unlock(&p->lock); @@ -2068,7 +2068,7 @@ int show_numa_map(struct seq_file *m, void *v)  	 * unref shared or other task's mempolicy  	 */  	if (pol != &default_policy && pol != current->mempolicy) -		__mpol_free(pol); +		__mpol_put(pol);  	seq_printf(m, "%08lx %s", vma->vm_start, buffer); | 
