mm/gup: move private gup FOLL_ flags to internal.h
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 24 Jan 2023 20:34:34 +0000 (16:34 -0400)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 10 Feb 2023 00:51:45 +0000 (16:51 -0800)
Move the flags that should not/are not used outside gup.c and related into
mm/internal.h to discourage driver abuse.

To make this more maintainable going forward compact the two FOLL ranges
with new bit numbers from 0 to 11 and 16 to 21, using shifts so it is
explicit.

Switch to an enum so the whole thing is easier to read.

Link: https://lkml.kernel.org/r/13-v2-987e91b59705+36b-gup_tidy_jgg@nvidia.com
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Mike Rapoport (IBM) <rppt@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/mm_types.h
mm/internal.h

index 434b3ac8a351560e1ad4a721750dd1d54a310ac4..56753d0f096d06591c5c2ff29b05b72fb212c7b3 100644 (file)
@@ -1040,9 +1040,6 @@ typedef unsigned int __bitwise zap_flags_t;
  * FOLL_PIN and FOLL_LONGTERM may be used in various combinations with each
  * other. Here is what they mean, and how to use them:
  *
- * FOLL_LONGTERM indicates that the page will be held for an indefinite time
- * period _often_ under userspace control.  This is in contrast to
- * iov_iter_get_pages(), whose usages are transient.
  *
  * FIXME: For pages which are part of a filesystem, mappings are subject to the
  * lifetime enforced by the filesystem and we need guarantees that longterm
@@ -1086,24 +1083,40 @@ typedef unsigned int __bitwise zap_flags_t;
  * Please see Documentation/core-api/pin_user_pages.rst for more information.
  */
 
-#define FOLL_WRITE     0x01    /* check pte is writable */
-#define FOLL_TOUCH     0x02    /* mark page accessed */
-#define FOLL_GET       0x04    /* do get_page on page */
-#define FOLL_DUMP      0x08    /* give error on hole if it would be zero */
-#define FOLL_FORCE     0x10    /* get_user_pages read/write w/o permission */
-#define FOLL_NOWAIT    0x20    /* if a disk transfer is needed, start the IO
-                                * and return without waiting upon it */
-#define FOLL_NOFAULT   0x80    /* do not fault in pages */
-#define FOLL_HWPOISON  0x100   /* check page is hwpoisoned */
-#define FOLL_TRIED     0x800   /* a retry, previous pass started an IO */
-#define FOLL_REMOTE    0x2000  /* we are working on non-current tsk/mm */
-#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 unpin_user_page */
-#define FOLL_FAST_ONLY 0x80000 /* gup_fast: prevent fall-back to slow gup */
-#define FOLL_PCI_P2PDMA        0x100000 /* allow returning PCI P2PDMA pages */
-#define FOLL_INTERRUPTIBLE  0x200000 /* allow interrupts from generic signals */
-#define FOLL_UNLOCKABLE        0x400000 /* allow unlocking the mmap lock (internal only) */
+enum {
+       /* check pte is writable */
+       FOLL_WRITE = 1 << 0,
+       /* do get_page on page */
+       FOLL_GET = 1 << 1,
+       /* give error on hole if it would be zero */
+       FOLL_DUMP = 1 << 2,
+       /* get_user_pages read/write w/o permission */
+       FOLL_FORCE = 1 << 3,
+       /*
+        * if a disk transfer is needed, start the IO and return without waiting
+        * upon it
+        */
+       FOLL_NOWAIT = 1 << 4,
+       /* do not fault in pages */
+       FOLL_NOFAULT = 1 << 5,
+       /* check page is hwpoisoned */
+       FOLL_HWPOISON = 1 << 6,
+       /* don't do file mappings */
+       FOLL_ANON = 1 << 7,
+       /*
+        * FOLL_LONGTERM indicates that the page will be held for an indefinite
+        * time period _often_ under userspace control.  This is in contrast to
+        * iov_iter_get_pages(), whose usages are transient.
+        */
+       FOLL_LONGTERM = 1 << 8,
+       /* split huge pmd before returning */
+       FOLL_SPLIT_PMD = 1 << 9,
+       /* allow returning PCI P2PDMA pages */
+       FOLL_PCI_P2PDMA = 1 << 10,
+       /* allow interrupts from generic signals */
+       FOLL_INTERRUPTIBLE = 1 << 11,
+
+       /* See also internal only FOLL flags in mm/internal.h */
+};
 
 #endif /* _LINUX_MM_TYPES_H */
index 4f5ca3401b05d9299bed7d1f7d33fa890cbcfaf4..dfb37e94e140c62361091564c2870367a1cc041c 100644 (file)
@@ -858,6 +858,21 @@ int migrate_device_coherent_page(struct page *page);
 struct folio *try_grab_folio(struct page *page, int refs, unsigned int flags);
 int __must_check try_grab_page(struct page *page, unsigned int flags);
 
+enum {
+       /* mark page accessed */
+       FOLL_TOUCH = 1 << 16,
+       /* a retry, previous pass started an IO */
+       FOLL_TRIED = 1 << 17,
+       /* we are working on non-current tsk/mm */
+       FOLL_REMOTE = 1 << 18,
+       /* pages must be released via unpin_user_page */
+       FOLL_PIN = 1 << 19,
+       /* gup_fast: prevent fall-back to slow gup */
+       FOLL_FAST_ONLY = 1 << 20,
+       /* allow unlocking the mmap lock */
+       FOLL_UNLOCKABLE = 1 << 21,
+};
+
 /*
  * Indicates for which pages that are write-protected in the page table,
  * whether GUP has to trigger unsharing via FAULT_FLAG_UNSHARE such that the