From: Alistair Popple <apopple@nvidia.com>
To: Felix Kuehling <felix.kuehling@amd.com>,
<akpm@linux-foundation.org>, <linux-mm@kvack.org>,
<rcampbell@nvidia.com>, <linux-ext4@vger.kernel.org>,
<linux-xfs@vger.kernel.org>,
"Sierra Guiza, Alejandro (Alex)" <alex.sierra@amd.com>
Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
jglisse@redhat.com, willy@infradead.org, jgg@nvidia.com,
hch@lst.de
Subject: Re: [PATCH v2 03/11] mm/gup: migrate PIN_LONGTERM dev coherent pages to system
Date: Fri, 10 Dec 2021 12:31:09 +1100 [thread overview]
Message-ID: <2613033.KcdVtnzQgr@nvdebian> (raw)
In-Reply-To: <72fe6b48-4aa5-b766-3f33-8c3445fdcc99@amd.com>
On Friday, 10 December 2021 3:54:31 AM AEDT Sierra Guiza, Alejandro (Alex) wrote:
>
> On 12/9/2021 10:29 AM, Felix Kuehling wrote:
> > Am 2021-12-09 um 5:53 a.m. schrieb Alistair Popple:
> >> On Thursday, 9 December 2021 5:55:26 AM AEDT Sierra Guiza, Alejandro (Alex) wrote:
> >>> On 12/8/2021 11:30 AM, Felix Kuehling wrote:
> >>>> Am 2021-12-08 um 11:58 a.m. schrieb Felix Kuehling:
> >>>>> Am 2021-12-08 um 6:31 a.m. schrieb Alistair Popple:
> >>>>>> On Tuesday, 7 December 2021 5:52:43 AM AEDT Alex Sierra wrote:
> >>>>>>> Avoid long term pinning for Coherent device type pages. This could
> >>>>>>> interfere with their own device memory manager.
> >>>>>>> If caller tries to get user device coherent pages with PIN_LONGTERM flag
> >>>>>>> set, those pages will be migrated back to system memory.
> >>>>>>>
> >>>>>>> Signed-off-by: Alex Sierra<alex.sierra@amd.com>
> >>>>>>> ---
> >>>>>>> mm/gup.c | 32 ++++++++++++++++++++++++++++++--
> >>>>>>> 1 file changed, 30 insertions(+), 2 deletions(-)
> >>>>>>>
> >>>>>>> diff --git a/mm/gup.c b/mm/gup.c
> >>>>>>> index 886d6148d3d0..1572eacf07f4 100644
> >>>>>>> --- a/mm/gup.c
> >>>>>>> +++ b/mm/gup.c
> >>>>>>> @@ -1689,17 +1689,37 @@ struct page *get_dump_page(unsigned long addr)
> >>>>>>> #endif /* CONFIG_ELF_CORE */
> >>>>>>>
> >>>>>>> #ifdef CONFIG_MIGRATION
> >>>>>>> +static int migrate_device_page(unsigned long address,
> >>>>>>> + struct page *page)
> >>>>>>> +{
> >>>>>>> + struct vm_area_struct *vma = find_vma(current->mm, address);
> >>>>>>> + struct vm_fault vmf = {
> >>>>>>> + .vma = vma,
> >>>>>>> + .address = address & PAGE_MASK,
> >>>>>>> + .flags = FAULT_FLAG_USER,
> >>>>>>> + .pgoff = linear_page_index(vma, address),
> >>>>>>> + .gfp_mask = GFP_KERNEL,
> >>>>>>> + .page = page,
> >>>>>>> + };
> >>>>>>> + if (page->pgmap && page->pgmap->ops->migrate_to_ram)
> >>>>>>> + return page->pgmap->ops->migrate_to_ram(&vmf);
> >>>>>> How does this synchronise against pgmap being released? As I understand things
> >>>>>> at this point we're not holding a reference on either the page or pgmap, so
> >>>>>> the page and therefore the pgmap may have been freed.
> >>>>>>
> >>>>>> I think a similar problem exists for device private fault handling as well and
> >>>>>> it has been on my list of things to fix for a while. I think the solution is to
> >>>>>> call try_get_page(), except it doesn't work with device pages due to the whole
> >>>>>> refcount thing. That issue is blocking a fair bit of work now so I've started
> >>>>>> looking into it.
> >>>>> At least the page should have been pinned by the __get_user_pages_locked
> >>>>> call in __gup_longterm_locked. That refcount is dropped in
> >>>>> check_and_migrate_movable_pages when it returns 0 or an error.
> >>>> Never mind. We unpin the pages first. Alex, would the migration work if
> >>>> we unpinned them afterwards? Also, the normal CPU page fault code path
> >>>> seems to make sure the page is locked (check in pfn_swap_entry_to_page)
> >>>> before calling migrate_to_ram.
> >> I don't think that's true. The check in pfn_swap_entry_to_page() is only for
> >> migration entries:
> >>
> >> BUG_ON(is_migration_entry(entry) && !PageLocked(p));
> >>
> >> As this is coherent memory though why do we have to call into a device driver
> >> to do the migration? Couldn't this all be done in the kernel?
> > I think you're right. I hadn't thought of that mainly because I'm even
> > less familiar with the non-device migration code. Alex, can you give
> > that a try? As long as the driver still gets a page-free callback when
> > the device page is freed, it should work.
Yes, you should still get the page-free callback when the migration code drops
the last page reference.
> ACK.Will do
There is currently not really any support for migrating device pages based on
pfn. What I think is needed is something like migrate_pages(), but that API
won't work for a couple of reasons - main one being that it relies on pages
being LRU pages.
I've been working on a series to implement an equivalent of migrate_pages() for
device-private (and by extension device-coherent) pages. It might also be useful
here so I will try and get it posted as an RFC next week.
- Alistair
> Alex Sierra
>
> > Regards,
> > Felix
> >
> >
> >>> No, you can not unpinned after migration. Due to the expected_count VS
> >>> page_count condition at migrate_page_move_mapping, during migrate_page call.
> >>>
> >>> Regards,
> >>> Alex Sierra
> >>>
> >>>> Regards,
> >>>> Felix
> >>>>
> >>>>
> >>
WARNING: multiple messages have this Message-ID (diff)
From: Alistair Popple <apopple@nvidia.com>
To: Felix Kuehling <felix.kuehling@amd.com>,
<akpm@linux-foundation.org>, <linux-mm@kvack.org>,
<rcampbell@nvidia.com>, <linux-ext4@vger.kernel.org>,
<linux-xfs@vger.kernel.org>,
"Sierra Guiza, Alejandro (Alex)" <alex.sierra@amd.com>
Cc: <amd-gfx@lists.freedesktop.org>, <willy@infradead.org>,
<jglisse@redhat.com>, <dri-devel@lists.freedesktop.org>,
<jgg@nvidia.com>, <hch@lst.de>
Subject: Re: [PATCH v2 03/11] mm/gup: migrate PIN_LONGTERM dev coherent pages to system
Date: Fri, 10 Dec 2021 12:31:09 +1100 [thread overview]
Message-ID: <2613033.KcdVtnzQgr@nvdebian> (raw)
In-Reply-To: <72fe6b48-4aa5-b766-3f33-8c3445fdcc99@amd.com>
On Friday, 10 December 2021 3:54:31 AM AEDT Sierra Guiza, Alejandro (Alex) wrote:
>
> On 12/9/2021 10:29 AM, Felix Kuehling wrote:
> > Am 2021-12-09 um 5:53 a.m. schrieb Alistair Popple:
> >> On Thursday, 9 December 2021 5:55:26 AM AEDT Sierra Guiza, Alejandro (Alex) wrote:
> >>> On 12/8/2021 11:30 AM, Felix Kuehling wrote:
> >>>> Am 2021-12-08 um 11:58 a.m. schrieb Felix Kuehling:
> >>>>> Am 2021-12-08 um 6:31 a.m. schrieb Alistair Popple:
> >>>>>> On Tuesday, 7 December 2021 5:52:43 AM AEDT Alex Sierra wrote:
> >>>>>>> Avoid long term pinning for Coherent device type pages. This could
> >>>>>>> interfere with their own device memory manager.
> >>>>>>> If caller tries to get user device coherent pages with PIN_LONGTERM flag
> >>>>>>> set, those pages will be migrated back to system memory.
> >>>>>>>
> >>>>>>> Signed-off-by: Alex Sierra<alex.sierra@amd.com>
> >>>>>>> ---
> >>>>>>> mm/gup.c | 32 ++++++++++++++++++++++++++++++--
> >>>>>>> 1 file changed, 30 insertions(+), 2 deletions(-)
> >>>>>>>
> >>>>>>> diff --git a/mm/gup.c b/mm/gup.c
> >>>>>>> index 886d6148d3d0..1572eacf07f4 100644
> >>>>>>> --- a/mm/gup.c
> >>>>>>> +++ b/mm/gup.c
> >>>>>>> @@ -1689,17 +1689,37 @@ struct page *get_dump_page(unsigned long addr)
> >>>>>>> #endif /* CONFIG_ELF_CORE */
> >>>>>>>
> >>>>>>> #ifdef CONFIG_MIGRATION
> >>>>>>> +static int migrate_device_page(unsigned long address,
> >>>>>>> + struct page *page)
> >>>>>>> +{
> >>>>>>> + struct vm_area_struct *vma = find_vma(current->mm, address);
> >>>>>>> + struct vm_fault vmf = {
> >>>>>>> + .vma = vma,
> >>>>>>> + .address = address & PAGE_MASK,
> >>>>>>> + .flags = FAULT_FLAG_USER,
> >>>>>>> + .pgoff = linear_page_index(vma, address),
> >>>>>>> + .gfp_mask = GFP_KERNEL,
> >>>>>>> + .page = page,
> >>>>>>> + };
> >>>>>>> + if (page->pgmap && page->pgmap->ops->migrate_to_ram)
> >>>>>>> + return page->pgmap->ops->migrate_to_ram(&vmf);
> >>>>>> How does this synchronise against pgmap being released? As I understand things
> >>>>>> at this point we're not holding a reference on either the page or pgmap, so
> >>>>>> the page and therefore the pgmap may have been freed.
> >>>>>>
> >>>>>> I think a similar problem exists for device private fault handling as well and
> >>>>>> it has been on my list of things to fix for a while. I think the solution is to
> >>>>>> call try_get_page(), except it doesn't work with device pages due to the whole
> >>>>>> refcount thing. That issue is blocking a fair bit of work now so I've started
> >>>>>> looking into it.
> >>>>> At least the page should have been pinned by the __get_user_pages_locked
> >>>>> call in __gup_longterm_locked. That refcount is dropped in
> >>>>> check_and_migrate_movable_pages when it returns 0 or an error.
> >>>> Never mind. We unpin the pages first. Alex, would the migration work if
> >>>> we unpinned them afterwards? Also, the normal CPU page fault code path
> >>>> seems to make sure the page is locked (check in pfn_swap_entry_to_page)
> >>>> before calling migrate_to_ram.
> >> I don't think that's true. The check in pfn_swap_entry_to_page() is only for
> >> migration entries:
> >>
> >> BUG_ON(is_migration_entry(entry) && !PageLocked(p));
> >>
> >> As this is coherent memory though why do we have to call into a device driver
> >> to do the migration? Couldn't this all be done in the kernel?
> > I think you're right. I hadn't thought of that mainly because I'm even
> > less familiar with the non-device migration code. Alex, can you give
> > that a try? As long as the driver still gets a page-free callback when
> > the device page is freed, it should work.
Yes, you should still get the page-free callback when the migration code drops
the last page reference.
> ACK.Will do
There is currently not really any support for migrating device pages based on
pfn. What I think is needed is something like migrate_pages(), but that API
won't work for a couple of reasons - main one being that it relies on pages
being LRU pages.
I've been working on a series to implement an equivalent of migrate_pages() for
device-private (and by extension device-coherent) pages. It might also be useful
here so I will try and get it posted as an RFC next week.
- Alistair
> Alex Sierra
>
> > Regards,
> > Felix
> >
> >
> >>> No, you can not unpinned after migration. Due to the expected_count VS
> >>> page_count condition at migrate_page_move_mapping, during migrate_page call.
> >>>
> >>> Regards,
> >>> Alex Sierra
> >>>
> >>>> Regards,
> >>>> Felix
> >>>>
> >>>>
> >>
next prev parent reply other threads:[~2021-12-10 4:09 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-06 18:52 [PATCH v2 00/11] Add MEMORY_DEVICE_COHERENT for coherent device memory mapping Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 01/11] mm: add zone device coherent type memory support Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 02/11] mm: add device coherent vma selection for memory migration Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 03/11] mm/gup: migrate PIN_LONGTERM dev coherent pages to system Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-08 11:31 ` Alistair Popple
2021-12-08 11:31 ` Alistair Popple
2021-12-08 13:53 ` Jason Gunthorpe
2021-12-08 13:53 ` Jason Gunthorpe
2021-12-09 1:45 ` Alistair Popple
2021-12-09 1:45 ` Alistair Popple
2021-12-09 2:53 ` Jason Gunthorpe
2021-12-09 2:53 ` Jason Gunthorpe
2021-12-08 16:58 ` Felix Kuehling
2021-12-08 16:58 ` Felix Kuehling
2021-12-08 17:30 ` Felix Kuehling
2021-12-08 17:30 ` Felix Kuehling
2021-12-08 18:55 ` Sierra Guiza, Alejandro (Alex)
2021-12-08 18:55 ` Sierra Guiza, Alejandro (Alex)
2021-12-09 10:53 ` Alistair Popple
2021-12-09 10:53 ` Alistair Popple
2021-12-09 16:29 ` Felix Kuehling
2021-12-09 16:29 ` Felix Kuehling
2021-12-09 16:54 ` Sierra Guiza, Alejandro (Alex)
2021-12-09 16:54 ` Sierra Guiza, Alejandro (Alex)
2021-12-10 1:31 ` Alistair Popple [this message]
2021-12-10 1:31 ` Alistair Popple
2021-12-10 16:39 ` Felix Kuehling
2021-12-10 16:39 ` Felix Kuehling
2021-12-06 18:52 ` [PATCH v2 04/11] drm/amdkfd: add SPM support for SVM Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 05/11] drm/amdkfd: coherent type as sys mem on migration to ram Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 06/11] lib: test_hmm add ioctl to get zone device type Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 07/11] lib: test_hmm add module param for " Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 08/11] lib: add support for device coherent type in test_hmm Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2022-01-03 20:24 ` Liam Howlett
2022-01-03 20:24 ` Liam Howlett
2021-12-06 18:52 ` [PATCH v2 09/11] tools: update hmm-test to support device coherent type Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 10/11] tools: update test_hmm script to support SP config Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-06 18:52 ` [PATCH v2 11/11] tools: add hmm gup test for long term pinned device pages Alex Sierra
2021-12-06 18:52 ` Alex Sierra
2021-12-07 19:31 ` Jason Gunthorpe
2021-12-07 19:31 ` Jason Gunthorpe
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=2613033.KcdVtnzQgr@nvdebian \
--to=apopple@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=alex.sierra@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=felix.kuehling@amd.com \
--cc=hch@lst.de \
--cc=jgg@nvidia.com \
--cc=jglisse@redhat.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.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.