Lines Matching refs:mm

16 static struct i915_buddy_block *i915_block_alloc(struct i915_buddy_mm *mm,  in i915_block_alloc()  argument
37 static void i915_block_free(struct i915_buddy_mm *mm, in i915_block_free() argument
51 static void mark_free(struct i915_buddy_mm *mm, in mark_free() argument
58 &mm->free_list[i915_buddy_block_order(block)]); in mark_free()
69 int i915_buddy_init(struct i915_buddy_mm *mm, u64 size, u64 chunk_size) in i915_buddy_init() argument
85 mm->size = size; in i915_buddy_init()
86 mm->avail = size; in i915_buddy_init()
87 mm->chunk_size = chunk_size; in i915_buddy_init()
88 mm->max_order = ilog2(size) - ilog2(chunk_size); in i915_buddy_init()
90 GEM_BUG_ON(mm->max_order > I915_BUDDY_MAX_ORDER); in i915_buddy_init()
92 mm->free_list = kmalloc_array(mm->max_order + 1, in i915_buddy_init()
95 if (!mm->free_list) in i915_buddy_init()
98 for (i = 0; i <= mm->max_order; ++i) in i915_buddy_init()
99 INIT_LIST_HEAD(&mm->free_list[i]); in i915_buddy_init()
101 mm->n_roots = hweight64(size); in i915_buddy_init()
103 mm->roots = kmalloc_array(mm->n_roots, in i915_buddy_init()
106 if (!mm->roots) in i915_buddy_init()
124 root = i915_block_alloc(mm, NULL, order, offset); in i915_buddy_init()
128 mark_free(mm, root); in i915_buddy_init()
130 GEM_BUG_ON(i > mm->max_order); in i915_buddy_init()
131 GEM_BUG_ON(i915_buddy_block_size(mm, root) < chunk_size); in i915_buddy_init()
133 mm->roots[i] = root; in i915_buddy_init()
144 i915_block_free(mm, mm->roots[i]); in i915_buddy_init()
145 kfree(mm->roots); in i915_buddy_init()
147 kfree(mm->free_list); in i915_buddy_init()
151 void i915_buddy_fini(struct i915_buddy_mm *mm) in i915_buddy_fini() argument
155 for (i = 0; i < mm->n_roots; ++i) { in i915_buddy_fini()
156 GEM_WARN_ON(!i915_buddy_block_is_free(mm->roots[i])); in i915_buddy_fini()
157 i915_block_free(mm, mm->roots[i]); in i915_buddy_fini()
160 GEM_WARN_ON(mm->avail != mm->size); in i915_buddy_fini()
162 kfree(mm->roots); in i915_buddy_fini()
163 kfree(mm->free_list); in i915_buddy_fini()
166 static int split_block(struct i915_buddy_mm *mm, in split_block() argument
175 block->left = i915_block_alloc(mm, block, block_order, offset); in split_block()
179 block->right = i915_block_alloc(mm, block, block_order, in split_block()
180 offset + (mm->chunk_size << block_order)); in split_block()
182 i915_block_free(mm, block->left); in split_block()
186 mark_free(mm, block->left); in split_block()
187 mark_free(mm, block->right); in split_block()
209 static void __i915_buddy_free(struct i915_buddy_mm *mm, in __i915_buddy_free() argument
224 i915_block_free(mm, block); in __i915_buddy_free()
225 i915_block_free(mm, buddy); in __i915_buddy_free()
230 mark_free(mm, block); in __i915_buddy_free()
233 void i915_buddy_free(struct i915_buddy_mm *mm, in i915_buddy_free() argument
237 mm->avail += i915_buddy_block_size(mm, block); in i915_buddy_free()
238 __i915_buddy_free(mm, block); in i915_buddy_free()
241 void i915_buddy_free_list(struct i915_buddy_mm *mm, struct list_head *objects) in i915_buddy_free_list() argument
246 i915_buddy_free(mm, block); in i915_buddy_free_list()
261 i915_buddy_alloc(struct i915_buddy_mm *mm, unsigned int order) in i915_buddy_alloc() argument
267 for (i = order; i <= mm->max_order; ++i) { in i915_buddy_alloc()
268 block = list_first_entry_or_null(&mm->free_list[i], in i915_buddy_alloc()
281 err = split_block(mm, block); in i915_buddy_alloc()
291 mm->avail -= i915_buddy_block_size(mm, block); in i915_buddy_alloc()
297 __i915_buddy_free(mm, block); in i915_buddy_alloc()
321 int i915_buddy_alloc_range(struct i915_buddy_mm *mm, in i915_buddy_alloc_range() argument
333 if (size < mm->chunk_size) in i915_buddy_alloc_range()
336 if (!IS_ALIGNED(size | start, mm->chunk_size)) in i915_buddy_alloc_range()
339 if (range_overflows(start, size, mm->size)) in i915_buddy_alloc_range()
342 for (i = 0; i < mm->n_roots; ++i) in i915_buddy_alloc_range()
343 list_add_tail(&mm->roots[i]->tmp_link, &dfs); in i915_buddy_alloc_range()
360 block_end = block_start + i915_buddy_block_size(mm, block) - 1; in i915_buddy_alloc_range()
377 mm->avail -= i915_buddy_block_size(mm, block); in i915_buddy_alloc_range()
383 err = split_block(mm, block); in i915_buddy_alloc_range()
405 __i915_buddy_free(mm, block); in i915_buddy_alloc_range()
408 i915_buddy_free_list(mm, &allocated); in i915_buddy_alloc_range()
412 void i915_buddy_block_print(struct i915_buddy_mm *mm, in i915_buddy_block_print() argument
417 u64 size = i915_buddy_block_size(mm, block); in i915_buddy_block_print()
422 void i915_buddy_print(struct i915_buddy_mm *mm, struct drm_printer *p) in i915_buddy_print() argument
427 mm->chunk_size >> 10, mm->size >> 20, mm->avail >> 20); in i915_buddy_print()
429 for (order = mm->max_order; order >= 0; order--) { in i915_buddy_print()
433 list_for_each_entry(block, &mm->free_list[order], link) { in i915_buddy_print()
440 free = count * (mm->chunk_size << order); in i915_buddy_print()