All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrea Arcangeli <aarcange@redhat.com>
To: Michel Lespinasse <walken@google.com>
Cc: linux-mm@kvack.org, riel@redhat.com, peterz@infradead.org,
	hughd@google.com, daniel.santos@pobox.com,
	linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Subject: Re: [PATCH 2/7] mm: fix potential anon_vma locking issue in mprotect()
Date: Tue, 4 Sep 2012 16:27:45 +0200	[thread overview]
Message-ID: <20120904142745.GE3334@redhat.com> (raw)
In-Reply-To: <1346750457-12385-3-git-send-email-walken@google.com>

Hi Michel,

On Tue, Sep 04, 2012 at 02:20:52AM -0700, Michel Lespinasse wrote:
> This change fixes an anon_vma locking issue in the following situation:
> - vma has no anon_vma
> - next has an anon_vma
> - vma is being shrunk / next is being expanded, due to an mprotect call
> 
> We need to take next's anon_vma lock to avoid races with rmap users
> (such as page migration) while next is being expanded.
> 
> This change also removes an optimization which avoided taking anon_vma
> lock during brk adjustments. We could probably make that optimization
> work again, but the following anon rmap change would break it,
> so I kept things as simple as possible here.

Agreed, definitely a bug not to take the lock whenever any
vm_start/vm_pgoff are moved, regardless if they're the next or current
vma. Only vm_end can be moved without taking the lock.

I'd prefer to fix it like this though:

-	if (vma->anon_vma && (importer || start != vma->vm_start)) {
+	if ((vma->anon_vma && (importer || start != vma->vm_start) ||
+           (adjust_next && next->anon_vma)) {

The strict fix is just to check also if we're moving next->vm_start or
not, and the lock is only needed if next->anon_vma is set (otherwise
there's no page yet set in the vma and we hold the mmap_sem in write
mode clearly that prevents new pages to be instantiated under us).

Plus we know if adjust_next is set, next is not null, so the above
should work. The already existing (optimized) check for the "vma"
should have been ok, so no need to de-optimize it.

Then it's still fine to retain the VM_BUG_ON in the branch where
anon_vma was not null.

Thanks!
Andrea

> 
> Signed-off-by: Michel Lespinasse <walken@google.com>
> ---
>  mm/mmap.c |   14 ++++++--------
>  1 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/mm/mmap.c b/mm/mmap.c
> index cebc346ba0db..5e64c7dfc090 100644
> --- a/mm/mmap.c
> +++ b/mm/mmap.c
> @@ -570,14 +570,12 @@ again:			remove_next = 1 + (end > next->vm_end);
>  
>  	vma_adjust_trans_huge(vma, start, end, adjust_next);
>  
> -	/*
> -	 * When changing only vma->vm_end, we don't really need anon_vma
> -	 * lock. This is a fairly rare case by itself, but the anon_vma
> -	 * lock may be shared between many sibling processes.  Skipping
> -	 * the lock for brk adjustments makes a difference sometimes.
> -	 */
> -	if (vma->anon_vma && (importer || start != vma->vm_start)) {
> -		anon_vma = vma->anon_vma;
> +	anon_vma = vma->anon_vma;
> +	if (!anon_vma && adjust_next)
> +		anon_vma = next->anon_vma;
> +	if (anon_vma) {
> +		VM_BUG_ON(adjust_next && next->anon_vma &&
> +			  anon_vma != next->anon_vma);
>  		anon_vma_lock(anon_vma);
>  	}
>  
> -- 
> 1.7.7.3
> 

--
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>

WARNING: multiple messages have this Message-ID (diff)
From: Andrea Arcangeli <aarcange@redhat.com>
To: Michel Lespinasse <walken@google.com>
Cc: linux-mm@kvack.org, riel@redhat.com, peterz@infradead.org,
	hughd@google.com, daniel.santos@pobox.com,
	linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Subject: Re: [PATCH 2/7] mm: fix potential anon_vma locking issue in mprotect()
Date: Tue, 4 Sep 2012 16:27:45 +0200	[thread overview]
Message-ID: <20120904142745.GE3334@redhat.com> (raw)
In-Reply-To: <1346750457-12385-3-git-send-email-walken@google.com>

Hi Michel,

On Tue, Sep 04, 2012 at 02:20:52AM -0700, Michel Lespinasse wrote:
> This change fixes an anon_vma locking issue in the following situation:
> - vma has no anon_vma
> - next has an anon_vma
> - vma is being shrunk / next is being expanded, due to an mprotect call
> 
> We need to take next's anon_vma lock to avoid races with rmap users
> (such as page migration) while next is being expanded.
> 
> This change also removes an optimization which avoided taking anon_vma
> lock during brk adjustments. We could probably make that optimization
> work again, but the following anon rmap change would break it,
> so I kept things as simple as possible here.

Agreed, definitely a bug not to take the lock whenever any
vm_start/vm_pgoff are moved, regardless if they're the next or current
vma. Only vm_end can be moved without taking the lock.

I'd prefer to fix it like this though:

-	if (vma->anon_vma && (importer || start != vma->vm_start)) {
+	if ((vma->anon_vma && (importer || start != vma->vm_start) ||
+           (adjust_next && next->anon_vma)) {

The strict fix is just to check also if we're moving next->vm_start or
not, and the lock is only needed if next->anon_vma is set (otherwise
there's no page yet set in the vma and we hold the mmap_sem in write
mode clearly that prevents new pages to be instantiated under us).

Plus we know if adjust_next is set, next is not null, so the above
should work. The already existing (optimized) check for the "vma"
should have been ok, so no need to de-optimize it.

Then it's still fine to retain the VM_BUG_ON in the branch where
anon_vma was not null.

Thanks!
Andrea

> 
> Signed-off-by: Michel Lespinasse <walken@google.com>
> ---
>  mm/mmap.c |   14 ++++++--------
>  1 files changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/mm/mmap.c b/mm/mmap.c
> index cebc346ba0db..5e64c7dfc090 100644
> --- a/mm/mmap.c
> +++ b/mm/mmap.c
> @@ -570,14 +570,12 @@ again:			remove_next = 1 + (end > next->vm_end);
>  
>  	vma_adjust_trans_huge(vma, start, end, adjust_next);
>  
> -	/*
> -	 * When changing only vma->vm_end, we don't really need anon_vma
> -	 * lock. This is a fairly rare case by itself, but the anon_vma
> -	 * lock may be shared between many sibling processes.  Skipping
> -	 * the lock for brk adjustments makes a difference sometimes.
> -	 */
> -	if (vma->anon_vma && (importer || start != vma->vm_start)) {
> -		anon_vma = vma->anon_vma;
> +	anon_vma = vma->anon_vma;
> +	if (!anon_vma && adjust_next)
> +		anon_vma = next->anon_vma;
> +	if (anon_vma) {
> +		VM_BUG_ON(adjust_next && next->anon_vma &&
> +			  anon_vma != next->anon_vma);
>  		anon_vma_lock(anon_vma);
>  	}
>  
> -- 
> 1.7.7.3
> 

  reply	other threads:[~2012-09-04 14:27 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-04  9:20 [PATCH 0/7] use interval trees for anon rmap Michel Lespinasse
2012-09-04  9:20 ` Michel Lespinasse
2012-09-04  9:20 ` [PATCH 1/7] mm: interval tree updates Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse
2012-09-07 22:13   ` Andrew Morton
2012-09-07 22:13     ` Andrew Morton
2012-09-07 22:29     ` Michel Lespinasse
2012-09-07 22:29       ` Michel Lespinasse
2012-09-07 22:55       ` Andrew Morton
2012-09-07 22:55         ` Andrew Morton
2012-09-07 23:26         ` Michel Lespinasse
2012-09-07 23:26           ` Michel Lespinasse
2012-09-08  4:45           ` Hillf Danton
2012-09-08  4:45             ` Hillf Danton
2012-09-07 23:26         ` Michel Lespinasse
2012-09-07 23:26           ` Michel Lespinasse
2012-09-04  9:20 ` [PATCH 2/7] mm: fix potential anon_vma locking issue in mprotect() Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse
2012-09-04 14:27   ` Andrea Arcangeli [this message]
2012-09-04 14:27     ` Andrea Arcangeli
2012-09-04 21:53     ` Michel Lespinasse
2012-09-04 21:53       ` Michel Lespinasse
2012-09-04 22:16       ` Andrea Arcangeli
2012-09-04 22:16         ` Andrea Arcangeli
2012-09-05  0:45         ` Michel Lespinasse
2012-09-05  0:45           ` Michel Lespinasse
2012-09-04  9:20 ` [PATCH 3/7] mm anon rmap: remove anon_vma_moveto_tail Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse
2012-09-04  9:20 ` [PATCH 4/7] mm anon rmap: replace same_anon_vma linked list with an interval tree Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse
2012-09-05  0:51   ` Michel Lespinasse
2012-09-05  0:51     ` Michel Lespinasse
2012-09-04  9:20 ` [PATCH 5/7] mm rmap: remove vma_address check for address inside vma Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse
2012-09-04  9:20 ` [PATCH 6/7] mm: add CONFIG_DEBUG_VM_RB build option Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse
2012-09-14 22:14   ` Sasha Levin
2012-09-14 22:14     ` Sasha Levin
2012-09-14 22:40     ` Sasha Levin
2012-09-14 22:40       ` Sasha Levin
2012-09-14 22:46     ` Michel Lespinasse
2012-09-14 22:46       ` Michel Lespinasse
2012-09-15  0:00       ` Michel Lespinasse
2012-09-15  0:00         ` Michel Lespinasse
2012-09-15  7:52         ` Jiri Slaby
2012-09-15  7:52           ` Jiri Slaby
2012-09-16 19:07           ` Hugh Dickins
2012-09-16 19:07             ` Hugh Dickins
2012-09-22  7:19             ` Jiri Slaby
2012-09-22  7:19               ` Jiri Slaby
2012-09-15  9:26         ` Sasha Levin
2012-09-15  9:26           ` Sasha Levin
2012-09-20 21:39           ` Fengguang Wu
2012-09-20 22:27             ` Hugh Dickins
2012-09-20 22:27               ` Hugh Dickins
2012-09-20 22:31               ` Fengguang Wu
2012-09-20 22:31                 ` Fengguang Wu
2012-09-04  9:20 ` [PATCH 7/7] mm: avoid taking rmap locks in move_ptes() Michel Lespinasse
2012-09-04  9:20   ` Michel Lespinasse

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=20120904142745.GE3334@redhat.com \
    --to=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=daniel.santos@pobox.com \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --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.