Lines Matching refs:mm

15 #include <linux/mm.h>
21 #include <linux/sched/mm.h>
86 static int slice_area_is_free(struct mm_struct *mm, unsigned long addr,
91 if ((mm_ctx_slb_addr_limit(&mm->context) - len) < addr)
93 vma = find_vma(mm, addr);
97 static int slice_low_has_vma(struct mm_struct *mm, unsigned long slice)
99 return !slice_area_is_free(mm, slice << SLICE_LOW_SHIFT,
103 static int slice_high_has_vma(struct mm_struct *mm, unsigned long slice)
114 return !slice_area_is_free(mm, start, end - start);
117 static void slice_mask_for_free(struct mm_struct *mm, struct slice_mask *ret,
127 if (!slice_low_has_vma(mm, i))
134 if (!slice_high_has_vma(mm, i))
138 static bool slice_check_range_fits(struct mm_struct *mm,
173 struct mm_struct *mm = parm;
176 if (mm != current->active_mm)
187 static void slice_convert(struct mm_struct *mm,
197 slice_dbg("slice_convert(mm=%p, psize=%d)\n", mm, psize);
200 psize_mask = slice_mask_for_size(&mm->context, psize);
207 lpsizes = mm_ctx_low_slices(&mm->context);
217 old_mask = slice_mask_for_size(&mm->context, old_psize);
226 hpsizes = mm_ctx_high_slices(&mm->context);
227 for (i = 0; i < GET_HIGH_SLICE_INDEX(mm_ctx_slb_addr_limit(&mm->context)); i++) {
236 old_mask = slice_mask_for_size(&mm->context, old_psize);
246 (unsigned long)mm_ctx_low_slices(&mm->context),
247 (unsigned long)mm_ctx_high_slices(&mm->context));
251 copro_flush_all_slbs(mm);
278 static unsigned long slice_find_area_bottomup(struct mm_struct *mm,
320 static unsigned long slice_find_area_topdown(struct mm_struct *mm,
341 addr += mm_ctx_slb_addr_limit(&mm->context) - DEFAULT_MAP_WINDOW;
374 return slice_find_area_bottomup(mm, TASK_UNMAPPED_BASE, len, available, psize, high_limit);
378 static unsigned long slice_find_area(struct mm_struct *mm, unsigned long len,
383 return slice_find_area_topdown(mm, mm->mmap_base, len, mask, psize, high_limit);
385 return slice_find_area_bottomup(mm, mm->mmap_base, len, mask, psize, high_limit);
434 struct mm_struct *mm = current->mm;
453 if (high_limit > mm_ctx_slb_addr_limit(&mm->context)) {
459 mm_ctx_set_slb_addr_limit(&mm->context, high_limit);
461 on_each_cpu(slice_flush_segments, mm, 1);
465 BUG_ON(mm->task_size == 0);
466 BUG_ON(mm_ctx_slb_addr_limit(&mm->context) == 0);
469 slice_dbg("slice_get_unmapped_area(mm=%p, psize=%d...\n", mm, psize);
479 !slice_area_is_free(mm, addr, len))
486 maskp = slice_mask_for_size(&mm->context, psize);
513 compat_maskp = slice_mask_for_size(&mm->context, MMU_PAGE_4K);
531 if (slice_check_range_fits(mm, &good_mask, addr, len)) {
540 newaddr = slice_find_area(mm, len, &good_mask,
554 slice_mask_for_free(mm, &potential_mask, high_limit);
559 if (slice_check_range_fits(mm, &potential_mask, addr, len)) {
576 newaddr = slice_find_area(mm, len, &good_mask,
587 newaddr = slice_find_area(mm, len, &potential_mask,
594 newaddr = slice_find_area(mm, len, &potential_mask,
610 if (need_extra_context(mm, newaddr)) {
611 if (alloc_extended_context(mm, newaddr) < 0)
621 slice_convert(mm, &potential_mask, psize);
623 on_each_cpu(slice_flush_segments, mm, 1);
628 if (need_extra_context(mm, newaddr)) {
629 if (alloc_extended_context(mm, newaddr) < 0)
647 mm_ctx_user_psize(&current->mm->context), 0);
661 mm_ctx_user_psize(&current->mm->context), 1);
664 unsigned int notrace get_slice_psize(struct mm_struct *mm, unsigned long addr)
672 psizes = mm_ctx_low_slices(&mm->context);
675 psizes = mm_ctx_high_slices(&mm->context);
683 void slice_init_new_context_exec(struct mm_struct *mm)
689 slice_dbg("slice_init_new_context_exec(mm=%p)\n", mm);
693 * case of fork it is just inherited from the mm being
696 mm_ctx_set_slb_addr_limit(&mm->context, SLB_ADDR_LIMIT_DEFAULT);
697 mm_ctx_set_user_psize(&mm->context, psize);
702 lpsizes = mm_ctx_low_slices(&mm->context);
705 hpsizes = mm_ctx_high_slices(&mm->context);
711 mask = slice_mask_for_size(&mm->context, psize);
719 struct mm_struct *mm = current->mm;
721 slice_dbg("slice_setup_new_exec(mm=%p)\n", mm);
726 mm_ctx_set_slb_addr_limit(&mm->context, DEFAULT_MAP_WINDOW);
729 void slice_set_range_psize(struct mm_struct *mm, unsigned long start,
737 slice_convert(mm, &mask, psize);
760 int slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
764 unsigned int psize = mm_ctx_user_psize(&mm->context);
768 maskp = slice_mask_for_size(&mm->context, psize);
775 compat_maskp = slice_mask_for_size(&mm->context, MMU_PAGE_4K);
777 return !slice_check_range_fits(mm, &available, addr, len);
780 return !slice_check_range_fits(mm, maskp, addr, len);