From: Mel Gorman <mel@csn.ul.ie>
To: Rik van Riel <riel@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Minchan Kim <minchan.kim@gmail.com>,
Linux-MM <linux-mm@kvack.org>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
LKML <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH 3/5] track the root (oldest) anon_vma
Date: Wed, 12 May 2010 21:59:41 +0100 [thread overview]
Message-ID: <20100512205941.GO24989@csn.ul.ie> (raw)
In-Reply-To: <20100512133958.3aff0515@annuminas.surriel.com>
On Wed, May 12, 2010 at 01:39:58PM -0400, Rik van Riel wrote:
> Subject: track the root (oldest) anon_vma
>
> Track the root (oldest) anon_vma in each anon_vma tree. Because we only
> take the lock on the root anon_vma, we cannot use the lock on higher-up
> anon_vmas to lock anything. This makes it impossible to do an indirect
> lookup of the root anon_vma, since the data structures could go away from
> under us.
>
> However, a direct pointer is safe because the root anon_vma is always the
> last one that gets freed on munmap or exit, by virtue of the same_vma list
> order and unlink_anon_vmas walking the list forward.
>
Shouldn't this be "usually the last one that gets freed" because of the
ref-counting by KSM aspect? Minor nit anyway.
> Signed-off-by: Rik van Riel <riel@redhat.com>
Otherwise
Acked-by: Mel Gorman <mel@csn.ul.ie>
> ---
> include/linux/rmap.h | 1 +
> mm/rmap.c | 20 +++++++++++++++++---
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 72ecd87..457ae1e 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -26,6 +26,7 @@
> */
> struct anon_vma {
> spinlock_t lock; /* Serialize access to vma list */
> + struct anon_vma *root; /* Root of this anon_vma tree */
> #ifdef CONFIG_KSM
> atomic_t ksm_refcount;
> #endif
> diff --git a/mm/rmap.c b/mm/rmap.c
> index 6102f77..e34cb56 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -132,6 +132,11 @@ int anon_vma_prepare(struct vm_area_struct *vma)
> if (unlikely(!anon_vma))
> goto out_enomem_free_avc;
> allocated = anon_vma;
> + /*
> + * This VMA had no anon_vma yet. This anon_vma is
> + * the root of any anon_vma tree that might form.
> + */
> + anon_vma->root = anon_vma;
> }
>
> anon_vma_lock(anon_vma);
> @@ -203,7 +208,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src)
> */
> int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
> {
> - struct anon_vma_chain *avc;
> + struct anon_vma_chain *avc, *root_avc;
> struct anon_vma *anon_vma;
>
> /* Don't bother if the parent process has no anon_vma here. */
> @@ -224,9 +229,18 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
> avc = anon_vma_chain_alloc();
> if (!avc)
> goto out_error_free_anon_vma;
> - anon_vma_chain_link(vma, avc, anon_vma);
> +
> + /*
> + * Get the root anon_vma on the list by depending on the ordering
> + * of the same_vma list setup by previous invocations of anon_vma_fork.
> + * The root anon_vma will always be referenced by the last item
> + * in the anon_vma_chain list.
> + */
> + root_avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma);
> + anon_vma->root = root_avc->anon_vma;
> /* Mark this anon_vma as the one where our new (COWed) pages go. */
> vma->anon_vma = anon_vma;
> + anon_vma_chain_link(vma, avc, anon_vma);
>
> return 0;
>
> @@ -261,7 +275,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma)
> {
> struct anon_vma_chain *avc, *next;
>
> - /* Unlink each anon_vma chained to the VMA. */
> + /* Unlink each anon_vma chained to the VMA, from newest to oldest. */
> list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {
> anon_vma_unlink(avc);
> list_del(&avc->same_vma);
>
--
Mel Gorman
Part-time Phd Student Linux Technology Center
University of Limerick IBM Dublin Software Lab
WARNING: multiple messages have this Message-ID (diff)
From: Mel Gorman <mel@csn.ul.ie>
To: Rik van Riel <riel@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Minchan Kim <minchan.kim@gmail.com>,
Linux-MM <linux-mm@kvack.org>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
LKML <linux-kernel@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH 3/5] track the root (oldest) anon_vma
Date: Wed, 12 May 2010 21:59:41 +0100 [thread overview]
Message-ID: <20100512205941.GO24989@csn.ul.ie> (raw)
In-Reply-To: <20100512133958.3aff0515@annuminas.surriel.com>
On Wed, May 12, 2010 at 01:39:58PM -0400, Rik van Riel wrote:
> Subject: track the root (oldest) anon_vma
>
> Track the root (oldest) anon_vma in each anon_vma tree. Because we only
> take the lock on the root anon_vma, we cannot use the lock on higher-up
> anon_vmas to lock anything. This makes it impossible to do an indirect
> lookup of the root anon_vma, since the data structures could go away from
> under us.
>
> However, a direct pointer is safe because the root anon_vma is always the
> last one that gets freed on munmap or exit, by virtue of the same_vma list
> order and unlink_anon_vmas walking the list forward.
>
Shouldn't this be "usually the last one that gets freed" because of the
ref-counting by KSM aspect? Minor nit anyway.
> Signed-off-by: Rik van Riel <riel@redhat.com>
Otherwise
Acked-by: Mel Gorman <mel@csn.ul.ie>
> ---
> include/linux/rmap.h | 1 +
> mm/rmap.c | 20 +++++++++++++++++---
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/rmap.h b/include/linux/rmap.h
> index 72ecd87..457ae1e 100644
> --- a/include/linux/rmap.h
> +++ b/include/linux/rmap.h
> @@ -26,6 +26,7 @@
> */
> struct anon_vma {
> spinlock_t lock; /* Serialize access to vma list */
> + struct anon_vma *root; /* Root of this anon_vma tree */
> #ifdef CONFIG_KSM
> atomic_t ksm_refcount;
> #endif
> diff --git a/mm/rmap.c b/mm/rmap.c
> index 6102f77..e34cb56 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -132,6 +132,11 @@ int anon_vma_prepare(struct vm_area_struct *vma)
> if (unlikely(!anon_vma))
> goto out_enomem_free_avc;
> allocated = anon_vma;
> + /*
> + * This VMA had no anon_vma yet. This anon_vma is
> + * the root of any anon_vma tree that might form.
> + */
> + anon_vma->root = anon_vma;
> }
>
> anon_vma_lock(anon_vma);
> @@ -203,7 +208,7 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src)
> */
> int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
> {
> - struct anon_vma_chain *avc;
> + struct anon_vma_chain *avc, *root_avc;
> struct anon_vma *anon_vma;
>
> /* Don't bother if the parent process has no anon_vma here. */
> @@ -224,9 +229,18 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
> avc = anon_vma_chain_alloc();
> if (!avc)
> goto out_error_free_anon_vma;
> - anon_vma_chain_link(vma, avc, anon_vma);
> +
> + /*
> + * Get the root anon_vma on the list by depending on the ordering
> + * of the same_vma list setup by previous invocations of anon_vma_fork.
> + * The root anon_vma will always be referenced by the last item
> + * in the anon_vma_chain list.
> + */
> + root_avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma);
> + anon_vma->root = root_avc->anon_vma;
> /* Mark this anon_vma as the one where our new (COWed) pages go. */
> vma->anon_vma = anon_vma;
> + anon_vma_chain_link(vma, avc, anon_vma);
>
> return 0;
>
> @@ -261,7 +275,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma)
> {
> struct anon_vma_chain *avc, *next;
>
> - /* Unlink each anon_vma chained to the VMA. */
> + /* Unlink each anon_vma chained to the VMA, from newest to oldest. */
> list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {
> anon_vma_unlink(avc);
> list_del(&avc->same_vma);
>
--
Mel Gorman
Part-time Phd Student Linux Technology Center
University of Limerick IBM Dublin Software Lab
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-05-12 21:00 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-12 17:38 [PATCH 0/5] always lock the root anon_vma Rik van Riel
2010-05-12 17:38 ` Rik van Riel
2010-05-12 17:39 ` [PATCH 1/5] rename anon_vma_lock to vma_lock_anon_vma Rik van Riel
2010-05-12 17:39 ` Rik van Riel
2010-05-12 20:57 ` Mel Gorman
2010-05-12 20:57 ` Mel Gorman
2010-05-13 0:30 ` KAMEZAWA Hiroyuki
2010-05-13 0:30 ` KAMEZAWA Hiroyuki
2010-05-12 17:39 ` [PATCH 3/5] track the root (oldest) anon_vma Rik van Riel
2010-05-12 17:39 ` Rik van Riel
2010-05-12 20:59 ` Mel Gorman [this message]
2010-05-12 20:59 ` Mel Gorman
2010-05-12 21:01 ` Rik van Riel
2010-05-12 21:01 ` Rik van Riel
2010-05-13 0:38 ` KAMEZAWA Hiroyuki
2010-05-13 0:38 ` KAMEZAWA Hiroyuki
2010-05-13 2:25 ` Rik van Riel
2010-05-13 2:25 ` Rik van Riel
2010-05-14 0:04 ` KAMEZAWA Hiroyuki
2010-05-14 0:04 ` KAMEZAWA Hiroyuki
2010-05-12 17:40 ` [PATCH 4/5] always lock " Rik van Riel
2010-05-12 17:40 ` Rik van Riel
2010-05-12 21:02 ` Mel Gorman
2010-05-12 21:02 ` Mel Gorman
2010-05-12 21:08 ` Rik van Riel
2010-05-12 21:08 ` Rik van Riel
2010-05-13 9:54 ` Mel Gorman
2010-05-13 9:54 ` Mel Gorman
2010-05-13 14:33 ` [PATCH -v2 " Rik van Riel
2010-05-13 14:33 ` Rik van Riel
2010-05-13 21:09 ` Andrew Morton
2010-05-13 21:09 ` Andrew Morton
2010-05-13 22:50 ` Rik van Riel
2010-05-13 22:50 ` Rik van Riel
2010-05-14 9:33 ` Mel Gorman
2010-05-14 9:33 ` Mel Gorman
2010-05-26 4:00 ` Rik van Riel
2010-05-26 4:00 ` Rik van Riel
2010-05-26 4:15 ` Andrew Morton
2010-05-26 4:15 ` Andrew Morton
2010-05-26 5:46 ` james toy
2010-05-26 5:46 ` james toy
2010-06-01 0:57 ` james toy
2010-06-01 0:57 ` james toy
2010-05-26 15:24 ` [PATCH -v2 0/5] always lock the root anon_vma Rik van Riel
2010-05-26 15:24 ` Rik van Riel
2010-05-26 15:25 ` [PATCH 1/5] rename anon_vma_lock to vma_lock_anon_vma Rik van Riel
2010-05-26 15:25 ` Rik van Riel
2010-05-26 17:25 ` Linus Torvalds
2010-05-26 17:25 ` Linus Torvalds
2010-05-26 19:01 ` Rik van Riel
2010-05-26 19:01 ` Rik van Riel
2010-05-26 19:25 ` Linus Torvalds
2010-05-26 19:25 ` Linus Torvalds
2010-05-26 19:35 ` Rik van Riel
2010-05-26 19:35 ` Rik van Riel
2010-05-26 15:25 ` [PATCH 2/5] change direct call of spin_lock(anon_vma->lock) to inline function Rik van Riel
2010-05-26 15:25 ` Rik van Riel
2010-05-26 15:26 ` [PATCH 3/5] track the root (oldest) anon_vma Rik van Riel
2010-05-26 15:26 ` Rik van Riel
2010-05-26 15:27 ` [PATCH 4/5] always lock " Rik van Riel
2010-05-26 15:27 ` Rik van Riel
2010-05-26 15:27 ` [PATCH 5/5] extend KSM refcounts to the anon_vma root Rik van Riel
2010-05-26 15:27 ` Rik van Riel
2010-05-12 21:55 ` [PATCH 4/5] always lock the root (oldest) anon_vma Linus Torvalds
2010-05-12 21:55 ` Linus Torvalds
2010-05-12 22:18 ` Rik van Riel
2010-05-12 22:18 ` Rik van Riel
2010-05-12 22:26 ` Linus Torvalds
2010-05-12 22:26 ` Linus Torvalds
2010-05-12 17:41 ` [PATCH 5/5] extend KSM refcounts to the anon_vma root Rik van Riel
2010-05-12 17:41 ` Rik van Riel
2010-05-12 21:07 ` Mel Gorman
2010-05-12 21:07 ` Mel Gorman
2010-05-12 21:09 ` Rik van Riel
2010-05-12 21:09 ` Rik van Riel
2010-05-13 11:26 ` Mel Gorman
2010-05-13 11:26 ` Mel Gorman
2010-05-13 13:11 ` Rik van Riel
2010-05-13 13:11 ` Rik van Riel
2010-05-13 13:24 ` Mel Gorman
2010-05-13 13:24 ` Mel Gorman
2010-05-13 14:34 ` [PATCH -v2 " Rik van Riel
2010-05-13 14:34 ` Rik van Riel
2010-05-19 1:05 ` Andrea Arcangeli
2010-05-19 1:05 ` Andrea Arcangeli
2010-05-12 17:41 ` [PATCH 2/5] change direct call of spin_lock(anon_vma->lock) to inline function Rik van Riel
2010-05-12 17:41 ` Rik van Riel
2010-05-12 20:58 ` Mel Gorman
2010-05-12 20:58 ` Mel Gorman
2010-05-13 0:32 ` KAMEZAWA Hiroyuki
2010-05-13 0:32 ` KAMEZAWA Hiroyuki
2010-05-20 22:42 ` [PATCH 6/5] adjust mm_take_all_locks to anon-vma-root locking Andrea Arcangeli
2010-05-20 22:42 ` Andrea Arcangeli
2010-05-20 23:07 ` Rik van Riel
2010-05-20 23:07 ` Rik van Riel
-- strict thread matches above, loose matches on Subject: below --
2010-05-26 19:38 [PATCH -v3 0/5] always lock the root anon_vma Rik van Riel
2010-05-26 19:40 ` [PATCH 3/5] track the root (oldest) anon_vma Rik van Riel
2010-05-26 19:40 ` Rik van Riel
2010-05-26 20:34 ` Larry Woodman
2010-05-26 20:34 ` Larry Woodman
2010-05-27 13:48 ` Minchan Kim
2010-05-27 13:48 ` Minchan Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100512205941.GO24989@csn.ul.ie \
--to=mel@csn.ul.ie \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan.kim@gmail.com \
--cc=riel@redhat.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.