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