Lines Matching refs:node
108 static noinline void save_stack(struct drm_mm_node *node) in save_stack() argument
116 node->stack = stack_depot_save(entries, n, GFP_NOWAIT); in save_stack()
121 struct drm_mm_node *node; in show_leaks() local
128 list_for_each_entry(node, drm_mm_nodes(mm), node_list) { in show_leaks()
129 if (!node->stack) { in show_leaks()
131 node->start, node->size); in show_leaks()
135 stack_depot_snprint(node->stack, buf, BUFSZ, 0); in show_leaks()
137 node->start, node->size, buf); in show_leaks()
146 static void save_stack(struct drm_mm_node *node) { } in save_stack() argument
150 #define START(node) ((node)->start) argument
151 #define LAST(node) ((node)->start + (node)->size - 1) argument
166 struct drm_mm_node *node) in drm_mm_interval_tree_add_node() argument
173 node->__subtree_last = LAST(node); in drm_mm_interval_tree_add_node()
179 if (parent->__subtree_last >= node->__subtree_last) in drm_mm_interval_tree_add_node()
182 parent->__subtree_last = node->__subtree_last; in drm_mm_interval_tree_add_node()
198 if (parent->__subtree_last < node->__subtree_last) in drm_mm_interval_tree_add_node()
199 parent->__subtree_last = node->__subtree_last; in drm_mm_interval_tree_add_node()
200 if (node->start < parent->start) { in drm_mm_interval_tree_add_node()
208 rb_link_node(&node->rb, rb, link); in drm_mm_interval_tree_add_node()
209 rb_insert_augmented_cached(&node->rb, &mm->interval_tree, leftmost, in drm_mm_interval_tree_add_node()
222 struct drm_mm_node *node) in insert_hole_size() argument
225 u64 x = node->hole_size; in insert_hole_size()
238 rb_link_node(&node->rb_hole_size, rb, link); in insert_hole_size()
239 rb_insert_color_cached(&node->rb_hole_size, root, first); in insert_hole_size()
246 static void insert_hole_addr(struct rb_root *root, struct drm_mm_node *node) in RB_DECLARE_CALLBACKS_MAX()
249 u64 start = HOLE_ADDR(node), subtree_max_hole = node->subtree_max_hole; in RB_DECLARE_CALLBACKS_MAX()
263 rb_link_node(&node->rb_hole_addr, rb_parent, link); in RB_DECLARE_CALLBACKS_MAX()
264 rb_insert_augmented(&node->rb_hole_addr, root, &augment_callbacks); in RB_DECLARE_CALLBACKS_MAX()
267 static void add_hole(struct drm_mm_node *node) in add_hole() argument
269 struct drm_mm *mm = node->mm; in add_hole()
271 node->hole_size = in add_hole()
272 __drm_mm_hole_node_end(node) - __drm_mm_hole_node_start(node); in add_hole()
273 node->subtree_max_hole = node->hole_size; in add_hole()
274 DRM_MM_BUG_ON(!drm_mm_hole_follows(node)); in add_hole()
276 insert_hole_size(&mm->holes_size, node); in add_hole()
277 insert_hole_addr(&mm->holes_addr, node); in add_hole()
279 list_add(&node->hole_stack, &mm->hole_stack); in add_hole()
282 static void rm_hole(struct drm_mm_node *node) in rm_hole() argument
284 DRM_MM_BUG_ON(!drm_mm_hole_follows(node)); in rm_hole()
286 list_del(&node->hole_stack); in rm_hole()
287 rb_erase_cached(&node->rb_hole_size, &node->mm->holes_size); in rm_hole()
288 rb_erase_augmented(&node->rb_hole_addr, &node->mm->holes_addr, in rm_hole()
290 node->hole_size = 0; in rm_hole()
291 node->subtree_max_hole = 0; in rm_hole()
293 DRM_MM_BUG_ON(drm_mm_hole_follows(node)); in rm_hole()
312 struct drm_mm_node *node = in best_hole() local
315 if (size <= node->hole_size) { in best_hole()
316 best = node; in best_hole()
334 struct drm_mm_node *node = NULL; in find_hole_addr() local
342 node = rb_hole_addr_to_node(rb); in find_hole_addr()
343 hole_start = __drm_mm_hole_node_start(node); in find_hole_addr()
346 rb = node->rb_hole_addr.rb_left; in find_hole_addr()
347 else if (addr > hole_start + node->hole_size) in find_hole_addr()
348 rb = node->rb_hole_addr.rb_right; in find_hole_addr()
353 return node; in find_hole_addr()
393 struct rb_node *parent, *node = &entry->rb_hole_addr; \
395 if (!entry || RB_EMPTY_NODE(node)) \
398 if (usable_hole_addr(node->first, size)) { \
399 node = node->first; \
400 while (usable_hole_addr(node->last, size)) \
401 node = node->last; \
402 return rb_hole_addr_to_node(node); \
405 while ((parent = rb_parent(node)) && node == parent->first) \
406 node = parent; \
416 struct drm_mm_node *node, in DECLARE_NEXT_HOLE_ADDR()
423 return rb_hole_size_to_node(rb_prev(&node->rb_hole_size)); in DECLARE_NEXT_HOLE_ADDR()
426 return next_hole_low_addr(node, size); in DECLARE_NEXT_HOLE_ADDR()
429 return next_hole_high_addr(node, size); in DECLARE_NEXT_HOLE_ADDR()
432 node = list_next_entry(node, hole_stack); in DECLARE_NEXT_HOLE_ADDR()
433 return &node->hole_stack == &mm->hole_stack ? NULL : node; in DECLARE_NEXT_HOLE_ADDR()
451 int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node) in drm_mm_reserve_node() argument
458 end = node->start + node->size; in drm_mm_reserve_node()
459 if (unlikely(end <= node->start)) in drm_mm_reserve_node()
463 hole = find_hole_addr(mm, node->start, 0); in drm_mm_reserve_node()
471 mm->color_adjust(hole, node->color, &adj_start, &adj_end); in drm_mm_reserve_node()
473 if (adj_start > node->start || adj_end < end) in drm_mm_reserve_node()
476 node->mm = mm; in drm_mm_reserve_node()
478 __set_bit(DRM_MM_NODE_ALLOCATED_BIT, &node->flags); in drm_mm_reserve_node()
479 list_add(&node->node_list, &hole->node_list); in drm_mm_reserve_node()
480 drm_mm_interval_tree_add_node(hole, node); in drm_mm_reserve_node()
481 node->hole_size = 0; in drm_mm_reserve_node()
484 if (node->start > hole_start) in drm_mm_reserve_node()
487 add_hole(node); in drm_mm_reserve_node()
489 save_stack(node); in drm_mm_reserve_node()
516 struct drm_mm_node * const node, in drm_mm_insert_node_in_range() argument
591 node->mm = mm; in drm_mm_insert_node_in_range()
592 node->size = size; in drm_mm_insert_node_in_range()
593 node->start = adj_start; in drm_mm_insert_node_in_range()
594 node->color = color; in drm_mm_insert_node_in_range()
595 node->hole_size = 0; in drm_mm_insert_node_in_range()
597 __set_bit(DRM_MM_NODE_ALLOCATED_BIT, &node->flags); in drm_mm_insert_node_in_range()
598 list_add(&node->node_list, &hole->node_list); in drm_mm_insert_node_in_range()
599 drm_mm_interval_tree_add_node(hole, node); in drm_mm_insert_node_in_range()
605 add_hole(node); in drm_mm_insert_node_in_range()
607 save_stack(node); in drm_mm_insert_node_in_range()
615 static inline __maybe_unused bool drm_mm_node_scanned_block(const struct drm_mm_node *node) in drm_mm_node_scanned_block() argument
617 return test_bit(DRM_MM_NODE_SCANNED_BIT, &node->flags); in drm_mm_node_scanned_block()
628 void drm_mm_remove_node(struct drm_mm_node *node) in drm_mm_remove_node() argument
630 struct drm_mm *mm = node->mm; in drm_mm_remove_node()
633 DRM_MM_BUG_ON(!drm_mm_node_allocated(node)); in drm_mm_remove_node()
634 DRM_MM_BUG_ON(drm_mm_node_scanned_block(node)); in drm_mm_remove_node()
636 prev_node = list_prev_entry(node, node_list); in drm_mm_remove_node()
638 if (drm_mm_hole_follows(node)) in drm_mm_remove_node()
639 rm_hole(node); in drm_mm_remove_node()
641 drm_mm_interval_tree_remove(node, &mm->interval_tree); in drm_mm_remove_node()
642 list_del(&node->node_list); in drm_mm_remove_node()
648 clear_bit_unlock(DRM_MM_NODE_ALLOCATED_BIT, &node->flags); in drm_mm_remove_node()
747 struct drm_mm_node *node) in drm_mm_scan_add_block() argument
755 DRM_MM_BUG_ON(node->mm != mm); in drm_mm_scan_add_block()
756 DRM_MM_BUG_ON(!drm_mm_node_allocated(node)); in drm_mm_scan_add_block()
757 DRM_MM_BUG_ON(drm_mm_node_scanned_block(node)); in drm_mm_scan_add_block()
758 __set_bit(DRM_MM_NODE_SCANNED_BIT, &node->flags); in drm_mm_scan_add_block()
766 hole = list_prev_entry(node, node_list); in drm_mm_scan_add_block()
767 DRM_MM_BUG_ON(list_next_entry(hole, node_list) != node); in drm_mm_scan_add_block()
768 __list_del_entry(&node->node_list); in drm_mm_scan_add_block()
838 struct drm_mm_node *node) in drm_mm_scan_remove_block() argument
842 DRM_MM_BUG_ON(node->mm != scan->mm); in drm_mm_scan_remove_block()
843 DRM_MM_BUG_ON(!drm_mm_node_scanned_block(node)); in drm_mm_scan_remove_block()
844 __clear_bit(DRM_MM_NODE_SCANNED_BIT, &node->flags); in drm_mm_scan_remove_block()
846 DRM_MM_BUG_ON(!node->mm->scan_active); in drm_mm_scan_remove_block()
847 node->mm->scan_active--; in drm_mm_scan_remove_block()
857 prev_node = list_prev_entry(node, node_list); in drm_mm_scan_remove_block()
859 list_next_entry(node, node_list)); in drm_mm_scan_remove_block()
860 list_add(&node->node_list, &prev_node->node_list); in drm_mm_scan_remove_block()
862 return (node->start + node->size > scan->hit_start && in drm_mm_scan_remove_block()
863 node->start < scan->hit_end); in drm_mm_scan_remove_block()