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
184184 if (addr)
185185 addr0 = ALIGN(addr, huge_page_size(h));
186186
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);
188189 }
189190
190191 /*
include/linux/huge_mm.h+5−5
@@ -391,9 +391,9 @@ static inline bool thp_disabled_by_hw(void) · 390 unmodified lines
391391
392392 unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr,
393393 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,
395395 unsigned long len, unsigned long pgoff, unsigned long flags,
396− vm_flags_t vm_flags);
396+ vma_flags_t vma_flags);
397397
398398 enum split_type {
399399 SPLIT_TYPE_UNIFORM,
@@ -617,9 +617,9 @@ static inline unsigned long thp_vma_allowable_orders(struct vm_area_struct *vma, · 217 unmodified lines
617617 #define thp_get_unmapped_area NULL
618618
619619 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)
623623 {
624624 return 0;
625625 }
include/linux/mm.h+4−2
@@ -4191,13 +4191,15 @@ unsigned long randomize_page(unsigned long start, unsigned long range); · 4190 unmodified lines
41914191
41924192 unsigned long
41934193 __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);
41954196
41964197 static inline unsigned long
41974198 get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
41984199 unsigned long pgoff, unsigned long flags)
41994200 {
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);
42014203 }
42024204
42034205 unsigned 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
193193 unsigned long len, unsigned long pgoff,
194194 unsigned long flags);
195195
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);
202199
203200 unsigned long
204201 generic_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
11941194 static unsigned long __thp_get_unmapped_area(struct file *filp,
11951195 unsigned long addr, unsigned long len,
11961196 loff_t off, unsigned long flags, unsigned long size,
1197− vm_flags_t vm_flags)
1197+ vma_flags_t vma_flags)
11981198 {
11991199 loff_t off_end = off + len;
12001200 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
12101210 if (len_pad < len || (off + len_pad) < off)
12111211 return 0;
12121212
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);
12151216
12161217 /*
12171218 * 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
12361237 return ret;
12371238 }
12381239
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,
12401241 unsigned long len, unsigned long pgoff, unsigned long flags,
1241− vm_flags_t vm_flags)
1242+ vma_flags_t vma_flags)
12421243 {
12431244 unsigned long ret;
12441245 loff_t off = (loff_t)pgoff << PAGE_SHIFT;
12451246
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);
12471249 if (ret)
12481250 return ret;
12491251
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);
12521254 }
12531255
12541256 unsigned long thp_get_unmapped_area(struct file *filp, unsigned long addr,
12551257 unsigned long len, unsigned long pgoff, unsigned long flags)
12561258 {
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);
12581261 }
12591262 EXPORT_SYMBOL_GPL(thp_get_unmapped_area);
12601263
mm/mmap.c+14−13
@@ -411,8 +411,7 @@ unsigned long do_mmap(struct file *file, unsigned long addr, · 410 unmodified lines
411411 /* Obtain the address to map to. we verify (or select) it and ensure
412412 * that it represents a valid section of the address space.
413413 */
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);
416415 if (IS_ERR_VALUE(addr))
417416 return addr;
418417
@@ -812,19 +811,20 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, · 393 unmodified lines
812811 }
813812 #endif
814813
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)
818817 {
819818 if (mm_flags_test(MMF_TOPDOWN, current->mm))
820819 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));
823823 }
824824
825825 unsigned long
826826 __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)
828828 {
829829 unsigned long (*get_area)(struct file *, unsigned long,
830830 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
859859 && !addr /* no hint */
860860 && IS_ALIGNED(len, PMD_SIZE)) {
861861 /* 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);
864864 } 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);
867867 }
868868 if (IS_ERR_VALUE(addr))
869869 return addr;
@@ -881,7 +881,8 @@ unsigned long · 11 unmodified lines
881881 mm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
882882 unsigned long pgoff, unsigned long flags)
883883 {
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);
885886 }
886887 EXPORT_SYMBOL(mm_get_unmapped_area);
887888

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