mm: simplify anon_vma refcounts
This patch changes the anon_vma refcount to be 0 when the object is free. It does this by adding 1 ref to being in use in the anon_vma structure (iow. the anon_vma->head list is not empty). This allows a simpler release scheme without having to check both the refcount and the list as well as avoids taking a ref for each entry on the list. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Acked-by: Hugh Dickins <hughd@google.com> Acked-by: Mel Gorman <mel@csn.ul.ie> Acked-by: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
83813267c6
commit
01d8b20dec
@@ -73,7 +73,13 @@ static inline void get_anon_vma(struct anon_vma *anon_vma)
|
||||
atomic_inc(&anon_vma->refcount);
|
||||
}
|
||||
|
||||
void put_anon_vma(struct anon_vma *);
|
||||
void __put_anon_vma(struct anon_vma *anon_vma);
|
||||
|
||||
static inline void put_anon_vma(struct anon_vma *anon_vma)
|
||||
{
|
||||
if (atomic_dec_and_test(&anon_vma->refcount))
|
||||
__put_anon_vma(anon_vma);
|
||||
}
|
||||
|
||||
static inline struct anon_vma *page_anon_vma(struct page *page)
|
||||
{
|
||||
@@ -116,7 +122,6 @@ void unlink_anon_vmas(struct vm_area_struct *);
|
||||
int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *);
|
||||
int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);
|
||||
void __anon_vma_link(struct vm_area_struct *);
|
||||
void anon_vma_free(struct anon_vma *);
|
||||
|
||||
static inline void anon_vma_merge(struct vm_area_struct *vma,
|
||||
struct vm_area_struct *next)
|
||||
@@ -125,6 +130,8 @@ static inline void anon_vma_merge(struct vm_area_struct *vma,
|
||||
unlink_anon_vmas(next);
|
||||
}
|
||||
|
||||
struct anon_vma *page_get_anon_vma(struct page *page);
|
||||
|
||||
/*
|
||||
* rmap interfaces called when adding or removing pte of page
|
||||
*/
|
||||
|
Reference in New Issue
Block a user