From: Vivek Kasireddy <vivek.kasireddy@intel.com>
To: dri-devel@lists.freedesktop.org, linux-mm@kvack.org
Cc: Vivek Kasireddy <vivek.kasireddy@intel.com>,
David Hildenbrand <david@redhat.com>,
Matthew Wilcox <willy@infradead.org>,
Christoph Hellwig <hch@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Daniel Vetter <daniel.vetter@ffwll.ch>,
Hugh Dickins <hughd@google.com>, Peter Xu <peterx@redhat.com>,
Jason Gunthorpe <jgg@nvidia.com>,
Gerd Hoffmann <kraxel@redhat.com>,
Dongwon Kim <dongwon.kim@intel.com>,
Junxiao Chang <junxiao.chang@intel.com>
Subject: [PATCH v13 0/8] mm/gup: Introduce memfd_pin_folios() for pinning memfd folios
Date: Thu, 4 Apr 2024 00:26:07 -0700 [thread overview]
Message-ID: <20240404073053.3073706-1-vivek.kasireddy@intel.com> (raw)
Currently, some drivers (e.g, Udmabuf) that want to longterm-pin
the pages/folios associated with a memfd, do so by simply taking a
reference on them. This is not desirable because the pages/folios
may reside in Movable zone or CMA block.
Therefore, having drivers use memfd_pin_folios() API ensures that
the folios are appropriately pinned via FOLL_PIN for longterm DMA.
This patchset also introduces a few helpers and converts the Udmabuf
driver to use folios and memfd_pin_folios() API to longterm-pin
the folios for DMA. Two new Udmabuf selftests are also included to
test the driver and the new API.
---
Patchset overview:
Patch 1-2: GUP helpers to migrate and unpin one or more folios
Patch 3: Introduce memfd_pin_folios() API
Patch 4-5: Udmabuf driver bug fixes for Qemu + hugetlb=on, blob=true case
Patch 6-8: Convert Udmabuf to use memfd_pin_folios() and add sefltests
This series is tested using the following methods:
- Run the subtests added in Patch 8
- Run Qemu (master) with the following options and a few additional
patches to Spice:
qemu-system-x86_64 -m 4096m....
-device virtio-gpu-pci,max_outputs=1,blob=true,xres=1920,yres=1080
-spice port=3001,gl=on,disable-ticketing=on,preferred-codec=gstreamer:h264
-object memory-backend-memfd,hugetlb=on,id=mem1,size=4096M
-machine memory-backend=mem1
- Run source ./run_vmtests.sh -t gup_test -a to check GUP regressions
Changelog:
v12 -> v13: (suggestions from David)
- Drop the sanity checks in unpin_folio()/unpin_folios() due to
unavailability of per folio anon-exclusive flag
- Export unpin_folio()/unpin_folios() using EXPORT_SYMBOL_GPL
instead of EXPORT_SYMBOL
- Have check_and_migrate_movable_pages() just call
check_and_migrate_movable_folios() instead of calling other helpers
- Slightly improve the comments and commit messages
v11 -> v12:
- Rebased and tested on mm-unstable
v10 -> v11:
- Remove the version string from the patch subject (Andrew)
- Move the changelog from the patches into the cover letter
- Rearrange the patchset to have GUP patches at the beginning
v9 -> v10:
- Introduce and use unpin_folio(), unpin_folios() and
check_and_migrate_movable_folios() helpers
- Use a list to track the folios that need to be unpinned in udmabuf
v8 -> v9: (suggestions from Matthew)
- Drop the extern while declaring memfd_alloc_folio()
- Fix memfd_alloc_folio() declaration to have it return struct folio *
instead of struct page * when CONFIG_MEMFD_CREATE is not defined
- Use folio_pfn() on the folio instead of page_to_pfn() on head page
in udmabuf
- Don't split the arguments to shmem_read_folio() on multiple lines
in udmabuf
v7 -> v8: (suggestions from David)
- Have caller pass [start, end], max_folios instead of start, nr_pages
- Replace offsets array with just offset into the first page
- Add comments explaning the need for next_idx
- Pin (and return) the folio (via FOLL_PIN) only once
v6 -> v7:
- Rename this API to memfd_pin_folios() and make it return folios
and offsets instead of pages (David)
- Don't continue processing the folios in the batch returned by
filemap_get_folios_contig() if they do not have correct next_idx
- Add the R-b tag from Christoph
v5 -> v6: (suggestions from Christoph)
- Rename this API to memfd_pin_user_pages() to make it clear that it
is intended for memfds
- Move the memfd page allocation helper from gup.c to memfd.c
- Fix indentation errors in memfd_pin_user_pages()
- For contiguous ranges of folios, use a helper such as
filemap_get_folios_contig() to lookup the page cache in batches
- Split the processing of hugetlb or shmem pages into helpers to
simplify the code in udmabuf_create()
v4 -> v5: (suggestions from David)
- For hugetlb case, ensure that we only obtain head pages from the
mapping by using __filemap_get_folio() instead of find_get_page_flags()
- Handle -EEXIST when two or more potential users try to simultaneously
add a huge page to the mapping by forcing them to retry on failure
v3 -> v4:
- Remove the local variable "page" and instead use 3 return statements
in alloc_file_page() (David)
- Add the R-b tag from David
v2 -> v3: (suggestions from David)
- Enclose the huge page allocation code with #ifdef CONFIG_HUGETLB_PAGE
(Build error reported by kernel test robot <lkp@intel.com>)
- Don't forget memalloc_pin_restore() on non-migration related errors
- Improve the readability of the cleanup code associated with
non-migration related errors
- Augment the comments by describing FOLL_LONGTERM like behavior
- Include the R-b tag from Jason
v1 -> v2:
- Drop gup_flags and improve comments and commit message (David)
- Allocate a page if we cannot find in page cache for the hugetlbfs
case as well (David)
- Don't unpin pages if there is a migration related failure (David)
- Drop the unnecessary nr_pages <= 0 check (Jason)
- Have the caller of the API pass in file * instead of fd (Jason)
Cc: David Hildenbrand <david@redhat.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Hugh Dickins <hughd@google.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Dongwon Kim <dongwon.kim@intel.com>
Cc: Junxiao Chang <junxiao.chang@intel.com>
Vivek Kasireddy (8):
mm/gup: Introduce unpin_folio/unpin_folios helpers
mm/gup: Introduce check_and_migrate_movable_folios()
mm/gup: Introduce memfd_pin_folios() for pinning memfd folios
udmabuf: Use vmf_insert_pfn and VM_PFNMAP for handling mmap
udmabuf: Add back support for mapping hugetlb pages
udmabuf: Convert udmabuf driver to use folios
udmabuf: Pin the pages using memfd_pin_folios() API
selftests/udmabuf: Add tests to verify data after page migration
drivers/dma-buf/udmabuf.c | 231 +++++++++----
include/linux/memfd.h | 5 +
include/linux/mm.h | 5 +
mm/gup.c | 305 +++++++++++++++---
mm/memfd.c | 35 ++
.../selftests/drivers/dma-buf/udmabuf.c | 151 ++++++++-
6 files changed, 627 insertions(+), 105 deletions(-)
--
2.43.0
next reply other threads:[~2024-04-04 7:54 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-04 7:26 Vivek Kasireddy [this message]
2024-04-04 7:26 ` [PATCH v13 1/8] mm/gup: Introduce unpin_folio/unpin_folios helpers Vivek Kasireddy
2024-04-04 7:26 ` [PATCH v13 2/8] mm/gup: Introduce check_and_migrate_movable_folios() Vivek Kasireddy
2024-04-05 9:19 ` David Hildenbrand
2024-04-04 7:26 ` [PATCH v13 3/8] mm/gup: Introduce memfd_pin_folios() for pinning memfd folios Vivek Kasireddy
2024-04-04 7:26 ` [PATCH v13 4/8] udmabuf: Use vmf_insert_pfn and VM_PFNMAP for handling mmap Vivek Kasireddy
2024-04-04 7:26 ` [PATCH v13 5/8] udmabuf: Add back support for mapping hugetlb pages Vivek Kasireddy
2024-04-04 7:26 ` [PATCH v13 6/8] udmabuf: Convert udmabuf driver to use folios Vivek Kasireddy
2024-04-04 7:26 ` [PATCH v13 7/8] udmabuf: Pin the pages using memfd_pin_folios() API Vivek Kasireddy
2024-04-04 7:26 ` [PATCH v13 8/8] selftests/udmabuf: Add tests to verify data after page migration Vivek Kasireddy
2024-04-04 20:53 ` Shuah Khan
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=20240404073053.3073706-1-vivek.kasireddy@intel.com \
--to=vivek.kasireddy@intel.com \
--cc=akpm@linux-foundation.org \
--cc=daniel.vetter@ffwll.ch \
--cc=david@redhat.com \
--cc=dongwon.kim@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=hch@infradead.org \
--cc=hughd@google.com \
--cc=jgg@nvidia.com \
--cc=junxiao.chang@intel.com \
--cc=kraxel@redhat.com \
--cc=linux-mm@kvack.org \
--cc=peterx@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).