Update __get_unmapped_area() to be parameterised by vma_flags_t rather than vm_flags_t as part of the effort to move VMA flags from a system word to a bitmap. We cascade the changes up to arch_get_unmapped_area_topdown() and arch_get_unmapped_area(), where, for now, we use vma_flags_to_legacy() in order to propagate the VMA flags. No functional change intended.
Unified · Split
| @@ -184,7 +184,8 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, · 183 unmodified lines | |||
| 184 | if (addr) | 184 | if (addr) |
| 185 | addr0 = ALIGN(addr, huge_page_size(h)); | 185 | addr0 = ALIGN(addr, huge_page_size(h)); |
| 186 | 186 | ||
| 187 | return mm_get_unmapped_area_vmflags(file, addr0, len, pgoff, flags, 0); | 187 | return mm_get_unmapped_area_vmaflags(file, addr0, len, pgoff, flags, |
| 188 | EMPTY_VMA_FLAGS); | ||
| 188 | } | 189 | } |
| 189 | 190 | ||
| 190 | /* | 191 | /* |
| @@ -391,9 +391,9 @@ static inline bool thp_disabled_by_hw(void) · 390 unmodified lines | |||
| 391 | 391 | ||
| 392 | unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, | 392 | unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, |
| 393 | unsigned long len, unsigned long pgoff, unsigned long flags); | 393 | unsigned long len, unsigned long pgoff, unsigned long flags); |
| 394 | unsigned long thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, | 394 | unsigned long thp_get_unmapped_area_vmaflags(struct file *filp, unsigned long addr, |
| 395 | unsigned long len, unsigned long pgoff, unsigned long flags, | 395 | unsigned long len, unsigned long pgoff, unsigned long flags, |
| 396 | vm_flags_t vm_flags); | 396 | vma_flags_t vma_flags); |
| 397 | 397 | ||
| 398 | enum split_type { | 398 | enum split_type { |
| 399 | SPLIT_TYPE_UNIFORM, | 399 | SPLIT_TYPE_UNIFORM, |
| @@ -617,9 +617,9 @@ static inline unsigned long thp_vma_allowable_orders(struct vm_area_struct *vma, · 217 unmodified lines | |||
| 617 | #define thp_get_unmapped_area NULL | 617 | #define thp_get_unmapped_area NULL |
| 618 | 618 | ||
| 619 | static inline unsigned long | 619 | static inline unsigned long |
| 620 | thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, | 620 | thp_get_unmapped_area_vmaflags(struct file *filp, unsigned long addr, |
| 621 | unsigned long len, unsigned long pgoff, | 621 | unsigned long len, unsigned long pgoff, |
| 622 | unsigned long flags, vm_flags_t vm_flags) | 622 | unsigned long flags, vma_flags_t vma_flags) |
| 623 | { | 623 | { |
| 624 | return 0; | 624 | return 0; |
| 625 | } | 625 | } |
| @@ -4191,13 +4191,15 @@ unsigned long randomize_page(unsigned long start, unsigned long range); · 4190 unmodified lines | |||
| 4191 | 4191 | ||
| 4192 | unsigned long | 4192 | unsigned long |
| 4193 | __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, | 4193 | __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, |
| 4194 | unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags); | 4194 | unsigned long pgoff, unsigned long flags, |
| 4195 | vma_flags_t vma_flags); | ||
| 4195 | 4196 | ||
| 4196 | static inline unsigned long | 4197 | static inline unsigned long |
| 4197 | get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, | 4198 | get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, |
| 4198 | unsigned long pgoff, unsigned long flags) | 4199 | unsigned long pgoff, unsigned long flags) |
| 4199 | { | 4200 | { |
| 4200 | return __get_unmapped_area(file, addr, len, pgoff, flags, 0); | 4201 | return __get_unmapped_area(file, addr, len, pgoff, flags, |
| 4202 | EMPTY_VMA_FLAGS); | ||
| 4201 | } | 4203 | } |
| 4202 | 4204 | ||
| 4203 | unsigned long do_mmap(struct file *file, unsigned long addr, | 4205 | unsigned long do_mmap(struct file *file, unsigned long addr, |
| @@ -193,12 +193,9 @@ unsigned long mm_get_unmapped_area(struct file *filp, unsigned long addr, · 192 unmodified lines | |||
| 193 | unsigned long len, unsigned long pgoff, | 193 | unsigned long len, unsigned long pgoff, |
| 194 | unsigned long flags); | 194 | unsigned long flags); |
| 195 | 195 | ||
| 196 | unsigned long mm_get_unmapped_area_vmflags(struct file *filp, | 196 | unsigned long mm_get_unmapped_area_vmaflags(struct file *filp, |
| 197 | unsigned long addr, | 197 | unsigned long addr, unsigned long len, unsigned long pgoff, |
| 198 | unsigned long len, | 198 | unsigned long flags, vma_flags_t vma_flags); |
| 199 | unsigned long pgoff, | ||
| 200 | unsigned long flags, | ||
| 201 | vm_flags_t vm_flags); | ||
| 202 | 199 | ||
| 203 | unsigned long | 200 | unsigned long |
| 204 | generic_get_unmapped_area(struct file *filp, unsigned long addr, | 201 | generic_get_unmapped_area(struct file *filp, unsigned long addr, |
| @@ -1194,7 +1194,7 @@ static inline bool is_transparent_hugepage(const struct folio *folio) · 1193 unmodified lines | |||
| 1194 | static unsigned long __thp_get_unmapped_area(struct file *filp, | 1194 | static unsigned long __thp_get_unmapped_area(struct file *filp, |
| 1195 | unsigned long addr, unsigned long len, | 1195 | unsigned long addr, unsigned long len, |
| 1196 | loff_t off, unsigned long flags, unsigned long size, | 1196 | loff_t off, unsigned long flags, unsigned long size, |
| 1197 | vm_flags_t vm_flags) | 1197 | vma_flags_t vma_flags) |
| 1198 | { | 1198 | { |
| 1199 | loff_t off_end = off + len; | 1199 | loff_t off_end = off + len; |
| 1200 | loff_t off_align = round_up(off, size); | 1200 | loff_t off_align = round_up(off, size); |
| @@ -1210,8 +1210,9 @@ static unsigned long __thp_get_unmapped_area(struct file *filp, · 9 unmodified lines | |||
| 1210 | if (len_pad < len || (off + len_pad) < off) | 1210 | if (len_pad < len || (off + len_pad) < off) |
| 1211 | return 0; | 1211 | return 0; |
| 1212 | 1212 | ||
| 1213 | ret = mm_get_unmapped_area_vmflags(filp, addr, len_pad, | 1213 | ret = mm_get_unmapped_area_vmaflags(filp, addr, len_pad, |
| 1214 | off >> PAGE_SHIFT, flags, vm_flags); | 1214 | off >> PAGE_SHIFT, flags, |
| 1215 | vma_flags); | ||
| 1215 | 1216 | ||
| 1216 | /* | 1217 | /* |
| 1217 | * The failure might be due to length padding. The caller will retry | 1218 | * The failure might be due to length padding. The caller will retry |
| @@ -1236,25 +1237,27 @@ static unsigned long __thp_get_unmapped_area(struct file *filp, · 18 unmodified lines | |||
| 1236 | return ret; | 1237 | return ret; |
| 1237 | } | 1238 | } |
| 1238 | 1239 | ||
| 1239 | unsigned long thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, | 1240 | unsigned long thp_get_unmapped_area_vmaflags(struct file *filp, unsigned long addr, |
| 1240 | unsigned long len, unsigned long pgoff, unsigned long flags, | 1241 | unsigned long len, unsigned long pgoff, unsigned long flags, |
| 1241 | vm_flags_t vm_flags) | 1242 | vma_flags_t vma_flags) |
| 1242 | { | 1243 | { |
| 1243 | unsigned long ret; | 1244 | unsigned long ret; |
| 1244 | loff_t off = (loff_t)pgoff << PAGE_SHIFT; | 1245 | loff_t off = (loff_t)pgoff << PAGE_SHIFT; |
| 1245 | 1246 | ||
| 1246 | ret = __thp_get_unmapped_area(filp, addr, len, off, flags, PMD_SIZE, vm_flags); | 1247 | ret = __thp_get_unmapped_area(filp, addr, len, off, flags, PMD_SIZE, |
| 1248 | vma_flags); | ||
| 1247 | if (ret) | 1249 | if (ret) |
| 1248 | return ret; | 1250 | return ret; |
| 1249 | 1251 | ||
| 1250 | return mm_get_unmapped_area_vmflags(filp, addr, len, pgoff, flags, | 1252 | return mm_get_unmapped_area_vmaflags(filp, addr, len, pgoff, flags, |
| 1251 | vm_flags); | 1253 | vma_flags); |
| 1252 | } | 1254 | } |
| 1253 | 1255 | ||
| 1254 | unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, | 1256 | unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, |
| 1255 | unsigned long len, unsigned long pgoff, unsigned long flags) | 1257 | unsigned long len, unsigned long pgoff, unsigned long flags) |
| 1256 | { | 1258 | { |
| 1257 | return thp_get_unmapped_area_vmflags(filp, addr, len, pgoff, flags, 0); | 1259 | return thp_get_unmapped_area_vmaflags(filp, addr, len, pgoff, flags, |
| 1260 | EMPTY_VMA_FLAGS); | ||
| 1258 | } | 1261 | } |
| 1259 | EXPORT_SYMBOL_GPL(thp_get_unmapped_area); | 1262 | EXPORT_SYMBOL_GPL(thp_get_unmapped_area); |
| 1260 | 1263 | ||
| @@ -411,8 +411,7 @@ unsigned long do_mmap(struct file *file, unsigned long addr, · 410 unmodified lines | |||
| 411 | /* Obtain the address to map to. we verify (or select) it and ensure | 411 | /* Obtain the address to map to. we verify (or select) it and ensure |
| 412 | * that it represents a valid section of the address space. | 412 | * that it represents a valid section of the address space. |
| 413 | */ | 413 | */ |
| 414 | addr = __get_unmapped_area(file, addr, len, pgoff, flags, | 414 | addr = __get_unmapped_area(file, addr, len, pgoff, flags, vma_flags); |
| 415 | vma_flags_to_legacy(vma_flags)); | ||
| 416 | if (IS_ERR_VALUE(addr)) | 415 | if (IS_ERR_VALUE(addr)) |
| 417 | return addr; | 416 | return addr; |
| 418 | 417 | ||
| @@ -812,19 +811,20 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, · 393 unmodified lines | |||
| 812 | } | 811 | } |
| 813 | #endif | 812 | #endif |
| 814 | 813 | ||
| 815 | unsigned long mm_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, | 814 | unsigned long mm_get_unmapped_area_vmaflags(struct file *filp, unsigned long addr, |
| 816 | unsigned long len, unsigned long pgoff, | 815 | unsigned long len, unsigned long pgoff, unsigned long flags, |
| 817 | unsigned long flags, vm_flags_t vm_flags) | 816 | vma_flags_t vma_flags) |
| 818 | { | 817 | { |
| 819 | if (mm_flags_test(MMF_TOPDOWN, current->mm)) | 818 | if (mm_flags_test(MMF_TOPDOWN, current->mm)) |
| 820 | return arch_get_unmapped_area_topdown(filp, addr, len, pgoff, | 819 | return arch_get_unmapped_area_topdown(filp, addr, len, pgoff, |
| 821 | flags, vm_flags); | 820 | flags, vma_flags_to_legacy(vma_flags)); |
| 822 | return arch_get_unmapped_area(filp, addr, len, pgoff, flags, vm_flags); | 821 | return arch_get_unmapped_area(filp, addr, len, pgoff, flags, |
| 822 | vma_flags_to_legacy(vma_flags)); | ||
| 823 | } | 823 | } |
| 824 | 824 | ||
| 825 | unsigned long | 825 | unsigned long |
| 826 | __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, | 826 | __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, |
| 827 | unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags) | 827 | unsigned long pgoff, unsigned long flags, vma_flags_t vma_flags) |
| 828 | { | 828 | { |
| 829 | unsigned long (*get_area)(struct file *, unsigned long, | 829 | unsigned long (*get_area)(struct file *, unsigned long, |
| 830 | unsigned long, unsigned long, unsigned long) | 830 | unsigned long, unsigned long, unsigned long) |
| @@ -859,11 +859,11 @@ __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, · 28 unmodified lines | |||
| 859 | && !addr /* no hint */ | 859 | && !addr /* no hint */ |
| 860 | && IS_ALIGNED(len, PMD_SIZE)) { | 860 | && IS_ALIGNED(len, PMD_SIZE)) { |
| 861 | /* Ensures that larger anonymous mappings are THP aligned. */ | 861 | /* Ensures that larger anonymous mappings are THP aligned. */ |
| 862 | addr = thp_get_unmapped_area_vmflags(file, addr, len, | 862 | addr = thp_get_unmapped_area_vmaflags(file, addr, len, |
| 863 | pgoff, flags, vm_flags); | 863 | pgoff, flags, vma_flags); |
| 864 | } else { | 864 | } else { |
| 865 | addr = mm_get_unmapped_area_vmflags(file, addr, len, | 865 | addr = mm_get_unmapped_area_vmaflags(file, addr, len, |
| 866 | pgoff, flags, vm_flags); | 866 | pgoff, flags, vma_flags); |
| 867 | } | 867 | } |
| 868 | if (IS_ERR_VALUE(addr)) | 868 | if (IS_ERR_VALUE(addr)) |
| 869 | return addr; | 869 | return addr; |
| @@ -881,7 +881,8 @@ unsigned long · 11 unmodified lines | |||
| 881 | mm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, | 881 | mm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, |
| 882 | unsigned long pgoff, unsigned long flags) | 882 | unsigned long pgoff, unsigned long flags) |
| 883 | { | 883 | { |
| 884 | return mm_get_unmapped_area_vmflags(file, addr, len, pgoff, flags, 0); | 884 | return mm_get_unmapped_area_vmaflags(file, addr, len, pgoff, flags, |
| 885 | EMPTY_VMA_FLAGS); | ||
| 885 | } | 886 | } |
| 886 | EXPORT_SYMBOL(mm_get_unmapped_area); | 887 | EXPORT_SYMBOL(mm_get_unmapped_area); |
| 887 | 888 | ||