Lines Matching refs:block
49 struct i915_buddy_block *block;
51 block = kmem_cache_zalloc(global.slab_blocks, GFP_KERNEL);
52 if (!block)
55 block->header = offset;
56 block->header |= order;
57 block->parent = parent;
59 return block;
62 static void i915_block_free(struct i915_buddy_block *block)
64 kmem_cache_free(global.slab_blocks, block);
67 static void mark_allocated(struct i915_buddy_block *block)
69 block->header &= ~I915_BUDDY_HEADER_STATE;
70 block->header |= I915_BUDDY_ALLOCATED;
72 list_del(&block->link);
76 struct i915_buddy_block *block)
78 block->header &= ~I915_BUDDY_HEADER_STATE;
79 block->header |= I915_BUDDY_FREE;
81 list_add(&block->link,
82 &mm->free_list[i915_buddy_block_order(block)]);
85 static void mark_split(struct i915_buddy_block *block)
87 block->header &= ~I915_BUDDY_HEADER_STATE;
88 block->header |= I915_BUDDY_SPLIT;
90 list_del(&block->link);
188 struct i915_buddy_block *block)
190 unsigned int block_order = i915_buddy_block_order(block) - 1;
191 u64 offset = i915_buddy_block_offset(block);
193 GEM_BUG_ON(!i915_buddy_block_is_free(block));
194 GEM_BUG_ON(!i915_buddy_block_order(block));
196 block->left = i915_block_alloc(block, block_order, offset);
197 if (!block->left)
200 block->right = i915_block_alloc(block, block_order,
202 if (!block->right) {
203 i915_block_free(block->left);
207 mark_free(mm, block->left);
208 mark_free(mm, block->right);
210 mark_split(block);
216 get_buddy(struct i915_buddy_block *block)
220 parent = block->parent;
224 if (parent->left == block)
231 struct i915_buddy_block *block)
235 while ((parent = block->parent)) {
238 buddy = get_buddy(block);
245 i915_block_free(block);
248 block = parent;
251 mark_free(mm, block);
255 struct i915_buddy_block *block)
257 GEM_BUG_ON(!i915_buddy_block_is_allocated(block));
258 __i915_buddy_free(mm, block);
263 struct i915_buddy_block *block, *on;
265 list_for_each_entry_safe(block, on, objects, link) {
266 i915_buddy_free(mm, block);
273 * Allocate power-of-two block. The order value here translates to:
283 struct i915_buddy_block *block = NULL;
288 block = list_first_entry_or_null(&mm->free_list[i],
291 if (block)
295 if (!block)
298 GEM_BUG_ON(!i915_buddy_block_is_free(block));
301 err = split_block(mm, block);
306 block = block->left;
310 mark_allocated(block);
311 kmemleak_update_trace(block);
312 return block;
316 __i915_buddy_free(mm, block);
335 * reserve a block for the initial framebuffer or similar, hence the expectation
344 struct i915_buddy_block *block;
370 block = list_first_entry_or_null(&dfs,
373 if (!block)
376 list_del(&block->tmp_link);
378 block_start = i915_buddy_block_offset(block);
379 block_end = block_start + i915_buddy_block_size(mm, block) - 1;
384 if (i915_buddy_block_is_allocated(block)) {
390 if (!i915_buddy_block_is_free(block)) {
395 mark_allocated(block);
396 list_add_tail(&block->link, &allocated);
400 if (!i915_buddy_block_is_split(block)) {
401 err = split_block(mm, block);
406 list_add(&block->right->tmp_link, &dfs);
407 list_add(&block->left->tmp_link, &dfs);
419 buddy = get_buddy(block);
421 (i915_buddy_block_is_free(block) &&
423 __i915_buddy_free(mm, block);