Lines Matching refs:block

19 	struct drm_buddy_block *block;
23 block = kmem_cache_zalloc(slab_blocks, GFP_KERNEL);
24 if (!block)
27 block->header = offset;
28 block->header |= order;
29 block->parent = parent;
31 BUG_ON(block->header & DRM_BUDDY_HEADER_UNUSED);
32 return block;
36 struct drm_buddy_block *block)
38 kmem_cache_free(slab_blocks, block);
42 struct drm_buddy_block *block)
47 head = &mm->free_list[drm_buddy_block_order(block)];
49 list_add(&block->link, head);
54 if (drm_buddy_block_offset(block) < drm_buddy_block_offset(node))
57 __list_add(&block->link, node->link.prev, &node->link);
60 static void mark_allocated(struct drm_buddy_block *block)
62 block->header &= ~DRM_BUDDY_HEADER_STATE;
63 block->header |= DRM_BUDDY_ALLOCATED;
65 list_del(&block->link);
69 struct drm_buddy_block *block)
71 block->header &= ~DRM_BUDDY_HEADER_STATE;
72 block->header |= DRM_BUDDY_FREE;
74 list_insert_sorted(mm, block);
77 static void mark_split(struct drm_buddy_block *block)
79 block->header &= ~DRM_BUDDY_HEADER_STATE;
80 block->header |= DRM_BUDDY_SPLIT;
82 list_del(&block->link);
204 struct drm_buddy_block *block)
206 unsigned int block_order = drm_buddy_block_order(block) - 1;
207 u64 offset = drm_buddy_block_offset(block);
209 BUG_ON(!drm_buddy_block_is_free(block));
210 BUG_ON(!drm_buddy_block_order(block));
212 block->left = drm_block_alloc(mm, block, block_order, offset);
213 if (!block->left)
216 block->right = drm_block_alloc(mm, block, block_order,
218 if (!block->right) {
219 drm_block_free(mm, block->left);
223 mark_free(mm, block->left);
224 mark_free(mm, block->right);
226 mark_split(block);
232 __get_buddy(struct drm_buddy_block *block)
236 parent = block->parent;
240 if (parent->left == block)
249 * @block: DRM buddy block
251 * Returns the corresponding buddy block for @block, or NULL
252 * if this is a root block and can't be merged further.
257 drm_get_buddy(struct drm_buddy_block *block)
259 return __get_buddy(block);
264 struct drm_buddy_block *block)
268 while ((parent = block->parent)) {
271 buddy = __get_buddy(block);
278 drm_block_free(mm, block);
281 block = parent;
284 mark_free(mm, block);
288 * drm_buddy_free_block - free a block
291 * @block: block to be freed
294 struct drm_buddy_block *block)
296 BUG_ON(!drm_buddy_block_is_allocated(block));
297 mm->avail += drm_buddy_block_size(mm, block);
298 __drm_buddy_free(mm, block);
310 struct drm_buddy_block *block, *on;
312 list_for_each_entry_safe(block, on, objects, link) {
313 drm_buddy_free_block(mm, block);
336 struct drm_buddy_block *block;
351 block = list_first_entry_or_null(&dfs,
354 if (!block)
357 list_del(&block->tmp_link);
359 if (drm_buddy_block_order(block) < order)
362 block_start = drm_buddy_block_offset(block);
363 block_end = block_start + drm_buddy_block_size(mm, block) - 1;
368 if (drm_buddy_block_is_allocated(block))
381 order == drm_buddy_block_order(block)) {
383 * Find the free block within the range.
385 if (drm_buddy_block_is_free(block))
386 return block;
391 if (!drm_buddy_block_is_split(block)) {
392 err = split_block(mm, block);
397 list_add(&block->right->tmp_link, &dfs);
398 list_add(&block->left->tmp_link, &dfs);
409 buddy = __get_buddy(block);
411 (drm_buddy_block_is_free(block) &&
413 __drm_buddy_free(mm, block);
448 struct drm_buddy_block *block = NULL;
453 block = get_maxblock(mm, order);
454 if (block)
455 /* Store the obtained block order */
456 tmp = drm_buddy_block_order(block);
460 block = list_last_entry(&mm->free_list[tmp],
463 if (block)
469 if (!block)
472 BUG_ON(!drm_buddy_block_is_free(block));
475 err = split_block(mm, block);
479 block = block->right;
482 return block;
486 __drm_buddy_free(mm, block);
495 struct drm_buddy_block *block;
507 block = list_first_entry_or_null(dfs,
510 if (!block)
513 list_del(&block->tmp_link);
515 block_start = drm_buddy_block_offset(block);
516 block_end = block_start + drm_buddy_block_size(mm, block) - 1;
521 if (drm_buddy_block_is_allocated(block)) {
527 if (!drm_buddy_block_is_free(block)) {
532 mark_allocated(block);
533 mm->avail -= drm_buddy_block_size(mm, block);
534 list_add_tail(&block->link, &allocated);
538 if (!drm_buddy_block_is_split(block)) {
539 err = split_block(mm, block);
544 list_add(&block->right->tmp_link, dfs);
545 list_add(&block->left->tmp_link, dfs);
557 buddy = __get_buddy(block);
559 (drm_buddy_block_is_free(block) &&
561 __drm_buddy_free(mm, block);
588 * MUST contain single block as input to be trimmed.
605 struct drm_buddy_block *block;
613 block = list_first_entry(blocks,
617 if (WARN_ON(!drm_buddy_block_is_allocated(block)))
620 if (new_size > drm_buddy_block_size(mm, block))
626 if (new_size == drm_buddy_block_size(mm, block))
629 list_del(&block->link);
630 mark_free(mm, block);
631 mm->avail += drm_buddy_block_size(mm, block);
634 parent = block->parent;
635 block->parent = NULL;
637 new_start = drm_buddy_block_offset(block);
638 list_add(&block->tmp_link, &dfs);
641 mark_allocated(block);
642 mm->avail -= drm_buddy_block_size(mm, block);
643 list_add(&block->link, blocks);
646 block->parent = parent;
655 * @start: start of the allowed range for this block
656 * @end: end of the allowed range for this block
663 * the tree and returns the desired block.
666 * are enforced, which picks the block from the freelist.
677 struct drm_buddy_block *block = NULL;
720 block = alloc_range_bias(mm, start, end, order);
723 block = alloc_from_freelist(mm, order, flags);
725 if (!IS_ERR(block))
734 mark_allocated(block);
735 mm->avail -= drm_buddy_block_size(mm, block);
736 kmemleak_update_trace(block);
737 list_add_tail(&block->link, &allocated);
755 * drm_buddy_block_print - print block information
758 * @block: DRM buddy block
762 struct drm_buddy_block *block,
765 u64 start = drm_buddy_block_offset(block);
766 u64 size = drm_buddy_block_size(mm, block);
786 struct drm_buddy_block *block;
789 list_for_each_entry(block, &mm->free_list[order], link) {
790 BUG_ON(!drm_buddy_block_is_free(block));