Lines Matching refs:mm

52 static struct drm_mm_node *drm_mm_kmalloc(struct drm_mm *mm, int atomic)
60 mtx_lock(&mm->unused_lock);
61 if (list_empty(&mm->unused_nodes))
65 list_entry(mm->unused_nodes.next,
68 --mm->num_unused;
70 mtx_unlock(&mm->unused_lock);
75 int drm_mm_pre_get(struct drm_mm *mm)
79 mtx_lock(&mm->unused_lock);
80 while (mm->num_unused < MM_UNUSED_TARGET) {
81 mtx_unlock(&mm->unused_lock);
83 mtx_lock(&mm->unused_lock);
86 int ret = (mm->num_unused < 2) ? -ENOMEM : 0;
87 mtx_unlock(&mm->unused_lock);
90 ++mm->num_unused;
91 list_add_tail(&node->node_list, &mm->unused_nodes);
93 mtx_unlock(&mm->unused_lock);
115 struct drm_mm *mm = hole_node->mm;
133 node->mm = mm;
142 list_add(&node->hole_stack, &mm->hole_stack);
156 node = drm_mm_kmalloc(hole_node->mm, atomic);
165 int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
170 hole_node = drm_mm_search_free(mm, size, alignment, 0);
184 struct drm_mm *mm = hole_node->mm;
206 node->mm = mm;
216 list_add(&node->hole_stack, &mm->hole_stack);
232 node = drm_mm_kmalloc(hole_node->mm, atomic);
242 int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
248 hole_node = drm_mm_search_free_in_range(mm, size, alignment,
261 struct drm_mm *mm = node->mm;
280 list_add(&prev_node->hole_stack, &mm->hole_stack);
282 list_move(&prev_node->hole_stack, &mm->hole_stack);
295 struct drm_mm *mm = node->mm;
299 mtx_lock(&mm->unused_lock);
300 if (mm->num_unused < MM_UNUSED_TARGET) {
301 list_add(&node->node_list, &mm->unused_nodes);
302 ++mm->num_unused;
305 mtx_unlock(&mm->unused_lock);
330 struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
341 list_for_each_entry(entry, &mm->hole_stack, hole_stack) {
360 struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
371 KASSERT(!mm->scanned_blocks, ("scanned"));
376 list_for_each_entry(entry, &mm->hole_stack, hole_stack) {
403 new->mm = old->mm;
411 void drm_mm_init_scan(struct drm_mm *mm, unsigned long size,
414 mm->scan_alignment = alignment;
415 mm->scan_size = size;
416 mm->scanned_blocks = 0;
417 mm->scan_hit_start = 0;
418 mm->scan_hit_size = 0;
419 mm->scan_check_range = 0;
420 mm->prev_scanned_node = NULL;
423 void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size,
428 mm->scan_alignment = alignment;
429 mm->scan_size = size;
430 mm->scanned_blocks = 0;
431 mm->scan_hit_start = 0;
432 mm->scan_hit_size = 0;
433 mm->scan_start = start;
434 mm->scan_end = end;
435 mm->scan_check_range = 1;
436 mm->prev_scanned_node = NULL;
441 struct drm_mm *mm = node->mm;
447 mm->scanned_blocks++;
459 node->node_list.next = &mm->prev_scanned_node->node_list;
460 mm->prev_scanned_node = node;
464 if (mm->scan_check_range) {
465 adj_start = hole_start < mm->scan_start ?
466 mm->scan_start : hole_start;
467 adj_end = hole_end > mm->scan_end ?
468 mm->scan_end : hole_end;
475 mm->scan_size, mm->scan_alignment)) {
476 mm->scan_hit_start = hole_start;
477 mm->scan_hit_size = hole_end;
487 struct drm_mm *mm = node->mm;
490 mm->scanned_blocks--;
505 if (node->start >= mm->scan_hit_start &&
507 <= mm->scan_hit_start + mm->scan_hit_size) {
514 int drm_mm_clean(struct drm_mm * mm)
516 struct list_head *head = &mm->head_node.node_list;
521 int drm_mm_init(struct drm_mm * mm, unsigned long start, unsigned long size)
523 INIT_LIST_HEAD(&mm->hole_stack);
524 INIT_LIST_HEAD(&mm->unused_nodes);
525 mm->num_unused = 0;
526 mm->scanned_blocks = 0;
527 mtx_init(&mm->unused_lock, "drm_unused", NULL, MTX_DEF);
529 INIT_LIST_HEAD(&mm->head_node.node_list);
530 INIT_LIST_HEAD(&mm->head_node.hole_stack);
531 mm->head_node.hole_follows = 1;
532 mm->head_node.scanned_block = 0;
533 mm->head_node.scanned_prev_free = 0;
534 mm->head_node.scanned_next_free = 0;
535 mm->head_node.mm = mm;
536 mm->head_node.start = start + size;
537 mm->head_node.size = start - mm->head_node.start;
538 list_add_tail(&mm->head_node.hole_stack, &mm->hole_stack);
543 void drm_mm_takedown(struct drm_mm * mm)
547 if (!list_empty(&mm->head_node.node_list)) {
552 mtx_lock(&mm->unused_lock);
553 list_for_each_entry_safe(entry, next, &mm->unused_nodes, node_list) {
556 --mm->num_unused;
558 mtx_unlock(&mm->unused_lock);
560 mtx_destroy(&mm->unused_lock);
562 KASSERT(mm->num_unused == 0, ("num_unused != 0"));
565 void drm_mm_debug_table(struct drm_mm *mm, const char *prefix)
571 hole_start = drm_mm_hole_node_start(&mm->head_node);
572 hole_end = drm_mm_hole_node_end(&mm->head_node);
580 drm_mm_for_each_node(entry, mm) {