History

mm: convert __get_unmapped_area() to use vma_flags_t

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.

Lorenzo Stoakes committed 4 months ago

Commit 2ec74811 parent 1944a016 files · +40 −36Browse files

Unified · Split

6 files
  1. fs/hugetlbfs/inode.c +2 −1
  2. include/linux/huge_mm.h +5 −5
  3. include/linux/mm.h +4 −2
  4. include/linux/sched/mm.h +3 −6
  5. mm/huge_memory.c +12 −9
  6. mm/mmap.c +14 −13
fs/hugetlbfs/inode.c+2−1
@@ -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/*
include/linux/huge_mm.h+5−5
@@ -391,9 +391,9 @@ static inline bool thp_disabled_by_hw(void) · 390 unmodified lines
391 391
392unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr,392unsigned 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);
394unsigned long thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr,394unsigned 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
398enum split_type {398enum 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 NULL617#define thp_get_unmapped_area NULL
618 618
619static inline unsigned long619static inline unsigned long
620thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr,620thp_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}
include/linux/mm.h+4−2
@@ -4191,13 +4191,15 @@ unsigned long randomize_page(unsigned long start, unsigned long range); · 4190 unmodified lines
4191 4191
4192unsigned long4192unsigned 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
4196static inline unsigned long4197static inline unsigned long
4197get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,4198get_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
4203unsigned long do_mmap(struct file *file, unsigned long addr,4205unsigned long do_mmap(struct file *file, unsigned long addr,
include/linux/sched/mm.h+3−6
@@ -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
196unsigned long mm_get_unmapped_area_vmflags(struct file *filp,196unsigned 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
203unsigned long200unsigned long
204generic_get_unmapped_area(struct file *filp, unsigned long addr,201generic_get_unmapped_area(struct file *filp, unsigned long addr,
mm/huge_memory.c+12−9
@@ -1194,7 +1194,7 @@ static inline bool is_transparent_hugepage(const struct folio *folio) · 1193 unmodified lines
1194static unsigned long __thp_get_unmapped_area(struct file *filp,1194static 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 retry1218 * 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
1239unsigned long thp_get_unmapped_area_vmflags(struct file *filp, unsigned long addr,1240unsigned 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
1254unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr,1256unsigned 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}
1259EXPORT_SYMBOL_GPL(thp_get_unmapped_area);1262EXPORT_SYMBOL_GPL(thp_get_unmapped_area);
1260 1263
mm/mmap.c+14−13
@@ -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 ensure411 /* 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#endif812#endif
814 813
815unsigned long mm_get_unmapped_area_vmflags(struct file *filp, unsigned long addr,814unsigned 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
825unsigned long825unsigned 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
881mm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,881mm_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}
886EXPORT_SYMBOL(mm_get_unmapped_area);887EXPORT_SYMBOL(mm_get_unmapped_area);
887 888

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t