From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>,
Rik van Riel <riel@redhat.com>,
Michel Lespinasse <walken@google.com>
Subject: Re: [PATCH 1/4] mm/rmap: per anon_vma lock
Date: Fri, 1 Nov 2013 22:09:17 +0800 [thread overview]
Message-ID: <20131101140917.GF30123@yliu-dev.sh.intel.com> (raw)
In-Reply-To: <20131101102224.GE19466@laptop.lan>
On Fri, Nov 01, 2013 at 11:22:24AM +0100, Peter Zijlstra wrote:
> On Fri, Nov 01, 2013 at 05:38:44PM +0800, Yuanhan Liu wrote:
> > On Fri, Nov 01, 2013 at 09:43:29AM +0100, Peter Zijlstra wrote:
> > > On Fri, Nov 01, 2013 at 03:54:24PM +0800, Yuanhan Liu wrote:
> > > > @@ -497,15 +495,20 @@ static void vma_rb_erase(struct vm_area_struct *vma, struct rb_root *root)
> > > > * anon_vma_interval_tree_post_update_vma().
> > > > *
> > > > * The entire update must be protected by exclusive mmap_sem and by
> > > > - * the root anon_vma's mutex.
> > > > + * the anon_vma's mutex.
> > > > */
> > > > static inline void
> > > > anon_vma_interval_tree_pre_update_vma(struct vm_area_struct *vma)
> > > > {
> > > > struct anon_vma_chain *avc;
> > > >
> > > > - list_for_each_entry(avc, &vma->anon_vma_chain, same_vma)
> > > > - anon_vma_interval_tree_remove(avc, &avc->anon_vma->rb_root);
> > > > + list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) {
> > > > + struct anon_vma *anon_vma = avc->anon_vma;
> > > > +
> > > > + anon_vma_lock_write(anon_vma);
> > > > + anon_vma_interval_tree_remove(avc, &anon_vma->rb_root);
> > > > + anon_vma_unlock_write(anon_vma);
> > > > + }
> > > > }
> > > >
> > > > static inline void
> > > > @@ -513,8 +516,13 @@ anon_vma_interval_tree_post_update_vma(struct vm_area_struct *vma)
> > > > {
> > > > struct anon_vma_chain *avc;
> > > >
> > > > - list_for_each_entry(avc, &vma->anon_vma_chain, same_vma)
> > > > - anon_vma_interval_tree_insert(avc, &avc->anon_vma->rb_root);
> > > > + list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) {
> > > > + struct anon_vma *anon_vma = avc->anon_vma;
> > > > +
> > > > + anon_vma_lock_write(anon_vma);
> > > > + anon_vma_interval_tree_insert(avc, &anon_vma->rb_root);
> > > > + anon_vma_unlock_write(anon_vma);
> > > > + }
> > > > }
> > > >
> > > > static int find_vma_links(struct mm_struct *mm, unsigned long addr,
> > > > @@ -781,7 +789,6 @@ again: remove_next = 1 + (end > next->vm_end);
> > > > if (anon_vma) {
> > > > VM_BUG_ON(adjust_next && next->anon_vma &&
> > > > anon_vma != next->anon_vma);
> > > > - anon_vma_lock_write(anon_vma);
> > > > anon_vma_interval_tree_pre_update_vma(vma);
> > > > if (adjust_next)
> > > > anon_vma_interval_tree_pre_update_vma(next);
> > > > @@ -845,7 +852,6 @@ again: remove_next = 1 + (end > next->vm_end);
> > > > anon_vma_interval_tree_post_update_vma(vma);
> > > > if (adjust_next)
> > > > anon_vma_interval_tree_post_update_vma(next);
> > > > - anon_vma_unlock_write(anon_vma);
> > > > }
> > > > if (mapping)
> > > > mutex_unlock(&mapping->i_mmap_mutex);
> > >
> > > AFAICT this isn't correct at all. We used to protect the vma interval
> > > tree with the root lock, now we don't.
> >
> > We still use lock to protect anon_vma interval tree, but we lock our own
> > interval tree this time.
>
> Which lock? What protects the chain you're iterating in
> anon_vma_interval_tree_{pre,post}_update_vma() ?
Sorry, I may be wrong again this time. But, isn't vma->anon_vma_chain
list being protect by mmap_sem & page_table_lock?
struct vm_area_struct {
...
struct list_head anon_vma_chain; /* Serialized by mmap_sem &
* page_table_lock */
...
}
So, my understanding was you don't need extra lock to iterate
vma->anon_vma_chain list. However, you need acquire avc->anon_vma's lock
to insert/remove avc from it.
Thanks.
--yliu
>
> > > All we've got left is the
> > > mmap_sem, but anon_vma chains can cross address-spaces and thus we're up
> > > some creek without no paddle.
> >
> > Yep, however, you still need acquire the address-space crossed anon_vma's lock
> > to modify something.
>
> -ENOPARSE.
next prev parent reply other threads:[~2013-11-01 14:09 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-01 7:54 [PATCH 0/4] per anon_vma lock and turn anon_vma rwsem lock to rwlock_t Yuanhan Liu
2013-11-01 7:54 ` [PATCH 1/4] mm/rmap: per anon_vma lock Yuanhan Liu
2013-11-01 8:43 ` Peter Zijlstra
2013-11-01 9:22 ` Michel Lespinasse
2013-11-01 9:29 ` Ingo Molnar
2013-11-01 10:07 ` Yuanhan Liu
2013-11-01 10:15 ` Peter Zijlstra
2013-11-01 11:44 ` Yuanhan Liu
2013-11-01 12:07 ` Peter Zijlstra
2013-11-01 14:02 ` Yuanhan Liu
2013-11-01 9:38 ` Yuanhan Liu
2013-11-01 10:22 ` Peter Zijlstra
2013-11-01 14:09 ` Yuanhan Liu [this message]
2013-11-01 17:47 ` Linus Torvalds
2013-11-01 7:54 ` [PATCH 2/4] mm/rmap: convert anon_vma rwsem to rwlock_t Yuanhan Liu
2013-11-01 8:46 ` Peter Zijlstra
2013-11-01 7:54 ` [PATCH 3/4] mm/rmap: cleanup unnecessary code Yuanhan Liu
2013-11-01 7:54 ` [PATCH 4/4] mm/rmap.c: move anon_vma initialization code into anon_vma_ctor Yuanhan Liu
2013-11-01 18:04 ` Linus Torvalds
2013-11-04 3:37 ` Yuanhan Liu
2013-11-01 8:01 ` [PATCH 0/4] per anon_vma lock and turn anon_vma rwsem lock to rwlock_t Ingo Molnar
2013-11-01 8:11 ` Yuanhan Liu
2013-11-01 8:21 ` Ingo Molnar
2013-11-01 10:16 ` Yuanhan Liu
2013-11-02 3:15 ` Davidlohr Bueso
2013-11-04 3:59 ` Yuanhan Liu
2013-11-05 1:44 ` Tim Chen
2013-11-05 2:03 ` Tim Chen
2013-11-05 3:41 ` Yuanhan Liu
2013-11-05 3:10 ` Yuanhan Liu
2013-11-05 14:43 ` Yuanhan Liu
2013-11-01 17:49 ` Davidlohr Bueso
2013-11-01 18:09 ` Linus Torvalds
2013-11-01 18:47 ` Michel Lespinasse
2013-11-01 18:55 ` Linus Torvalds
2013-11-02 3:18 ` Davidlohr Bueso
2013-11-01 19:01 ` KOSAKI Motohiro
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=20131101140917.GF30123@yliu-dev.sh.intel.com \
--to=yuanhan.liu@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=riel@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=walken@google.com \
/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.