git: 3d751b7a719f - main - linuxkpi: Add `pin_user_pages*()` functions

From: Jean-Sébastien Pédron <dumbbell_at_FreeBSD.org>
Date: Fri, 27 Jan 2023 21:27:49 UTC
The branch main has been updated by dumbbell (ports committer):

URL: https://cgit.FreeBSD.org/src/commit/?id=3d751b7a719fd7934e902a34285ce4e5bbaf1e16

commit 3d751b7a719fd7934e902a34285ce4e5bbaf1e16
Author:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
AuthorDate: 2023-01-10 10:09:56 +0000
Commit:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
CommitDate: 2023-01-27 20:54:39 +0000

    linuxkpi: Add `pin_user_pages*()` functions
    
    They were defined in the i915 DRM driver. I move the code in linuxkpi so
    it can benefit other drivers.
    
    Reviewed by:    manu
    Approved by:    manu
    Differential Revision:  https://reviews.freebsd.org/D38078
---
 sys/compat/linuxkpi/common/include/linux/mm.h | 33 +++++++++++++++++++++++++--
 sys/compat/linuxkpi/common/src/linux_page.c   |  6 ++---
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/mm.h b/sys/compat/linuxkpi/common/include/linux/mm.h
index 2e0e47f774be..542d0c874b43 100644
--- a/sys/compat/linuxkpi/common/include/linux/mm.h
+++ b/sys/compat/linuxkpi/common/include/linux/mm.h
@@ -257,25 +257,54 @@ get_page(struct vm_page *page)
 
 extern long
 get_user_pages(unsigned long start, unsigned long nr_pages,
-    int gup_flags, struct page **,
+    unsigned int gup_flags, struct page **,
     struct vm_area_struct **);
 
+static inline long
+pin_user_pages(unsigned long start, unsigned long nr_pages,
+    unsigned int gup_flags, struct page **pages,
+    struct vm_area_struct **vmas)
+{
+	return get_user_pages(start, nr_pages, gup_flags, pages, vmas);
+}
+
 extern int
 __get_user_pages_fast(unsigned long start, int nr_pages, int write,
     struct page **);
 
+static inline int
+pin_user_pages_fast(unsigned long start, int nr_pages,
+    unsigned int gup_flags, struct page **pages)
+{
+	return __get_user_pages_fast(
+	    start, nr_pages, !!(gup_flags & FOLL_WRITE), pages);
+}
+
 extern long
 get_user_pages_remote(struct task_struct *, struct mm_struct *,
     unsigned long start, unsigned long nr_pages,
-    int gup_flags, struct page **,
+    unsigned int gup_flags, struct page **,
     struct vm_area_struct **);
 
+static inline long
+pin_user_pages_remote(struct task_struct *task, struct mm_struct *mm,
+    unsigned long start, unsigned long nr_pages,
+    unsigned int gup_flags, struct page **pages,
+    struct vm_area_struct **vmas)
+{
+	return get_user_pages_remote(
+	    task, mm, start, nr_pages, gup_flags, pages, vmas);
+}
+
 static inline void
 put_page(struct vm_page *page)
 {
 	vm_page_unwire(page, PQ_ACTIVE);
 }
 
+#define	unpin_user_page(page) put_page(page)
+#define	unpin_user_pages(pages, npages) release_pages(pages, npages)
+
 #define	copy_highpage(to, from) pmap_copy_page(from, to)
 
 static inline pgprot_t
diff --git a/sys/compat/linuxkpi/common/src/linux_page.c b/sys/compat/linuxkpi/common/src/linux_page.c
index c4d0d332af14..9b3dac96081f 100644
--- a/sys/compat/linuxkpi/common/src/linux_page.c
+++ b/sys/compat/linuxkpi/common/src/linux_page.c
@@ -249,7 +249,7 @@ __get_user_pages_fast(unsigned long start, int nr_pages, int write,
 
 long
 get_user_pages_remote(struct task_struct *task, struct mm_struct *mm,
-    unsigned long start, unsigned long nr_pages, int gup_flags,
+    unsigned long start, unsigned long nr_pages, unsigned int gup_flags,
     struct page **pages, struct vm_area_struct **vmas)
 {
 	vm_map_t map;
@@ -260,8 +260,8 @@ get_user_pages_remote(struct task_struct *task, struct mm_struct *mm,
 }
 
 long
-get_user_pages(unsigned long start, unsigned long nr_pages, int gup_flags,
-    struct page **pages, struct vm_area_struct **vmas)
+get_user_pages(unsigned long start, unsigned long nr_pages,
+    unsigned int gup_flags, struct page **pages, struct vm_area_struct **vmas)
 {
 	vm_map_t map;