Lines Matching refs:mm
85 static void mark_free(struct i915_buddy_mm *mm,
92 &mm->free_list[i915_buddy_block_order(block)]);
103 int i915_buddy_init(struct i915_buddy_mm *mm, u64 size, u64 chunk_size)
119 mm->size = size;
120 mm->chunk_size = chunk_size;
121 mm->max_order = ilog2(size) - ilog2(chunk_size);
123 GEM_BUG_ON(mm->max_order > I915_BUDDY_MAX_ORDER);
125 mm->free_list = kmalloc_array(mm->max_order + 1,
128 if (!mm->free_list)
131 for (i = 0; i <= mm->max_order; ++i)
132 INIT_LIST_HEAD(&mm->free_list[i]);
134 mm->n_roots = hweight64(size);
136 mm->roots = kmalloc_array(mm->n_roots,
139 if (!mm->roots)
161 mark_free(mm, root);
163 GEM_BUG_ON(i > mm->max_order);
164 GEM_BUG_ON(i915_buddy_block_size(mm, root) < chunk_size);
166 mm->roots[i] = root;
177 i915_block_free(mm->roots[i]);
178 kfree(mm->roots);
180 kfree(mm->free_list);
184 void i915_buddy_fini(struct i915_buddy_mm *mm)
188 for (i = 0; i < mm->n_roots; ++i) {
189 GEM_WARN_ON(!i915_buddy_block_is_free(mm->roots[i]));
190 i915_block_free(mm->roots[i]);
193 kfree(mm->roots);
194 kfree(mm->free_list);
197 static int split_block(struct i915_buddy_mm *mm,
211 offset + (mm->chunk_size << block_order));
217 mark_free(mm, block->left);
218 mark_free(mm, block->right);
240 static void __i915_buddy_free(struct i915_buddy_mm *mm,
261 mark_free(mm, block);
264 void i915_buddy_free(struct i915_buddy_mm *mm,
268 __i915_buddy_free(mm, block);
271 void i915_buddy_free_list(struct i915_buddy_mm *mm, struct list_head *objects)
276 i915_buddy_free(mm, block);
285 * 0 = 2^0 * mm->chunk_size
286 * 1 = 2^1 * mm->chunk_size
287 * 2 = 2^2 * mm->chunk_size
291 i915_buddy_alloc(struct i915_buddy_mm *mm, unsigned int order)
297 for (i = order; i <= mm->max_order; ++i) {
298 block = list_first_entry_or_null(&mm->free_list[i],
311 err = split_block(mm, block);
325 __i915_buddy_free(mm, block);
349 int i915_buddy_alloc_range(struct i915_buddy_mm *mm,
361 if (size < mm->chunk_size)
364 if (!IS_ALIGNED(size | start, mm->chunk_size))
367 if (range_overflows(start, size, mm->size))
370 for (i = 0; i < mm->n_roots; ++i)
371 list_add_tail(&mm->roots[i]->tmp_link, &dfs);
388 block_end = block_start + i915_buddy_block_size(mm, block) - 1;
410 err = split_block(mm, block);
432 __i915_buddy_free(mm, block);
435 i915_buddy_free_list(mm, &allocated);