I've written a couple of versions of this patch, and it's always in prep for some scheduler work I am doing. Only difference this time is a new maintainer to never merge them. Signed-off-by: Ben Widawsky <ben at bwidawsk.net> --- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 38 +++++++++++++++++++----------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 354cecf..99ebb36 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -36,10 +36,17 @@ struct eb_objects { struct list_head objects; int and; + + struct drm_file *file; + struct intel_ring_buffer *ring; + struct drm_i915_gem_execbuffer2 *args; + struct drm_i915_gem_exec_object2 *exec; + union { struct drm_i915_gem_object *lut[0]; struct hlist_head buckets[0]; }; + /* NB: don't put anything here */ }; static struct eb_objects * @@ -82,11 +89,11 @@ eb_reset(struct eb_objects *eb) } static int -eb_lookup_objects(struct eb_objects *eb, - struct drm_i915_gem_exec_object2 *exec, - const struct drm_i915_gem_execbuffer2 *args, - struct drm_file *file) +eb_lookup_objects(struct eb_objects *eb) { + struct drm_i915_gem_exec_object2 *exec = eb->exec; + struct drm_i915_gem_execbuffer2 *args = eb->args; + struct drm_file *file = eb->file; int i; spin_lock(&file->table_lock); @@ -572,18 +579,17 @@ err: /* Decrement pin count for bound objects */ } static int -i915_gem_execbuffer_relocate_slow(struct drm_device *dev, - struct drm_i915_gem_execbuffer2 *args, - struct drm_file *file, - struct intel_ring_buffer *ring, - struct eb_objects *eb, - struct drm_i915_gem_exec_object2 *exec) +i915_gem_execbuffer_relocate_slow(struct eb_objects *eb) { struct drm_i915_gem_relocation_entry *reloc; struct drm_i915_gem_object *obj; bool need_relocs; int *reloc_offset; int i, total, ret; + struct drm_device *dev = eb->ring->dev; + struct drm_i915_gem_execbuffer2 *args = eb->args; + struct intel_ring_buffer *ring = eb->ring; + struct drm_i915_gem_exec_object2 *exec = eb->exec; int count = args->buffer_count; /* We may process another execbuffer during the unlock... */ @@ -656,7 +662,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev, /* reacquire the objects */ eb_reset(eb); - ret = eb_lookup_objects(eb, exec, args, file); + ret = eb_lookup_objects(eb); if (ret) goto err; @@ -966,8 +972,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, goto pre_mutex_err; } + eb->args = args; + eb->exec = exec; + eb->file = file; + eb->ring = ring; + /* Look up object handles */ - ret = eb_lookup_objects(eb, exec, args, file); + ret = eb_lookup_objects(eb); if (ret) goto err; @@ -987,8 +998,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, ret = i915_gem_execbuffer_relocate(eb); if (ret) { if (ret == -EFAULT) { - ret = i915_gem_execbuffer_relocate_slow(dev, args, file, ring, - eb, exec); + ret = i915_gem_execbuffer_relocate_slow(eb); BUG_ON(!mutex_is_locked(&dev->struct_mutex)); } if (ret) -- 1.8.1.5