Lines Matching refs:mm

53 static struct drm_mm_node *drm_mm_kmalloc(struct drm_mm *mm, int atomic)
63 spin_lock(&mm->unused_lock);
64 if (list_empty(&mm->unused_nodes))
68 list_entry(mm->unused_nodes.next,
71 --mm->num_unused;
73 spin_unlock(&mm->unused_lock);
83 int drm_mm_pre_get(struct drm_mm *mm)
87 spin_lock(&mm->unused_lock);
88 while (mm->num_unused < MM_UNUSED_TARGET) {
89 spin_unlock(&mm->unused_lock);
91 spin_lock(&mm->unused_lock);
94 int ret = (mm->num_unused < 2) ? -ENOMEM : 0;
95 spin_unlock(&mm->unused_lock);
98 ++mm->num_unused;
99 list_add_tail(&node->node_list, &mm->unused_nodes, (caddr_t)node);
101 spin_unlock(&mm->unused_lock);
110 struct drm_mm *mm = hole_node->mm;
118 if (mm->color_adjust)
119 mm->color_adjust(hole_node, color, &adj_start, &adj_end);
134 node->mm = mm;
145 list_add(&node->hole_stack, &mm->hole_stack, (caddr_t)node);
150 struct drm_mm_node *drm_mm_create_block(struct drm_mm *mm,
160 drm_mm_for_each_hole(hole, mm, hole_start, hole_end) {
164 node = drm_mm_kmalloc(mm, atomic);
170 node->mm = mm;
183 list_add(&node->hole_stack, &mm->hole_stack, (caddr_t)node);
202 node = drm_mm_kmalloc(hole_node->mm, atomic);
216 int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
222 hole_node = drm_mm_search_free_generic(mm, size, alignment,
231 int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
234 return drm_mm_insert_node_generic(mm, node, size, alignment, 0);
243 struct drm_mm *mm = hole_node->mm;
256 if (mm->color_adjust)
257 mm->color_adjust(hole_node, color, &adj_start, &adj_end);
272 node->mm = mm;
284 list_add(&node->hole_stack, &mm->hole_stack, (caddr_t)node);
299 node = drm_mm_kmalloc(hole_node->mm, atomic);
314 int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node,
320 hole_node = drm_mm_search_free_in_range_generic(mm,
332 int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
336 return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, 0, start, end);
344 struct drm_mm *mm = node->mm;
365 list_add(&prev_node->hole_stack, &mm->hole_stack, (caddr_t)prev_node);
367 list_move(&prev_node->hole_stack, &mm->hole_stack, (caddr_t)prev_node);
381 struct drm_mm *mm = node->mm;
385 spin_lock(&mm->unused_lock);
386 if (mm->num_unused < MM_UNUSED_TARGET) {
387 list_add(&node->node_list, &mm->unused_nodes, (caddr_t)node);
388 ++mm->num_unused;
391 spin_unlock(&mm->unused_lock);
409 struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
421 BUG_ON(mm->scanned_blocks);
426 drm_mm_for_each_hole(entry, mm, adj_start, adj_end) {
427 if (mm->color_adjust) {
428 mm->color_adjust(entry, color, &adj_start, &adj_end);
448 struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm,
462 BUG_ON(mm->scanned_blocks);
467 drm_mm_for_each_hole(entry, mm, adj_start, adj_end) {
473 if (mm->color_adjust) {
474 mm->color_adjust(entry, color, &adj_start, &adj_end);
502 new->mm = old->mm;
520 void drm_mm_init_scan(struct drm_mm *mm,
525 mm->scan_color = color;
526 mm->scan_alignment = alignment;
527 mm->scan_size = size;
528 mm->scanned_blocks = 0;
529 mm->scan_hit_start = 0;
530 mm->scan_hit_end = 0;
531 mm->scan_check_range = 0;
532 mm->prev_scanned_node = NULL;
544 void drm_mm_init_scan_with_range(struct drm_mm *mm,
551 mm->scan_color = color;
552 mm->scan_alignment = alignment;
553 mm->scan_size = size;
554 mm->scanned_blocks = 0;
555 mm->scan_hit_start = 0;
556 mm->scan_hit_end = 0;
557 mm->scan_start = start;
558 mm->scan_end = end;
559 mm->scan_check_range = 1;
560 mm->prev_scanned_node = NULL;
571 struct drm_mm *mm = node->mm;
576 mm->scanned_blocks++;
588 node->node_list.next = &mm->prev_scanned_node->node_list;
589 mm->prev_scanned_node = node;
594 if (mm->scan_check_range) {
595 if (adj_start < mm->scan_start)
596 adj_start = mm->scan_start;
597 if (adj_end > mm->scan_end)
598 adj_end = mm->scan_end;
601 if (mm->color_adjust)
602 mm->color_adjust(prev_node, mm->scan_color,
606 mm->scan_size, mm->scan_alignment)) {
607 mm->scan_hit_start = hole_start;
608 mm->scan_hit_end = hole_end;
631 struct drm_mm *mm = node->mm;
634 mm->scanned_blocks--;
645 return (drm_mm_hole_node_end(node) > mm->scan_hit_start &&
646 node->start < mm->scan_hit_end);
650 int drm_mm_clean(struct drm_mm * mm)
652 struct list_head *head = &mm->head_node.node_list;
658 void drm_mm_init(struct drm_mm * mm, unsigned long start, unsigned long size)
660 INIT_LIST_HEAD(&mm->hole_stack);
661 INIT_LIST_HEAD(&mm->unused_nodes);
662 mm->num_unused = 0;
663 mm->scanned_blocks = 0;
664 spin_lock_init(&mm->unused_lock);
667 INIT_LIST_HEAD(&mm->head_node.node_list);
668 INIT_LIST_HEAD(&mm->head_node.hole_stack);
669 mm->head_node.hole_follows = 1;
670 mm->head_node.scanned_block = 0;
671 mm->head_node.scanned_prev_free = 0;
672 mm->head_node.scanned_next_free = 0;
673 mm->head_node.mm = mm;
674 mm->head_node.start = start + size;
675 mm->head_node.size = start - mm->head_node.start;
676 mm->head_node.node_list.contain_ptr = (caddr_t)&mm->head_node;
677 list_add_tail(&mm->head_node.hole_stack, &mm->hole_stack, (caddr_t)&mm->head_node);
678 mm->color_adjust = NULL;
682 void drm_mm_takedown(struct drm_mm * mm)
686 if (!list_empty(&mm->head_node.node_list)) {
691 spin_lock(&mm->unused_lock);
692 list_for_each_entry_safe(entry, next, struct drm_mm_node, &mm->unused_nodes, node_list) {
695 --mm->num_unused;
697 spin_unlock(&mm->unused_lock);
699 BUG_ON(mm->num_unused != 0);
720 void drm_mm_debug_table(struct drm_mm *mm, const char *prefix)
725 total_free += drm_mm_debug_hole(&mm->head_node, prefix);
727 drm_mm_for_each_node(entry, struct drm_mm_node, mm) {
740 bool drm_mm_initialized(struct drm_mm *mm)
742 return (mm->hole_stack.next != NULL);
802 struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
807 return drm_mm_search_free_generic(mm,size, alignment, 0, best_match);
810 const struct drm_mm *mm,
817 return drm_mm_search_free_in_range_generic(mm, size, alignment, 0,