Home | History | Annotate | Download | only in drm

Lines Matching refs:mm

123 static void show_leaks(struct drm_mm *mm)
134 list_for_each_entry(node, drm_mm_nodes(mm), node_list) {
154 static void show_leaks(struct drm_mm *mm) { }
169 struct drm_mm *mm = __UNCONST(mm_const);
172 list_for_each_entry(node, &mm->head_node.node_list, node_list) {
176 return &mm->head_node;
178 return drm_mm_interval_tree_iter_first((struct rb_root_cached *)&mm->interval_tree,
179 start, last) ?: (struct drm_mm_node *)&mm->head_node;
188 struct drm_mm *mm = hole_node->mm;
211 link = &mm->interval_tree.rb_root.rb_node;
229 rb_insert_augmented_cached(&node->rb, &mm->interval_tree, leftmost,
363 struct drm_mm *mm = node->mm;
369 insert_hole_size(&mm->holes_size, node);
372 collision = rb_tree_insert_node(&mm->holes_addr.rbr_tree, node);
375 RB_INSERT(mm->holes_addr, rb_hole_addr, HOLE_ADDR);
378 list_add(&node->hole_stack, &mm->hole_stack);
386 rb_erase_cached(&node->rb_hole_size, &node->mm->holes_size);
387 rb_erase(&node->rb_hole_addr, &node->mm->holes_addr);
408 static struct drm_mm_node *best_hole(struct drm_mm *mm, u64 size)
413 best = rb_tree_find_node_leq(&mm->holes_size.rb_root.rbr_tree, &size);
418 struct rb_node *rb = mm->holes_size.rb_root.rb_node;
437 static struct drm_mm_node *find_hole(struct drm_mm *mm, u64 addr)
440 struct rb_node *rb = mm->holes_addr.rbr_tree.rbt_root;
442 struct rb_node *rb = mm->holes_addr.rb_node;
464 first_hole(struct drm_mm *mm,
471 return best_hole(mm, size);
474 return find_hole(mm, start);
477 return find_hole(mm, end);
480 return list_first_entry_or_null(&mm->hole_stack,
487 next_hole(struct drm_mm *mm,
495 return RB_TREE_PREV(&mm->holes_size.rb_root.rbr_tree, node);
502 return RB_TREE_NEXT(&mm->holes_addr.rbr_tree, node);
509 return RB_TREE_PREV(&mm->holes_addr.rbr_tree, node);
516 return &node->hole_stack == &mm->hole_stack ? NULL : node;
522 * @mm: drm_mm allocator to insert @node into
534 int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node)
546 hole = find_hole(mm, node->start);
553 if (mm->color_adjust)
554 mm->color_adjust(hole, node->color, &adj_start, &adj_end);
559 node->mm = mm;
586 * @mm: drm_mm to allocate from
600 int drm_mm_insert_node_in_range(struct drm_mm * const mm,
616 if (rb_to_hole_size_or_zero(rb_first_cached(&mm->holes_size)) < size)
626 for (hole = first_hole(mm, range_start, range_end, size, mode);
628 hole = once ? NULL : next_hole(mm, hole, mode)) {
642 if (mm->color_adjust)
643 mm->color_adjust(hole, color, &col_start, &col_end);
676 node->mm = mm;
717 struct drm_mm *mm = node->mm;
729 __USE(mm);
731 drm_mm_interval_tree_remove(node, &mm->interval_tree);
754 struct drm_mm *mm = old->mm;
763 rb_replace_node_cached(&old->rb, &new->rb, &mm->interval_tree);
770 &mm->holes_size);
773 &mm->holes_addr);
815 * @mm: drm_mm to scan
831 struct drm_mm *mm,
841 DRM_MM_BUG_ON(mm->scan_active);
843 scan->mm = mm;
877 struct drm_mm *mm = scan->mm;
883 DRM_MM_BUG_ON(node->mm != mm);
887 mm->scan_active++;
903 if (mm->color_adjust)
904 mm->color_adjust(hole, scan->color, &col_start, &col_end);
970 DRM_MM_BUG_ON(node->mm != scan->mm);
974 DRM_MM_BUG_ON(!node->mm->scan_active);
975 node->mm->scan_active--;
1001 * mm.color_adjust is being used.
1008 struct drm_mm *mm = scan->mm;
1012 DRM_MM_BUG_ON(list_empty(&mm->hole_stack));
1014 if (!mm->color_adjust)
1022 list_for_each_entry(hole, &mm->hole_stack, hole_stack) {
1032 DRM_MM_BUG_ON(&hole->hole_stack == &mm->hole_stack);
1033 if (unlikely(&hole->hole_stack == &mm->hole_stack))
1039 mm->color_adjust(hole, scan->color, &hole_start, &hole_end);
1050 * drm_mm_init - initialize a drm-mm allocator
1051 * @mm: the drm_mm structure to initialize
1052 * @start: start of the range managed by @mm
1053 * @size: end of the range managed by @mm
1055 * Note that @mm must be cleared to 0 before calling this function.
1057 void drm_mm_init(struct drm_mm *mm, u64 start, u64 size)
1061 mm->color_adjust = NULL;
1063 INIT_LIST_HEAD(&mm->hole_stack);
1066 rb_tree_init(&mm->holes_size.rb_root.rbr_tree, &holes_size_rb_ops);
1067 rb_tree_init(&mm->holes_addr.rbr_tree, &holes_addr_rb_ops);
1069 mm->interval_tree = RB_ROOT_CACHED;
1070 mm->holes_size = RB_ROOT_CACHED;
1071 mm->holes_addr = RB_ROOT;
1075 INIT_LIST_HEAD(&mm->head_node.node_list);
1076 mm->head_node.flags = 0;
1077 mm->head_node.mm = mm;
1078 mm->head_node.start = start + size;
1079 mm->head_node.size = -size;
1080 add_hole(&mm->head_node);
1082 mm->scan_active = 0;
1088 * @mm: drm_mm allocator to clean up
1093 void drm_mm_takedown(struct drm_mm *mm)
1095 if (WARN(!drm_mm_clean(mm),
1097 show_leaks(mm);
1116 * @mm: drm_mm allocator to print
1119 void drm_mm_print(const struct drm_mm *mm, struct drm_printer *p)
1124 total_free += drm_mm_dump_hole(p, &mm->head_node);
1126 drm_mm_for_each_node(entry, mm) {