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 | 184 | if (addr) |
| 185 | 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 | 392 | unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, |
| 393 | 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 | 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 | 398 | enum split_type { |
| 399 | 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 | 617 | #define thp_get_unmapped_area NULL |
| 618 | 618 | |
| 619 | 619 | static inline unsigned long |
| 620 | −thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, | |
| 621 | − unsigned long len, unsigned long pgoff, | |
| 622 | − unsigned long flags, vm_flags_t vm_flags) | |
| 620 | +thp_get_unmapped_area_vmaflags(struct file *filp, unsigned long addr, | |
| 621 | + unsigned long len, unsigned long pgoff, | |
| 622 | + unsigned long flags, vma_flags_t vma_flags) | |
| 623 | 623 | { |
| 624 | 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 | 4192 | unsigned long |
| 4193 | 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 | 4197 | static inline unsigned long |
| 4197 | 4198 | get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, |
| 4198 | 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 | 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 | 193 | unsigned long len, unsigned long pgoff, |
| 194 | 194 | unsigned long flags); |
| 195 | 195 | |
| 196 | −unsigned long mm_get_unmapped_area_vmflags(struct file *filp, | |
| 197 | − unsigned long addr, | |
| 198 | − unsigned long len, | |
| 199 | − unsigned long pgoff, | |
| 200 | − unsigned long flags, | |
| 201 | − vm_flags_t vm_flags); | |
| 196 | +unsigned long mm_get_unmapped_area_vmaflags(struct file *filp, | |
| 197 | + unsigned long addr, unsigned long len, unsigned long pgoff, | |
| 198 | + unsigned long flags, vma_flags_t vma_flags); | |
| 202 | 199 | |
| 203 | 200 | unsigned long |
| 204 | 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 | 1194 | static unsigned long __thp_get_unmapped_area(struct file *filp, |
| 1195 | 1195 | unsigned long addr, unsigned long len, |
| 1196 | 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 | 1199 | loff_t off_end = off + len; |
| 1200 | 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 | 1210 | if (len_pad < len || (off + len_pad) < off) |
| 1211 | 1211 | return 0; |
| 1212 | 1212 | |
| 1213 | − ret = mm_get_unmapped_area_vmflags(filp, addr, len_pad, | |
| 1214 | − off >> PAGE_SHIFT, flags, vm_flags); | |
| 1213 | + ret = mm_get_unmapped_area_vmaflags(filp, addr, len_pad, | |
| 1214 | + off >> PAGE_SHIFT, flags, | |
| 1215 | + vma_flags); | |
| 1215 | 1216 | |
| 1216 | 1217 | /* |
| 1217 | 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 | 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 | 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 | 1244 | unsigned long ret; |
| 1244 | 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 | 1249 | if (ret) |
| 1248 | 1250 | return ret; |
| 1249 | 1251 | |
| 1250 | − return mm_get_unmapped_area_vmflags(filp, addr, len, pgoff, flags, | |
| 1251 | − vm_flags); | |
| 1252 | + return mm_get_unmapped_area_vmaflags(filp, addr, len, pgoff, flags, | |
| 1253 | + vma_flags); | |
| 1252 | 1254 | } |
| 1253 | 1255 | |
| 1254 | 1256 | unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr, |
| 1255 | 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 | 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 | 411 | /* Obtain the address to map to. we verify (or select) it and ensure |
| 412 | 412 | * that it represents a valid section of the address space. |
| 413 | 413 | */ |
| 414 | − addr = __get_unmapped_area(file, addr, len, pgoff, flags, | |
| 415 | − vma_flags_to_legacy(vma_flags)); | |
| 414 | + addr = __get_unmapped_area(file, addr, len, pgoff, flags, vma_flags); | |
| 416 | 415 | if (IS_ERR_VALUE(addr)) |
| 417 | 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 | 812 | #endif |
| 814 | 813 | |
| 815 | −unsigned long mm_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, | |
| 816 | − unsigned long len, unsigned long pgoff, | |
| 817 | − unsigned long flags, vm_flags_t vm_flags) | |
| 814 | +unsigned long mm_get_unmapped_area_vmaflags(struct file *filp, unsigned long addr, | |
| 815 | + unsigned long len, unsigned long pgoff, unsigned long flags, | |
| 816 | + vma_flags_t vma_flags) | |
| 818 | 817 | { |
| 819 | 818 | if (mm_flags_test(MMF_TOPDOWN, current->mm)) |
| 820 | 819 | return arch_get_unmapped_area_topdown(filp, addr, len, pgoff, |
| 821 | − flags, vm_flags); | |
| 822 | − return arch_get_unmapped_area(filp, addr, len, pgoff, flags, vm_flags); | |
| 820 | + flags, vma_flags_to_legacy(vma_flags)); | |
| 821 | + return arch_get_unmapped_area(filp, addr, len, pgoff, flags, | |
| 822 | + vma_flags_to_legacy(vma_flags)); | |
| 823 | 823 | } |
| 824 | 824 | |
| 825 | 825 | unsigned long |
| 826 | 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 | 829 | unsigned long (*get_area)(struct file *, unsigned long, |
| 830 | 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 | 859 | && !addr /* no hint */ |
| 860 | 860 | && IS_ALIGNED(len, PMD_SIZE)) { |
| 861 | 861 | /* Ensures that larger anonymous mappings are THP aligned. */ |
| 862 | − addr = thp_get_unmapped_area_vmflags(file, addr, len, | |
| 863 | − pgoff, flags, vm_flags); | |
| 862 | + addr = thp_get_unmapped_area_vmaflags(file, addr, len, | |
| 863 | + pgoff, flags, vma_flags); | |
| 864 | 864 | } else { |
| 865 | − addr = mm_get_unmapped_area_vmflags(file, addr, len, | |
| 866 | − pgoff, flags, vm_flags); | |
| 865 | + addr = mm_get_unmapped_area_vmaflags(file, addr, len, | |
| 866 | + pgoff, flags, vma_flags); | |
| 867 | 867 | } |
| 868 | 868 | if (IS_ERR_VALUE(addr)) |
| 869 | 869 | return addr; |
| @@ -881,7 +881,8 @@ unsigned long · 11 unmodified lines | ||
| 881 | 881 | mm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, |
| 882 | 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 | 887 | EXPORT_SYMBOL(mm_get_unmapped_area); |
| 887 | 888 | |