On Fri, Nov 07, 2014 at 02:22:01PM -0800, bradley.d.vol...@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
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to