diff options
Diffstat (limited to 'include/linux/highmem.h')
| -rw-r--r-- | include/linux/highmem.h | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 98e2cce996a4..12c5e4e3135a 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
| @@ -73,10 +73,27 @@ static inline void clear_user_highpage(struct page *page, unsigned long vaddr) | |||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | #ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE | 75 | #ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE |
| 76 | /** | ||
| 77 | * __alloc_zeroed_user_highpage - Allocate a zeroed HIGHMEM page for a VMA with caller-specified movable GFP flags | ||
| 78 | * @movableflags: The GFP flags related to the pages future ability to move like __GFP_MOVABLE | ||
| 79 | * @vma: The VMA the page is to be allocated for | ||
| 80 | * @vaddr: The virtual address the page will be inserted into | ||
| 81 | * | ||
| 82 | * This function will allocate a page for a VMA but the caller is expected | ||
| 83 | * to specify via movableflags whether the page will be movable in the | ||
| 84 | * future or not | ||
| 85 | * | ||
| 86 | * An architecture may override this function by defining | ||
| 87 | * __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE and providing their own | ||
| 88 | * implementation. | ||
| 89 | */ | ||
| 76 | static inline struct page * | 90 | static inline struct page * |
| 77 | alloc_zeroed_user_highpage(struct vm_area_struct *vma, unsigned long vaddr) | 91 | __alloc_zeroed_user_highpage(gfp_t movableflags, |
| 92 | struct vm_area_struct *vma, | ||
| 93 | unsigned long vaddr) | ||
| 78 | { | 94 | { |
| 79 | struct page *page = alloc_page_vma(GFP_HIGHUSER, vma, vaddr); | 95 | struct page *page = alloc_page_vma(GFP_HIGHUSER | movableflags, |
| 96 | vma, vaddr); | ||
| 80 | 97 | ||
| 81 | if (page) | 98 | if (page) |
| 82 | clear_user_highpage(page, vaddr); | 99 | clear_user_highpage(page, vaddr); |
| @@ -85,6 +102,36 @@ alloc_zeroed_user_highpage(struct vm_area_struct *vma, unsigned long vaddr) | |||
| 85 | } | 102 | } |
| 86 | #endif | 103 | #endif |
| 87 | 104 | ||
| 105 | /** | ||
| 106 | * alloc_zeroed_user_highpage - Allocate a zeroed HIGHMEM page for a VMA | ||
| 107 | * @vma: The VMA the page is to be allocated for | ||
| 108 | * @vaddr: The virtual address the page will be inserted into | ||
| 109 | * | ||
| 110 | * This function will allocate a page for a VMA that the caller knows will | ||
| 111 | * not be able to move in the future using move_pages() or reclaim. If it | ||
| 112 | * is known that the page can move, use alloc_zeroed_user_highpage_movable | ||
| 113 | */ | ||
| 114 | static inline struct page * | ||
| 115 | alloc_zeroed_user_highpage(struct vm_area_struct *vma, unsigned long vaddr) | ||
| 116 | { | ||
| 117 | return __alloc_zeroed_user_highpage(0, vma, vaddr); | ||
| 118 | } | ||
| 119 | |||
| 120 | /** | ||
| 121 | * alloc_zeroed_user_highpage_movable - Allocate a zeroed HIGHMEM page for a VMA that the caller knows can move | ||
| 122 | * @vma: The VMA the page is to be allocated for | ||
| 123 | * @vaddr: The virtual address the page will be inserted into | ||
| 124 | * | ||
| 125 | * This function will allocate a page for a VMA that the caller knows will | ||
| 126 | * be able to migrate in the future using move_pages() or reclaimed | ||
| 127 | */ | ||
| 128 | static inline struct page * | ||
| 129 | alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma, | ||
| 130 | unsigned long vaddr) | ||
| 131 | { | ||
| 132 | return __alloc_zeroed_user_highpage(__GFP_MOVABLE, vma, vaddr); | ||
| 133 | } | ||
| 134 | |||
| 88 | static inline void clear_highpage(struct page *page) | 135 | static inline void clear_highpage(struct page *page) |
| 89 | { | 136 | { |
| 90 | void *kaddr = kmap_atomic(page, KM_USER0); | 137 | void *kaddr = kmap_atomic(page, KM_USER0); |
