[Intel-gfx] [PATCH v4 1/7] drm/i915: Implement a framework for batch buffer pools
Chris Wilson
chris at chris-wilson.co.uk
Wed Nov 12 10:42:44 CET 2014
On Fri, Nov 07, 2014 at 02:22:01PM -0800, bradley.d.volkin at intel.com wrote:
> +struct drm_i915_gem_object *
> +i915_gem_batch_pool_get(struct i915_gem_batch_pool *pool,
> + size_t size)
> +{
> + struct drm_i915_gem_object *obj = NULL;
> + struct drm_i915_gem_object *tmp, *next;
> + bool was_purged;
> +
> + WARN_ON(!mutex_is_locked(&pool->dev->struct_mutex));
> +
> + list_for_each_entry_safe(tmp, next,
> + &pool->active_list, batch_pool_list) {
> + if (!tmp->active)
> + list_move_tail(&tmp->batch_pool_list,
> + &pool->inactive_list);
> + }
So we don't need two lists then?
> + do {
> + was_purged = false;
> +
> + list_for_each_entry(tmp, &pool->inactive_list, batch_pool_list) {
> + /*
> + * Select a buffer that is at least as big as needed
> + * but not 'too much' bigger. A better way to do this
> + * might be to bucket the pool objects based on size.
> + */
> + if (tmp->base.size >= size &&
> + tmp->base.size <= (2 * size)) {
> + obj = tmp;
> + break;
> + }
> + }
> +
> + if (obj && obj->madv == __I915_MADV_PURGED) {
> + was_purged = true;
> + list_del(&obj->batch_pool_list);
> + drm_gem_object_unreference(&obj->base);
> + obj = NULL;
> + }
> + } while (was_purged);
You stop searching if you find an inactive buffer too big or too small?
> +
> + if (!obj) {
> + obj = i915_gem_alloc_object(pool->dev, size);
> + if (!obj)
> + return ERR_PTR(-ENOMEM);
Grag pages and set the madv here, don't ever worry about it again later.
> + list_add_tail(&obj->batch_pool_list, &pool->inactive_list);
Redundant.
> + }
> +
> + list_move_tail(&obj->batch_pool_list, &pool->active_list);
> +
> + return obj;
> +}
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list