All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gleb Natapov <gleb@redhat.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Russell King <rmk+kernel@arm.linux.org.uk>,
	Thomas Gleixner <tglx@linutronix.de>,
	Peter Zijlstra <peterz@infradead.org>,
	Hugh Dickins <hughd@google.com>, Rik van Riel <riel@redhat.com>,
	Michel Lespinasse <walken@google.com>,
	Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>
Subject: Re: [PATCH 2/2] mm: Document handle_mm_fault()
Date: Tue, 28 Jun 2011 20:09:53 +0300	[thread overview]
Message-ID: <20110628170953.GA3482@redhat.com> (raw)
In-Reply-To: <20110628165303.010143380@goodmis.org>

On Tue, Jun 28, 2011 at 12:47:52PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <srostedt@redhat.com>
> 
> The function handle_mm_fault() is long overdue for comments.
> Adding a kernel doc header for the function and explaining the subtle
> use of the flags with respect to mmap_sem will prove useful in the
> future when others work with this code.
> 
> Russell King noticed that the code in arch/x86/mm/fault.c looked
> buggy as the do_page_fault() code would grab the mmap_sem multiple
> times without letting it go. But it only did this when the
> handle_mm_fault() would return VM_FAULT_RETRY.
> 
> Examining the code and reading the git change logs, it was discovered
> that commit d065bd810b6deb67d4897a14bfe21f8eb526ba99
>   mm: retry page fault when blocking on disk transfer
> added code to remove contention with the mmap_sem when the page_lock
> was being held for IO. As waiting on IO holding the mmap_sem can
> cause lots of contention between threads. The flag
> FAULT_FLAG_ALLOW_RETRY was added to let handle_mm_fault() know
> that it can safely release the mmap_sem.
> 
> Adding to the confusion here with handle_mm_fault(), another
>   commit 318b275fbca1ab9ec0862de71420e0e92c3d1aa7
>   mm: allow GUP to fail instead of waiting on a page
> was added that would not release the mmap_sem, even if
> FAULT_FLAG_ALLOW_RETRY was set and the page_lock was not taken
> and VM_FAULT_RETRY was returned, if FAULT_FLAGS_RETRY_NOWAIT was
> set.
> 
> All of this is poorly documented and makes using or modifying
> handle_mm_fault() fragile. Documenting all of these subtle changes
> at the head of handle_mm_fault() should help future developers
> understand what is happening.
> 
> Reported-by: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Gleb Natapov <gleb@redhat.com>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Michel Lespinasse <walken@google.com>
> Cc: Avi Kivity <avi@redhat.com>
> Cc: Marcelo Tosatti <mtosatti@redhat.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> ---
>  mm/memory.c |   22 ++++++++++++++++++++--
>  1 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/memory.c b/mm/memory.c
> index 5371b5e..3cf30f6 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -3378,8 +3378,26 @@ unlock:
>  	return 0;
>  }
>  
> -/*
> - * By the time we get here, we already hold the mm semaphore
> +/**
> + * handle_mm_fault - main routine for handling page faults
> + * @mm:		the mm_struct of the target address space
> + * @vma:	vm_area_struct holding the applicable pages
> + * @address:	the address that took the fault
> + * @flags:	flags modifying lookup behaviour
> + *
> + * Must have @mm->mmap_sem held.
> + *
> + * Note: if @flags has FAULT_FLAG_ALLOW_RETRY set then the mmap_sem
> + *       may be released if it failed to arquire the page_lock. If the
> + *       mmap_sem is released then it will return VM_FAULT_RETRY set.
> + *       This is to keep the time mmap_sem is held when the page_lock
> + *       is taken for IO.
> + * Exception: If FAULT_FLAG_RETRY_NOWAIT is set, then it will
> + *       not release the mmap_sem, but will still return VM_FAULT_RETRY
> + *       if it failed to acquire the page_lock.
I wouldn't describe it like that. It tells handle_mm_fault() to start
IO if needed, but do not wait for its completion.

> + *       This is for helping virtualization. See get_user_page_nowait().
The virtialization is the only user right now, but I wouldn't describe
this flag as virtialization specific. Why should we put this in the
comment?  The comment will become outdated when other users arise
and meanwhile a simple grep will reveal the above information anyway.

> + *
> + * Returns status flags based on the VM_FAULT_* flags in <linux/mm.h>
>   */
>  int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
>  		unsigned long address, unsigned int flags)
> -- 
> 1.7.5.4
> 

--
			Gleb.

WARNING: multiple messages have this Message-ID (diff)
From: Gleb Natapov <gleb@redhat.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Russell King <rmk+kernel@arm.linux.org.uk>,
	Thomas Gleixner <tglx@linutronix.de>,
	Peter Zijlstra <peterz@infradead.org>,
	Hugh Dickins <hughd@google.com>, Rik van Riel <riel@redhat.com>,
	Michel Lespinasse <walken@google.com>,
	Avi Kivity <avi@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>
Subject: Re: [PATCH 2/2] mm: Document handle_mm_fault()
Date: Tue, 28 Jun 2011 20:09:53 +0300	[thread overview]
Message-ID: <20110628170953.GA3482@redhat.com> (raw)
In-Reply-To: <20110628165303.010143380@goodmis.org>

On Tue, Jun 28, 2011 at 12:47:52PM -0400, Steven Rostedt wrote:
> From: Steven Rostedt <srostedt@redhat.com>
> 
> The function handle_mm_fault() is long overdue for comments.
> Adding a kernel doc header for the function and explaining the subtle
> use of the flags with respect to mmap_sem will prove useful in the
> future when others work with this code.
> 
> Russell King noticed that the code in arch/x86/mm/fault.c looked
> buggy as the do_page_fault() code would grab the mmap_sem multiple
> times without letting it go. But it only did this when the
> handle_mm_fault() would return VM_FAULT_RETRY.
> 
> Examining the code and reading the git change logs, it was discovered
> that commit d065bd810b6deb67d4897a14bfe21f8eb526ba99
>   mm: retry page fault when blocking on disk transfer
> added code to remove contention with the mmap_sem when the page_lock
> was being held for IO. As waiting on IO holding the mmap_sem can
> cause lots of contention between threads. The flag
> FAULT_FLAG_ALLOW_RETRY was added to let handle_mm_fault() know
> that it can safely release the mmap_sem.
> 
> Adding to the confusion here with handle_mm_fault(), another
>   commit 318b275fbca1ab9ec0862de71420e0e92c3d1aa7
>   mm: allow GUP to fail instead of waiting on a page
> was added that would not release the mmap_sem, even if
> FAULT_FLAG_ALLOW_RETRY was set and the page_lock was not taken
> and VM_FAULT_RETRY was returned, if FAULT_FLAGS_RETRY_NOWAIT was
> set.
> 
> All of this is poorly documented and makes using or modifying
> handle_mm_fault() fragile. Documenting all of these subtle changes
> at the head of handle_mm_fault() should help future developers
> understand what is happening.
> 
> Reported-by: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Gleb Natapov <gleb@redhat.com>
> Cc: Linus Torvalds <torvalds@linux-foundation.org>
> Cc: Hugh Dickins <hughd@google.com>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Michel Lespinasse <walken@google.com>
> Cc: Avi Kivity <avi@redhat.com>
> Cc: Marcelo Tosatti <mtosatti@redhat.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> ---
>  mm/memory.c |   22 ++++++++++++++++++++--
>  1 files changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/memory.c b/mm/memory.c
> index 5371b5e..3cf30f6 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -3378,8 +3378,26 @@ unlock:
>  	return 0;
>  }
>  
> -/*
> - * By the time we get here, we already hold the mm semaphore
> +/**
> + * handle_mm_fault - main routine for handling page faults
> + * @mm:		the mm_struct of the target address space
> + * @vma:	vm_area_struct holding the applicable pages
> + * @address:	the address that took the fault
> + * @flags:	flags modifying lookup behaviour
> + *
> + * Must have @mm->mmap_sem held.
> + *
> + * Note: if @flags has FAULT_FLAG_ALLOW_RETRY set then the mmap_sem
> + *       may be released if it failed to arquire the page_lock. If the
> + *       mmap_sem is released then it will return VM_FAULT_RETRY set.
> + *       This is to keep the time mmap_sem is held when the page_lock
> + *       is taken for IO.
> + * Exception: If FAULT_FLAG_RETRY_NOWAIT is set, then it will
> + *       not release the mmap_sem, but will still return VM_FAULT_RETRY
> + *       if it failed to acquire the page_lock.
I wouldn't describe it like that. It tells handle_mm_fault() to start
IO if needed, but do not wait for its completion.

> + *       This is for helping virtualization. See get_user_page_nowait().
The virtialization is the only user right now, but I wouldn't describe
this flag as virtialization specific. Why should we put this in the
comment?  The comment will become outdated when other users arise
and meanwhile a simple grep will reveal the above information anyway.

> + *
> + * Returns status flags based on the VM_FAULT_* flags in <linux/mm.h>
>   */
>  int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
>  		unsigned long address, unsigned int flags)
> -- 
> 1.7.5.4
> 

--
			Gleb.

--
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/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2011-06-28 17:11 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-28 16:47 [PATCH 0/2] mm: Clean up and document fault and RETRY mmap_sem Steven Rostedt
2011-06-28 16:47 ` Steven Rostedt
2011-06-28 16:47 ` [PATCH 1/2] mm: Remove use of ALLOW_RETRY when RETRY_NOWAIT is set Steven Rostedt
2011-06-28 16:47   ` Steven Rostedt
2011-06-29  9:38   ` Michel Lespinasse
2011-06-29  9:38     ` Michel Lespinasse
2011-06-29 12:43     ` Steven Rostedt
2011-06-29 12:43       ` Steven Rostedt
2011-06-28 16:47 ` [PATCH 2/2] mm: Document handle_mm_fault() Steven Rostedt
2011-06-28 16:47   ` Steven Rostedt
2011-06-28 16:59   ` Steven Rostedt
2011-06-28 16:59     ` Steven Rostedt
2011-06-28 17:02   ` Linus Torvalds
2011-06-28 17:02     ` Linus Torvalds
2011-06-28 17:22     ` Steven Rostedt
2011-06-28 17:22       ` Steven Rostedt
2011-06-28 17:09   ` Gleb Natapov [this message]
2011-06-28 17:09     ` Gleb Natapov
2011-06-28 17:16     ` Steven Rostedt
2011-06-28 17:16       ` Steven Rostedt

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=20110628170953.GA3482@redhat.com \
    --to=gleb@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=avi@redhat.com \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mtosatti@redhat.com \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --cc=rmk+kernel@arm.linux.org.uk \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --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.