Lines Matching refs:block

59 	struct i915_buddy_block *block;
61 block = kmem_cache_zalloc(global.slab_blocks, GFP_KERNEL);
62 if (!block)
65 block->header = offset;
66 block->header |= order;
67 block->parent = parent;
69 return block;
72 static void i915_block_free(struct i915_buddy_block *block)
74 kmem_cache_free(global.slab_blocks, block);
77 static void mark_allocated(struct i915_buddy_block *block)
79 block->header &= ~I915_BUDDY_HEADER_STATE;
80 block->header |= I915_BUDDY_ALLOCATED;
82 list_del(&block->link);
86 struct i915_buddy_block *block)
88 block->header &= ~I915_BUDDY_HEADER_STATE;
89 block->header |= I915_BUDDY_FREE;
91 list_add(&block->link,
92 &mm->free_list[i915_buddy_block_order(block)]);
95 static void mark_split(struct i915_buddy_block *block)
97 block->header &= ~I915_BUDDY_HEADER_STATE;
98 block->header |= I915_BUDDY_SPLIT;
100 list_del(&block->link);
198 struct i915_buddy_block *block)
200 unsigned int block_order = i915_buddy_block_order(block) - 1;
201 u64 offset = i915_buddy_block_offset(block);
203 GEM_BUG_ON(!i915_buddy_block_is_free(block));
204 GEM_BUG_ON(!i915_buddy_block_order(block));
206 block->left = i915_block_alloc(block, block_order, offset);
207 if (!block->left)
210 block->right = i915_block_alloc(block, block_order,
212 if (!block->right) {
213 i915_block_free(block->left);
217 mark_free(mm, block->left);
218 mark_free(mm, block->right);
220 mark_split(block);
226 get_buddy(struct i915_buddy_block *block)
230 parent = block->parent;
234 if (parent->left == block)
241 struct i915_buddy_block *block)
245 while ((parent = block->parent)) {
248 buddy = get_buddy(block);
255 i915_block_free(block);
258 block = parent;
261 mark_free(mm, block);
265 struct i915_buddy_block *block)
267 GEM_BUG_ON(!i915_buddy_block_is_allocated(block));
268 __i915_buddy_free(mm, block);
273 struct i915_buddy_block *block, *on;
275 list_for_each_entry_safe(block, on, objects, link) {
276 i915_buddy_free(mm, block);
283 * Allocate power-of-two block. The order value here translates to:
293 struct i915_buddy_block *block = NULL;
298 block = list_first_entry_or_null(&mm->free_list[i],
301 if (block)
305 if (!block)
308 GEM_BUG_ON(!i915_buddy_block_is_free(block));
311 err = split_block(mm, block);
316 block = block->left;
320 mark_allocated(block);
321 kmemleak_update_trace(block);
322 return block;
325 __i915_buddy_free(mm, block);
344 * reserve a block for the initial framebuffer or similar, hence the expectation
353 struct i915_buddy_block *block;
379 block = list_first_entry_or_null(&dfs,
382 if (!block)
385 list_del(&block->tmp_link);
387 block_start = i915_buddy_block_offset(block);
388 block_end = block_start + i915_buddy_block_size(mm, block) - 1;
393 if (i915_buddy_block_is_allocated(block)) {
399 if (!i915_buddy_block_is_free(block)) {
404 mark_allocated(block);
405 list_add_tail(&block->link, &allocated);
409 if (!i915_buddy_block_is_split(block)) {
410 err = split_block(mm, block);
415 list_add(&block->right->tmp_link, &dfs);
416 list_add(&block->left->tmp_link, &dfs);
428 buddy = get_buddy(block);
430 (i915_buddy_block_is_free(block) &&
432 __i915_buddy_free(mm, block);