All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>,
	linux-mm@kvack.org, nouveau@lists.freedesktop.org,
	bskeggs@redhat.com, akpm@linux-foundation.org,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	dri-devel@lists.freedesktop.org, jhubbard@nvidia.com,
	rcampbell@nvidia.com, jglisse@redhat.com, hch@infradead.org,
	daniel@ffwll.ch, willy@infradead.org, bsingharora@gmail.com,
	Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH v8 5/8] mm: Device exclusive memory access
Date: Tue, 18 May 2021 16:29:14 -0400	[thread overview]
Message-ID: <YKQjmtMo+YQGx/wZ@t490s> (raw)
In-Reply-To: <20210518194509.GF1002214@nvidia.com>

On Tue, May 18, 2021 at 04:45:09PM -0300, Jason Gunthorpe wrote:
> On Tue, May 18, 2021 at 02:01:36PM -0400, Peter Xu wrote:
> > > > Indeed it'll be odd for a COW page since for COW page then it means after
> > > > parent/child writting to the page it'll clone into two, then it's a mistery on
> > > > which one will be the one that "exclusived owned" by the device..
> > > 
> > > For COW pages it is like every other fork case.. We can't reliably
> > > write-protect the device_exclusive page during fork so we must copy it
> > > at fork time.
> > > 
> > > Thus three reasonable choices:
> > >  - Copy to a new CPU page
> > >  - Migrate back to a CPU page and write protect it
> > >  - Copy to a new device exclusive page
> > 
> > IMHO the ownership question would really help us to answer this one..
> 
> I'm confused about what device ownership you are talking about

My question was more about the user scenario rather than anything related to
the kernel code, nor does it related to page struct at all.

Let me try to be a little bit more verbose...

Firstly, I think one simple solution to handle fork() of device exclusive ptes
is to do just like device private ptes: if COW we convert writable ptes into
readable ptes.  Then when CPU access happens (in either parent/child) page
restore triggers which will convert those readable ptes into read-only present
ptes (with the original page backing it).  Then do_wp_page() will take care of
page copy.

However... if you see that also means parent/child have the equal opportunity
to reuse that original page: who access first will do COW because refcount>1
for that page (note! it's possible that mapcount==1 here, as we drop mapcount
when converting to device exclusive ptes; however with the most recent
do_wp_page change from Linus where we'll also check page_count(), we'll still
do COW just like when this page was GUPed by someone else).  While that matters
because the device is writting to that original page only, not the COWed one.

Then here comes the ownership question: If we still want to have the parent
process behave like before it fork()ed, IMHO we must make sure that original
page (that exclusively owned by the device once) still belongs to the parent
process not the child.  That's why I think if that's the case we'd do early cow
in fork(), because it guarantees that.

I can't say I fully understand the whole picture, so sorry if I missed
something important there.

Thanks,

-- 
Peter Xu


WARNING: multiple messages have this Message-ID (diff)
From: Peter Xu <peterx@redhat.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: rcampbell@nvidia.com, willy@infradead.org,
	linux-doc@vger.kernel.org, nouveau@lists.freedesktop.org,
	bsingharora@gmail.com, Alistair Popple <apopple@nvidia.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	hch@infradead.org, linux-mm@kvack.org, bskeggs@redhat.com,
	daniel@ffwll.ch, akpm@linux-foundation.org,
	Christoph Hellwig <hch@lst.de>
Subject: Re: [Nouveau] [PATCH v8 5/8] mm: Device exclusive memory access
Date: Tue, 18 May 2021 16:29:14 -0400	[thread overview]
Message-ID: <YKQjmtMo+YQGx/wZ@t490s> (raw)
In-Reply-To: <20210518194509.GF1002214@nvidia.com>

On Tue, May 18, 2021 at 04:45:09PM -0300, Jason Gunthorpe wrote:
> On Tue, May 18, 2021 at 02:01:36PM -0400, Peter Xu wrote:
> > > > Indeed it'll be odd for a COW page since for COW page then it means after
> > > > parent/child writting to the page it'll clone into two, then it's a mistery on
> > > > which one will be the one that "exclusived owned" by the device..
> > > 
> > > For COW pages it is like every other fork case.. We can't reliably
> > > write-protect the device_exclusive page during fork so we must copy it
> > > at fork time.
> > > 
> > > Thus three reasonable choices:
> > >  - Copy to a new CPU page
> > >  - Migrate back to a CPU page and write protect it
> > >  - Copy to a new device exclusive page
> > 
> > IMHO the ownership question would really help us to answer this one..
> 
> I'm confused about what device ownership you are talking about

My question was more about the user scenario rather than anything related to
the kernel code, nor does it related to page struct at all.

Let me try to be a little bit more verbose...

Firstly, I think one simple solution to handle fork() of device exclusive ptes
is to do just like device private ptes: if COW we convert writable ptes into
readable ptes.  Then when CPU access happens (in either parent/child) page
restore triggers which will convert those readable ptes into read-only present
ptes (with the original page backing it).  Then do_wp_page() will take care of
page copy.

However... if you see that also means parent/child have the equal opportunity
to reuse that original page: who access first will do COW because refcount>1
for that page (note! it's possible that mapcount==1 here, as we drop mapcount
when converting to device exclusive ptes; however with the most recent
do_wp_page change from Linus where we'll also check page_count(), we'll still
do COW just like when this page was GUPed by someone else).  While that matters
because the device is writting to that original page only, not the COWed one.

Then here comes the ownership question: If we still want to have the parent
process behave like before it fork()ed, IMHO we must make sure that original
page (that exclusively owned by the device once) still belongs to the parent
process not the child.  That's why I think if that's the case we'd do early cow
in fork(), because it guarantees that.

I can't say I fully understand the whole picture, so sorry if I missed
something important there.

Thanks,

-- 
Peter Xu

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

WARNING: multiple messages have this Message-ID (diff)
From: Peter Xu <peterx@redhat.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: rcampbell@nvidia.com, willy@infradead.org,
	linux-doc@vger.kernel.org, nouveau@lists.freedesktop.org,
	bsingharora@gmail.com, Alistair Popple <apopple@nvidia.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	hch@infradead.org, linux-mm@kvack.org, jglisse@redhat.com,
	bskeggs@redhat.com, jhubbard@nvidia.com,
	akpm@linux-foundation.org, Christoph Hellwig <hch@lst.de>
Subject: Re: [PATCH v8 5/8] mm: Device exclusive memory access
Date: Tue, 18 May 2021 16:29:14 -0400	[thread overview]
Message-ID: <YKQjmtMo+YQGx/wZ@t490s> (raw)
In-Reply-To: <20210518194509.GF1002214@nvidia.com>

On Tue, May 18, 2021 at 04:45:09PM -0300, Jason Gunthorpe wrote:
> On Tue, May 18, 2021 at 02:01:36PM -0400, Peter Xu wrote:
> > > > Indeed it'll be odd for a COW page since for COW page then it means after
> > > > parent/child writting to the page it'll clone into two, then it's a mistery on
> > > > which one will be the one that "exclusived owned" by the device..
> > > 
> > > For COW pages it is like every other fork case.. We can't reliably
> > > write-protect the device_exclusive page during fork so we must copy it
> > > at fork time.
> > > 
> > > Thus three reasonable choices:
> > >  - Copy to a new CPU page
> > >  - Migrate back to a CPU page and write protect it
> > >  - Copy to a new device exclusive page
> > 
> > IMHO the ownership question would really help us to answer this one..
> 
> I'm confused about what device ownership you are talking about

My question was more about the user scenario rather than anything related to
the kernel code, nor does it related to page struct at all.

Let me try to be a little bit more verbose...

Firstly, I think one simple solution to handle fork() of device exclusive ptes
is to do just like device private ptes: if COW we convert writable ptes into
readable ptes.  Then when CPU access happens (in either parent/child) page
restore triggers which will convert those readable ptes into read-only present
ptes (with the original page backing it).  Then do_wp_page() will take care of
page copy.

However... if you see that also means parent/child have the equal opportunity
to reuse that original page: who access first will do COW because refcount>1
for that page (note! it's possible that mapcount==1 here, as we drop mapcount
when converting to device exclusive ptes; however with the most recent
do_wp_page change from Linus where we'll also check page_count(), we'll still
do COW just like when this page was GUPed by someone else).  While that matters
because the device is writting to that original page only, not the COWed one.

Then here comes the ownership question: If we still want to have the parent
process behave like before it fork()ed, IMHO we must make sure that original
page (that exclusively owned by the device once) still belongs to the parent
process not the child.  That's why I think if that's the case we'd do early cow
in fork(), because it guarantees that.

I can't say I fully understand the whole picture, so sorry if I missed
something important there.

Thanks,

-- 
Peter Xu


  reply	other threads:[~2021-05-18 20:29 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07  8:42 [PATCH v8 0/8] Add support for SVM atomics in Nouveau Alistair Popple
2021-04-07  8:42 ` Alistair Popple
2021-04-07  8:42 ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 1/8] mm: Remove special swap entry functions Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-05-18  2:17   ` Peter Xu
2021-05-18  2:17     ` Peter Xu
2021-05-18  2:17     ` [Nouveau] " Peter Xu
2021-05-18 11:58     ` Alistair Popple
2021-05-18 11:58       ` Alistair Popple
2021-05-18 11:58       ` [Nouveau] " Alistair Popple
2021-05-18 14:17       ` Peter Xu
2021-05-18 14:17         ` Peter Xu
2021-05-18 14:17         ` [Nouveau] " Peter Xu
2021-04-07  8:42 ` [PATCH v8 2/8] mm/swapops: Rework swap entry manipulation code Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 3/8] mm/rmap: Split try_to_munlock from try_to_unmap Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-05-18 20:04   ` Liam Howlett
2021-05-18 20:04     ` Liam Howlett
2021-05-18 20:04     ` [Nouveau] " Liam Howlett
2021-05-19 12:38     ` Alistair Popple
2021-05-19 12:38       ` Alistair Popple
2021-05-19 12:38       ` [Nouveau] " Alistair Popple
2021-05-20 20:24       ` Liam Howlett
2021-05-20 20:24         ` Liam Howlett
2021-05-20 20:24         ` [Nouveau] " Liam Howlett
2021-05-21  2:23         ` Alistair Popple
2021-05-21  2:23           ` Alistair Popple
2021-05-21  2:23           ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 4/8] mm/rmap: Split migration into its own function Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 5/8] mm: Device exclusive memory access Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-05-18  2:08   ` Peter Xu
2021-05-18  2:08     ` Peter Xu
2021-05-18  2:08     ` [Nouveau] " Peter Xu
2021-05-18 13:19     ` Alistair Popple
2021-05-18 13:19       ` Alistair Popple
2021-05-18 13:19       ` [Nouveau] " Alistair Popple
2021-05-18 17:27       ` Peter Xu
2021-05-18 17:27         ` Peter Xu
2021-05-18 17:27         ` [Nouveau] " Peter Xu
2021-05-18 17:33         ` Jason Gunthorpe
2021-05-18 17:33           ` Jason Gunthorpe
2021-05-18 17:33           ` [Nouveau] " Jason Gunthorpe
2021-05-18 18:01           ` Peter Xu
2021-05-18 18:01             ` Peter Xu
2021-05-18 18:01             ` [Nouveau] " Peter Xu
2021-05-18 19:45             ` Jason Gunthorpe
2021-05-18 19:45               ` Jason Gunthorpe
2021-05-18 19:45               ` [Nouveau] " Jason Gunthorpe
2021-05-18 20:29               ` Peter Xu [this message]
2021-05-18 20:29                 ` Peter Xu
2021-05-18 20:29                 ` [Nouveau] " Peter Xu
2021-05-18 23:03                 ` Jason Gunthorpe
2021-05-18 23:03                   ` Jason Gunthorpe
2021-05-18 23:03                   ` [Nouveau] " Jason Gunthorpe
2021-05-18 23:45                   ` Peter Xu
2021-05-18 23:45                     ` Peter Xu
2021-05-18 23:45                     ` [Nouveau] " Peter Xu
2021-05-19 11:04                     ` Alistair Popple
2021-05-19 11:04                       ` Alistair Popple
2021-05-19 11:04                       ` [Nouveau] " Alistair Popple
2021-05-19 12:15                       ` Peter Xu
2021-05-19 12:15                         ` Peter Xu
2021-05-19 12:15                         ` [Nouveau] " Peter Xu
2021-05-19 13:11                         ` Alistair Popple
2021-05-19 13:11                           ` Alistair Popple
2021-05-19 13:11                           ` [Nouveau] " Alistair Popple
2021-05-19 14:04                           ` Peter Xu
2021-05-19 14:04                             ` Peter Xu
2021-05-19 14:04                             ` [Nouveau] " Peter Xu
2021-05-19 13:28                     ` Jason Gunthorpe
2021-05-19 13:28                       ` Jason Gunthorpe
2021-05-19 13:28                       ` [Nouveau] " Jason Gunthorpe
2021-05-19 14:09                       ` Peter Xu
2021-05-19 14:09                         ` Peter Xu
2021-05-19 14:09                         ` [Nouveau] " Peter Xu
2021-05-19 18:11                         ` Jason Gunthorpe
2021-05-19 18:11                           ` Jason Gunthorpe
2021-05-19 18:11                           ` [Nouveau] " Jason Gunthorpe
2021-05-19 11:35         ` Alistair Popple
2021-05-19 11:35           ` Alistair Popple
2021-05-19 11:35           ` [Nouveau] " Alistair Popple
2021-05-19 12:21           ` Peter Xu
2021-05-19 12:21             ` Peter Xu
2021-05-19 12:21             ` [Nouveau] " Peter Xu
2021-05-19 12:46             ` Alistair Popple
2021-05-19 12:46               ` Alistair Popple
2021-05-19 12:46               ` [Nouveau] " Alistair Popple
2021-05-21  6:53       ` Alistair Popple
2021-05-21  6:53         ` Alistair Popple
2021-05-21  6:53         ` [Nouveau] " Alistair Popple
2021-05-18 21:16   ` Peter Xu
2021-05-18 21:16     ` Peter Xu
2021-05-18 21:16     ` [Nouveau] " Peter Xu
2021-05-19 10:49     ` Alistair Popple
2021-05-19 10:49       ` Alistair Popple
2021-05-19 10:49       ` [Nouveau] " Alistair Popple
2021-05-19 12:24       ` Peter Xu
2021-05-19 12:24         ` Peter Xu
2021-05-19 12:24         ` [Nouveau] " Peter Xu
2021-05-19 12:46         ` Alistair Popple
2021-05-19 12:46           ` Alistair Popple
2021-05-19 12:46           ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 6/8] mm: Selftests for exclusive device memory Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 7/8] nouveau/svm: Refactor nouveau_range_fault Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-04-07  8:42 ` [PATCH v8 8/8] nouveau/svm: Implement atomic SVM access Alistair Popple
2021-04-07  8:42   ` Alistair Popple
2021-04-07  8:42   ` [Nouveau] " Alistair Popple
2021-05-21  4:04   ` Ben Skeggs
2021-05-21  4:04     ` Ben Skeggs
2021-05-21  4:04     ` [Nouveau] " Ben Skeggs
2021-05-21  4:04     ` Ben Skeggs
2021-05-06  7:43 ` [PATCH v8 0/8] Add support for SVM atomics in Nouveau Alistair Popple
2021-05-06  7:43   ` Alistair Popple
2021-05-06  7:43   ` [Nouveau] " Alistair Popple

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=YKQjmtMo+YQGx/wZ@t490s \
    --to=peterx@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=apopple@nvidia.com \
    --cc=bsingharora@gmail.com \
    --cc=bskeggs@redhat.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hch@infradead.org \
    --cc=hch@lst.de \
    --cc=jgg@nvidia.com \
    --cc=jglisse@redhat.com \
    --cc=jhubbard@nvidia.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=nouveau@lists.freedesktop.org \
    --cc=rcampbell@nvidia.com \
    --cc=willy@infradead.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.