Messages in this thread Patch in this message | | | From | john.hubbard@gmail ... | Subject | [RFC PATCH 1/2] mm/gup: introduce FOLL_PIN flag for get_user_pages() | Date | Sun, 11 Aug 2019 18:50:43 -0700 |
| |
From: John Hubbard <jhubbard@nvidia.com>
FOLL_PIN is set by vaddr_pin_pages(). This is different than FOLL_LONGTERM, because even short term page pins need a new kind of tracking, if those pinned pages' data is going to potentially be modified.
This situation is described in more detail in commit fc1d8e7cca2d ("mm: introduce put_user_page*(), placeholder versions").
FOLL_PIN is added now, rather than waiting until there is code that takes action based on FOLL_PIN. That's because having FOLL_PIN in the code helps to highlight the differences between:
a) get_user_pages(): soon to be deprecated. Used to pin pages, but without awareness of file systems that might use those pages,
b) The original vaddr_pin_pages(): intended only for FOLL_LONGTERM and DAX use cases. This assumes direct IO and therefore is not applicable the most of the other callers of get_user_pages(), and
c) The new vaddr_pin_pages(), which provides the correct get_user_pages() flags for all cases, by setting FOLL_PIN.
Cc: Ira Weiny <ira.weiny@intel.com> Cc: Jan Kara <jack@suse.cz> Cc: Michal Hocko <mhocko@kernel.org> Signed-off-by: John Hubbard <jhubbard@nvidia.com> --- include/linux/mm.h | 1 + mm/gup.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h index 90c5802866df..61b616cd9243 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2663,6 +2663,7 @@ struct page *follow_page(struct vm_area_struct *vma, unsigned long address, #define FOLL_ANON 0x8000 /* don't do file mappings */ #define FOLL_LONGTERM 0x10000 /* mapping lifetime is indefinite: see below */ #define FOLL_SPLIT_PMD 0x20000 /* split huge pmd before returning */ +#define FOLL_PIN 0x40000 /* pages must be released via put_user_page() */ /* * NOTE on FOLL_LONGTERM: diff --git a/mm/gup.c b/mm/gup.c index 58f008a3c153..85f09958fbdc 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -2494,6 +2494,9 @@ EXPORT_SYMBOL_GPL(get_user_pages_fast); * being made against. Usually "current->mm". * * Expects mmap_sem to be read locked. + * + * Implementation note: this sets FOLL_PIN, which means that the pages must + * ultimately be released by put_user_page(). */ long vaddr_pin_pages(unsigned long addr, unsigned long nr_pages, unsigned int gup_flags, struct page **pages, @@ -2501,7 +2504,7 @@ long vaddr_pin_pages(unsigned long addr, unsigned long nr_pages, { long ret; - gup_flags |= FOLL_LONGTERM; + gup_flags |= FOLL_LONGTERM | FOLL_PIN; if (!vaddr_pin || (!vaddr_pin->mm && !vaddr_pin->f_owner)) return -EINVAL; -- 2.22.0
| |