All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Glisse <jglisse@redhat.com>
To: Peter Xu <peterx@redhat.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	David Hildenbrand <david@redhat.com>,
	Hugh Dickins <hughd@google.com>, Maya Gokhale <gokhale2@llnl.gov>,
	Pavel Emelyanov <xemul@virtuozzo.com>,
	Martin Cracauer <cracauer@cons.org>, Shaohua Li <shli@fb.com>,
	Marty McFadden <mcfadden8@llnl.gov>,
	Andrea Arcangeli <aarcange@redhat.com>,
	Mike Kravetz <mike.kravetz@oracle.com>,
	Denis Plotnikov <dplotnikov@virtuozzo.com>,
	Mike Rapoport <rppt@linux.vnet.ibm.com>,
	Mel Gorman <mgorman@suse.de>,
	"Kirill A . Shutemov" <kirill@shutemov.name>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [PATCH v2.1 04/26] mm: allow VM_FAULT_RETRY for multiple times
Date: Fri, 22 Feb 2019 10:11:58 -0500	[thread overview]
Message-ID: <20190222151101.GA7783@redhat.com> (raw)
In-Reply-To: <20190222042544.GD8904@xz-x1>

On Fri, Feb 22, 2019 at 12:25:44PM +0800, Peter Xu wrote:
> On Thu, Feb 21, 2019 at 10:53:11AM -0500, Jerome Glisse wrote:
> > On Thu, Feb 21, 2019 at 04:56:56PM +0800, Peter Xu wrote:
> > > The idea comes from a discussion between Linus and Andrea [1].

[...]

> > > diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
> > > index 248ff0a28ecd..d842c3e02a50 100644
> > > --- a/arch/x86/mm/fault.c
> > > +++ b/arch/x86/mm/fault.c
> > > @@ -1483,9 +1483,7 @@ void do_user_addr_fault(struct pt_regs *regs,
> > >  	if (unlikely(fault & VM_FAULT_RETRY)) {
> > >  		bool is_user = flags & FAULT_FLAG_USER;
> > >  
> > > -		/* Retry at most once */
> > >  		if (flags & FAULT_FLAG_ALLOW_RETRY) {
> > > -			flags &= ~FAULT_FLAG_ALLOW_RETRY;
> > >  			flags |= FAULT_FLAG_TRIED;
> > >  			if (is_user && signal_pending(tsk))
> > >  				return;
> > 
> > So here you have a change in behavior, it can retry indefinitly for as
> > long as they are no signal. Don't you want so test for FAULT_FLAG_TRIED ?
> 
> These first five patches do want to allow the page fault to retry as
> much as needed.  "indefinitely" seems to be a scary word, but IMHO
> this is fine for page faults since otherwise we'll simply crash the
> program or even crash the system depending on the fault context, so it
> seems to be nowhere worse.
> 
> For userspace programs, if anything really really go wrong (so far I
> still cannot think a valid scenario in a bug-free system, but just
> assuming...) and it loops indefinitely, IMHO it'll just hang the buggy
> process itself rather than coredump, and the admin can simply kill the
> process to retake the resources since we'll still detect signals.
> 
> Or did I misunderstood the question?

No i think you are right, it is fine to keep retrying while they are
no signal maybe just add a comment that says so in so many words :)
So people do not see that as a potential issue.

> > [...]
> > 
> > > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > > index 80bb6408fe73..4e11c9639f1b 100644
> > > --- a/include/linux/mm.h
> > > +++ b/include/linux/mm.h
> > > @@ -341,11 +341,21 @@ extern pgprot_t protection_map[16];
> > >  #define FAULT_FLAG_ALLOW_RETRY	0x04	/* Retry fault if blocking */
> > >  #define FAULT_FLAG_RETRY_NOWAIT	0x08	/* Don't drop mmap_sem and wait when retrying */
> > >  #define FAULT_FLAG_KILLABLE	0x10	/* The fault task is in SIGKILL killable region */
> > > -#define FAULT_FLAG_TRIED	0x20	/* Second try */
> > > +#define FAULT_FLAG_TRIED	0x20	/* We've tried once */
> > >  #define FAULT_FLAG_USER		0x40	/* The fault originated in userspace */
> > >  #define FAULT_FLAG_REMOTE	0x80	/* faulting for non current tsk/mm */
> > >  #define FAULT_FLAG_INSTRUCTION  0x100	/* The fault was during an instruction fetch */
> > >  
> > > +/*
> > > + * Returns true if the page fault allows retry and this is the first
> > > + * attempt of the fault handling; false otherwise.
> > > + */
> > 
> > You should add why it returns false if it is not the first try ie to
> > avoid starvation.
> 
> How about:
> 
>         Returns true if the page fault allows retry and this is the
>         first attempt of the fault handling; false otherwise.  This is
>         mostly used for places where we want to try to avoid taking
>         the mmap_sem for too long a time when waiting for another
>         condition to change, in which case we can try to be polite to
>         release the mmap_sem in the first round to avoid potential
>         starvation of other processes that would also want the
>         mmap_sem.
> 
> ?

Looks perfect to me.

Cheers,
Jérôme


  reply	other threads:[~2019-02-22 15:12 UTC|newest]

Thread overview: 113+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-12  2:56 [PATCH v2 00/26] userfaultfd: write protection support Peter Xu
2019-02-12  2:56 ` [PATCH v2 01/26] mm: gup: rename "nonblocking" to "locked" where proper Peter Xu
2019-02-21 15:17   ` Jerome Glisse
2019-02-22  3:42     ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 02/26] mm: userfault: return VM_FAULT_RETRY on signals Peter Xu
2019-02-21 15:29   ` Jerome Glisse
2019-02-22  3:51     ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 03/26] userfaultfd: don't retake mmap_sem to emulate NOPAGE Peter Xu
2019-02-21 15:34   ` Jerome Glisse
2019-02-12  2:56 ` [PATCH v2 04/26] mm: allow VM_FAULT_RETRY for multiple times Peter Xu
2019-02-13  3:34   ` Peter Xu
2019-02-20 11:48     ` Peter Xu
2019-02-21  8:56   ` [PATCH v2.1 " Peter Xu
2019-02-21 15:53     ` Jerome Glisse
2019-02-22  4:25       ` Peter Xu
2019-02-22 15:11         ` Jerome Glisse [this message]
2019-02-25  6:19           ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 05/26] mm: gup: " Peter Xu
2019-02-21 16:06   ` Jerome Glisse
2019-02-22  4:41     ` Peter Xu
2019-02-22 15:13       ` Jerome Glisse
2019-02-12  2:56 ` [PATCH v2 06/26] userfaultfd: wp: add helper for writeprotect check Peter Xu
2019-02-21 16:07   ` Jerome Glisse
2019-02-25 15:41   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 07/26] userfaultfd: wp: hook userfault handler to write protection fault Peter Xu
2019-02-21 16:25   ` Jerome Glisse
2019-02-25 15:43   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 08/26] userfaultfd: wp: add WP pagetable tracking to x86 Peter Xu
2019-02-21 17:20   ` Jerome Glisse
2019-02-25 15:48   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 09/26] userfaultfd: wp: userfaultfd_pte/huge_pmd_wp() helpers Peter Xu
2019-02-21 17:21   ` Jerome Glisse
2019-02-25 17:12   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 10/26] userfaultfd: wp: add UFFDIO_COPY_MODE_WP Peter Xu
2019-02-21 17:29   ` Jerome Glisse
2019-02-22  7:11     ` Peter Xu
2019-02-22 15:15       ` Jerome Glisse
2019-02-25  6:45         ` Peter Xu
2019-02-25 15:58   ` Mike Rapoport
2019-02-26  5:09     ` Peter Xu
2019-02-26  8:28       ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 11/26] mm: merge parameters for change_protection() Peter Xu
2019-02-21 17:32   ` Jerome Glisse
2019-02-12  2:56 ` [PATCH v2 12/26] userfaultfd: wp: apply _PAGE_UFFD_WP bit Peter Xu
2019-02-21 17:44   ` Jerome Glisse
2019-02-22  7:31     ` Peter Xu
2019-02-22 15:17       ` Jerome Glisse
2019-02-25 18:00   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 13/26] mm: export wp_page_copy() Peter Xu
2019-02-21 17:44   ` Jerome Glisse
2019-02-12  2:56 ` [PATCH v2 14/26] userfaultfd: wp: handle COW properly for uffd-wp Peter Xu
2019-02-21 18:04   ` Jerome Glisse
2019-02-22  8:46     ` Peter Xu
2019-02-22 15:35       ` Jerome Glisse
2019-02-25  7:13         ` Peter Xu
2019-02-25 15:32           ` Jerome Glisse
2019-02-12  2:56 ` [PATCH v2 15/26] userfaultfd: wp: drop _PAGE_UFFD_WP properly when fork Peter Xu
2019-02-21 18:06   ` Jerome Glisse
2019-02-22  9:09     ` Peter Xu
2019-02-22 15:36       ` Jerome Glisse
2019-02-25 18:19   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 16/26] userfaultfd: wp: add pmd_swp_*uffd_wp() helpers Peter Xu
2019-02-21 18:07   ` Jerome Glisse
2019-02-25 18:20   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 17/26] userfaultfd: wp: support swap and page migration Peter Xu
2019-02-21 18:16   ` Jerome Glisse
2019-02-25  7:48     ` Peter Xu
2019-02-25 18:28   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 18/26] khugepaged: skip collapse if uffd-wp detected Peter Xu
2019-02-21 18:17   ` Jerome Glisse
2019-02-25 18:50   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 19/26] userfaultfd: introduce helper vma_find_uffd Peter Xu
2019-02-21 18:19   ` Jerome Glisse
2019-02-25 20:48   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 20/26] userfaultfd: wp: support write protection for userfault vma range Peter Xu
2019-02-21 18:23   ` Jerome Glisse
2019-02-25  8:16     ` Peter Xu
2019-02-25 20:52   ` Mike Rapoport
2019-02-26  6:06     ` Peter Xu
2019-02-26  6:43       ` Mike Rapoport
2019-02-26  7:20         ` Peter Xu
2019-02-26  7:46           ` Mike Rapoport
2019-02-26  7:54             ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 21/26] userfaultfd: wp: add the writeprotect API to userfaultfd ioctl Peter Xu
2019-02-21 18:28   ` Jerome Glisse
2019-02-25  8:31     ` Peter Xu
2019-02-25 21:03   ` Mike Rapoport
2019-02-26  6:30     ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 22/26] userfaultfd: wp: enabled write protection in userfaultfd API Peter Xu
2019-02-21 18:29   ` Jerome Glisse
2019-02-25  8:34     ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 23/26] userfaultfd: wp: don't wake up when doing write protect Peter Xu
2019-02-21 18:36   ` Jerome Glisse
2019-02-25  8:58     ` Peter Xu
2019-02-25 21:15       ` Mike Rapoport
2019-02-25 21:09   ` Mike Rapoport
2019-02-26  6:24     ` Peter Xu
2019-02-26  7:29       ` Mike Rapoport
2019-02-26  7:41         ` Peter Xu
2019-02-26  8:00           ` Mike Rapoport
2019-02-28  2:47             ` Peter Xu
2019-02-26  8:00   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 24/26] userfaultfd: wp: UFFDIO_REGISTER_MODE_WP documentation update Peter Xu
2019-02-21 18:38   ` Jerome Glisse
2019-02-25 21:19   ` Mike Rapoport
2019-02-26  6:53     ` Peter Xu
2019-02-26  7:04       ` Mike Rapoport
2019-02-26  7:42         ` Peter Xu
2019-02-12  2:56 ` [PATCH v2 25/26] userfaultfd: selftests: refactor statistics Peter Xu
2019-02-26  6:50   ` Mike Rapoport
2019-02-12  2:56 ` [PATCH v2 26/26] userfaultfd: selftests: add write-protect test Peter Xu
2019-02-26  6:58   ` Mike Rapoport
2019-02-26  7:52     ` Peter Xu

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=20190222151101.GA7783@redhat.com \
    --to=jglisse@redhat.com \
    --cc=aarcange@redhat.com \
    --cc=cracauer@cons.org \
    --cc=david@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=dplotnikov@virtuozzo.com \
    --cc=gokhale2@llnl.gov \
    --cc=hughd@google.com \
    --cc=kirill@shutemov.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mcfadden8@llnl.gov \
    --cc=mgorman@suse.de \
    --cc=mike.kravetz@oracle.com \
    --cc=peterx@redhat.com \
    --cc=rppt@linux.vnet.ibm.com \
    --cc=shli@fb.com \
    --cc=xemul@virtuozzo.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.