Lines Matching refs:node
107 static noinline void save_stack(struct drm_mm_node *node) in save_stack() argument
115 node->stack = stack_depot_save(entries, n, GFP_NOWAIT); in save_stack()
120 struct drm_mm_node *node; in show_leaks() local
129 list_for_each_entry(node, drm_mm_nodes(mm), node_list) { in show_leaks()
130 if (!node->stack) { in show_leaks()
132 node->start, node->size); in show_leaks()
136 nr_entries = stack_depot_fetch(node->stack, &entries); in show_leaks()
139 node->start, node->size, buf); in show_leaks()
148 static void save_stack(struct drm_mm_node *node) { } in save_stack() argument
152 #define START(node) ((node)->start) argument
153 #define LAST(node) ((node)->start + (node)->size - 1) argument
168 struct drm_mm_node *node) in drm_mm_interval_tree_add_node() argument
175 node->__subtree_last = LAST(node); in drm_mm_interval_tree_add_node()
181 if (parent->__subtree_last >= node->__subtree_last) in drm_mm_interval_tree_add_node()
184 parent->__subtree_last = node->__subtree_last; in drm_mm_interval_tree_add_node()
200 if (parent->__subtree_last < node->__subtree_last) in drm_mm_interval_tree_add_node()
201 parent->__subtree_last = node->__subtree_last; in drm_mm_interval_tree_add_node()
202 if (node->start < parent->start) { in drm_mm_interval_tree_add_node()
210 rb_link_node(&node->rb, rb, link); in drm_mm_interval_tree_add_node()
211 rb_insert_augmented_cached(&node->rb, &mm->interval_tree, leftmost, in drm_mm_interval_tree_add_node()
217 u64 x = expr(node); \
225 rb_link_node(&node->member, rb, link); \
226 rb_insert_color(&node->member, &root); \
238 struct drm_mm_node *node) in insert_hole_size() argument
241 u64 x = node->hole_size; in insert_hole_size()
254 rb_link_node(&node->rb_hole_size, rb, link); in insert_hole_size()
255 rb_insert_color_cached(&node->rb_hole_size, root, first); in insert_hole_size()
258 static void add_hole(struct drm_mm_node *node) in add_hole() argument
260 struct drm_mm *mm = node->mm; in add_hole()
262 node->hole_size = in add_hole()
263 __drm_mm_hole_node_end(node) - __drm_mm_hole_node_start(node); in add_hole()
264 DRM_MM_BUG_ON(!drm_mm_hole_follows(node)); in add_hole()
266 insert_hole_size(&mm->holes_size, node); in add_hole()
269 list_add(&node->hole_stack, &mm->hole_stack); in add_hole()
272 static void rm_hole(struct drm_mm_node *node) in rm_hole() argument
274 DRM_MM_BUG_ON(!drm_mm_hole_follows(node)); in rm_hole()
276 list_del(&node->hole_stack); in rm_hole()
277 rb_erase_cached(&node->rb_hole_size, &node->mm->holes_size); in rm_hole()
278 rb_erase(&node->rb_hole_addr, &node->mm->holes_addr); in rm_hole()
279 node->hole_size = 0; in rm_hole()
281 DRM_MM_BUG_ON(drm_mm_hole_follows(node)); in rm_hole()
305 struct drm_mm_node *node = in best_hole() local
308 if (size <= node->hole_size) { in best_hole()
309 best = node; in best_hole()
322 struct drm_mm_node *node = NULL; in find_hole() local
327 node = rb_hole_addr_to_node(rb); in find_hole()
328 hole_start = __drm_mm_hole_node_start(node); in find_hole()
331 rb = node->rb_hole_addr.rb_left; in find_hole()
332 else if (addr > hole_start + node->hole_size) in find_hole()
333 rb = node->rb_hole_addr.rb_right; in find_hole()
338 return node; in find_hole()
366 struct drm_mm_node *node, in next_hole() argument
372 return rb_hole_size_to_node(rb_prev(&node->rb_hole_size)); in next_hole()
375 return rb_hole_addr_to_node(rb_next(&node->rb_hole_addr)); in next_hole()
378 return rb_hole_addr_to_node(rb_prev(&node->rb_hole_addr)); in next_hole()
381 node = list_next_entry(node, hole_stack); in next_hole()
382 return &node->hole_stack == &mm->hole_stack ? NULL : node; in next_hole()
400 int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node) in drm_mm_reserve_node() argument
402 u64 end = node->start + node->size; in drm_mm_reserve_node()
407 end = node->start + node->size; in drm_mm_reserve_node()
408 if (unlikely(end <= node->start)) in drm_mm_reserve_node()
412 hole = find_hole(mm, node->start); in drm_mm_reserve_node()
420 mm->color_adjust(hole, node->color, &adj_start, &adj_end); in drm_mm_reserve_node()
422 if (adj_start > node->start || adj_end < end) in drm_mm_reserve_node()
425 node->mm = mm; in drm_mm_reserve_node()
427 list_add(&node->node_list, &hole->node_list); in drm_mm_reserve_node()
428 drm_mm_interval_tree_add_node(hole, node); in drm_mm_reserve_node()
429 node->allocated = true; in drm_mm_reserve_node()
430 node->hole_size = 0; in drm_mm_reserve_node()
433 if (node->start > hole_start) in drm_mm_reserve_node()
436 add_hole(node); in drm_mm_reserve_node()
438 save_stack(node); in drm_mm_reserve_node()
465 struct drm_mm_node * const node, in drm_mm_insert_node_in_range() argument
540 node->mm = mm; in drm_mm_insert_node_in_range()
541 node->size = size; in drm_mm_insert_node_in_range()
542 node->start = adj_start; in drm_mm_insert_node_in_range()
543 node->color = color; in drm_mm_insert_node_in_range()
544 node->hole_size = 0; in drm_mm_insert_node_in_range()
546 list_add(&node->node_list, &hole->node_list); in drm_mm_insert_node_in_range()
547 drm_mm_interval_tree_add_node(hole, node); in drm_mm_insert_node_in_range()
548 node->allocated = true; in drm_mm_insert_node_in_range()
554 add_hole(node); in drm_mm_insert_node_in_range()
556 save_stack(node); in drm_mm_insert_node_in_range()
572 void drm_mm_remove_node(struct drm_mm_node *node) in drm_mm_remove_node() argument
574 struct drm_mm *mm = node->mm; in drm_mm_remove_node()
577 DRM_MM_BUG_ON(!node->allocated); in drm_mm_remove_node()
578 DRM_MM_BUG_ON(node->scanned_block); in drm_mm_remove_node()
580 prev_node = list_prev_entry(node, node_list); in drm_mm_remove_node()
582 if (drm_mm_hole_follows(node)) in drm_mm_remove_node()
583 rm_hole(node); in drm_mm_remove_node()
585 drm_mm_interval_tree_remove(node, &mm->interval_tree); in drm_mm_remove_node()
586 list_del(&node->node_list); in drm_mm_remove_node()
587 node->allocated = false; in drm_mm_remove_node()
725 struct drm_mm_node *node) in drm_mm_scan_add_block() argument
733 DRM_MM_BUG_ON(node->mm != mm); in drm_mm_scan_add_block()
734 DRM_MM_BUG_ON(!node->allocated); in drm_mm_scan_add_block()
735 DRM_MM_BUG_ON(node->scanned_block); in drm_mm_scan_add_block()
736 node->scanned_block = true; in drm_mm_scan_add_block()
744 hole = list_prev_entry(node, node_list); in drm_mm_scan_add_block()
745 DRM_MM_BUG_ON(list_next_entry(hole, node_list) != node); in drm_mm_scan_add_block()
746 __list_del_entry(&node->node_list); in drm_mm_scan_add_block()
816 struct drm_mm_node *node) in drm_mm_scan_remove_block() argument
820 DRM_MM_BUG_ON(node->mm != scan->mm); in drm_mm_scan_remove_block()
821 DRM_MM_BUG_ON(!node->scanned_block); in drm_mm_scan_remove_block()
822 node->scanned_block = false; in drm_mm_scan_remove_block()
824 DRM_MM_BUG_ON(!node->mm->scan_active); in drm_mm_scan_remove_block()
825 node->mm->scan_active--; in drm_mm_scan_remove_block()
835 prev_node = list_prev_entry(node, node_list); in drm_mm_scan_remove_block()
837 list_next_entry(node, node_list)); in drm_mm_scan_remove_block()
838 list_add(&node->node_list, &prev_node->node_list); in drm_mm_scan_remove_block()
840 return (node->start + node->size > scan->hit_start && in drm_mm_scan_remove_block()
841 node->start < scan->hit_end); in drm_mm_scan_remove_block()