Lines Matching refs:mm
124 static void show_leaks(struct drm_mm *mm) in show_leaks() argument
134 list_for_each_entry(node, drm_mm_nodes(mm), node_list) { in show_leaks()
159 static void show_leaks(struct drm_mm *mm) { } in show_leaks() argument
170 __drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last) in INTERVAL_TREE_DEFINE()
172 return drm_mm_interval_tree_iter_first((struct rb_root_cached *)&mm->interval_tree, in INTERVAL_TREE_DEFINE()
173 start, last) ?: (struct drm_mm_node *)&mm->head_node; in INTERVAL_TREE_DEFINE()
180 struct drm_mm *mm = hole_node->mm; in drm_mm_interval_tree_add_node() local
203 link = &mm->interval_tree.rb_root.rb_node; in drm_mm_interval_tree_add_node()
221 rb_insert_augmented_cached(&node->rb, &mm->interval_tree, leftmost, in drm_mm_interval_tree_add_node()
270 struct drm_mm *mm = node->mm; in add_hole() local
276 insert_hole_size(&mm->holes_size, node); in add_hole()
277 RB_INSERT(mm->holes_addr, rb_hole_addr, HOLE_ADDR); in add_hole()
279 list_add(&node->hole_stack, &mm->hole_stack); in add_hole()
287 rb_erase_cached(&node->rb_hole_size, &node->mm->holes_size); in rm_hole()
288 rb_erase(&node->rb_hole_addr, &node->mm->holes_addr); in rm_hole()
309 static struct drm_mm_node *best_hole(struct drm_mm *mm, u64 size) in best_hole() argument
311 struct rb_node *rb = mm->holes_size.rb_root.rb_node; in best_hole()
329 static struct drm_mm_node *find_hole(struct drm_mm *mm, u64 addr) in find_hole() argument
331 struct rb_node *rb = mm->holes_addr.rb_node; in find_hole()
352 first_hole(struct drm_mm *mm, in first_hole() argument
359 return best_hole(mm, size); in first_hole()
362 return find_hole(mm, start); in first_hole()
365 return find_hole(mm, end); in first_hole()
368 return list_first_entry_or_null(&mm->hole_stack, in first_hole()
375 next_hole(struct drm_mm *mm, in next_hole() argument
392 return &node->hole_stack == &mm->hole_stack ? NULL : node; in next_hole()
410 int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node) in drm_mm_reserve_node() argument
422 hole = find_hole(mm, node->start); in drm_mm_reserve_node()
429 if (mm->color_adjust) in drm_mm_reserve_node()
430 mm->color_adjust(hole, node->color, &adj_start, &adj_end); in drm_mm_reserve_node()
435 node->mm = mm; in drm_mm_reserve_node()
474 int drm_mm_insert_node_in_range(struct drm_mm * const mm, in drm_mm_insert_node_in_range() argument
490 if (rb_to_hole_size_or_zero(rb_first_cached(&mm->holes_size)) < size) in drm_mm_insert_node_in_range()
500 for (hole = first_hole(mm, range_start, range_end, size, mode); in drm_mm_insert_node_in_range()
502 hole = once ? NULL : next_hole(mm, hole, mode)) { in drm_mm_insert_node_in_range()
516 if (mm->color_adjust) in drm_mm_insert_node_in_range()
517 mm->color_adjust(hole, color, &col_start, &col_end); in drm_mm_insert_node_in_range()
550 node->mm = mm; in drm_mm_insert_node_in_range()
584 struct drm_mm *mm = node->mm; in drm_mm_remove_node() local
595 drm_mm_interval_tree_remove(node, &mm->interval_tree); in drm_mm_remove_node()
616 struct drm_mm *mm = old->mm; in drm_mm_replace_node() local
623 rb_replace_node_cached(&old->rb, &new->rb, &mm->interval_tree); in drm_mm_replace_node()
629 &mm->holes_size); in drm_mm_replace_node()
632 &mm->holes_addr); in drm_mm_replace_node()
691 struct drm_mm *mm, in drm_mm_scan_init_with_range() argument
701 DRM_MM_BUG_ON(mm->scan_active); in drm_mm_scan_init_with_range()
703 scan->mm = mm; in drm_mm_scan_init_with_range()
737 struct drm_mm *mm = scan->mm; in drm_mm_scan_add_block() local
743 DRM_MM_BUG_ON(node->mm != mm); in drm_mm_scan_add_block()
747 mm->scan_active++; in drm_mm_scan_add_block()
763 if (mm->color_adjust) in drm_mm_scan_add_block()
764 mm->color_adjust(hole, scan->color, &col_start, &col_end); in drm_mm_scan_add_block()
830 DRM_MM_BUG_ON(node->mm != scan->mm); in drm_mm_scan_remove_block()
834 DRM_MM_BUG_ON(!node->mm->scan_active); in drm_mm_scan_remove_block()
835 node->mm->scan_active--; in drm_mm_scan_remove_block()
868 struct drm_mm *mm = scan->mm; in drm_mm_scan_color_evict() local
872 DRM_MM_BUG_ON(list_empty(&mm->hole_stack)); in drm_mm_scan_color_evict()
874 if (!mm->color_adjust) in drm_mm_scan_color_evict()
882 list_for_each_entry(hole, &mm->hole_stack, hole_stack) { in drm_mm_scan_color_evict()
892 DRM_MM_BUG_ON(&hole->hole_stack == &mm->hole_stack); in drm_mm_scan_color_evict()
893 if (unlikely(&hole->hole_stack == &mm->hole_stack)) in drm_mm_scan_color_evict()
899 mm->color_adjust(hole, scan->color, &hole_start, &hole_end); in drm_mm_scan_color_evict()
917 void drm_mm_init(struct drm_mm *mm, u64 start, u64 size) in drm_mm_init() argument
921 mm->color_adjust = NULL; in drm_mm_init()
923 INIT_LIST_HEAD(&mm->hole_stack); in drm_mm_init()
924 mm->interval_tree = RB_ROOT_CACHED; in drm_mm_init()
925 mm->holes_size = RB_ROOT_CACHED; in drm_mm_init()
926 mm->holes_addr = RB_ROOT; in drm_mm_init()
929 INIT_LIST_HEAD(&mm->head_node.node_list); in drm_mm_init()
930 mm->head_node.allocated = false; in drm_mm_init()
931 mm->head_node.mm = mm; in drm_mm_init()
932 mm->head_node.start = start + size; in drm_mm_init()
933 mm->head_node.size = -size; in drm_mm_init()
934 add_hole(&mm->head_node); in drm_mm_init()
936 mm->scan_active = 0; in drm_mm_init()
947 void drm_mm_takedown(struct drm_mm *mm) in drm_mm_takedown() argument
949 if (WARN(!drm_mm_clean(mm), in drm_mm_takedown()
951 show_leaks(mm); in drm_mm_takedown()
973 void drm_mm_print(const struct drm_mm *mm, struct drm_printer *p) in drm_mm_print() argument
978 total_free += drm_mm_dump_hole(p, &mm->head_node); in drm_mm_print()
980 drm_mm_for_each_node(entry, mm) { in drm_mm_print()