浏览代码

drm/i915/execbuffer: Correctly clear the current object list upon EFAULT

Before releasing the lock in order to copy the relocation list from user
pages, we need to drop all the object references as another thread may
usurp and execute another batchbuffer before we reacquire the lock.
However, the code was buggy and failed to clear the list...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: stable@kernel.org
Chris Wilson 14 年之前
父节点
当前提交
36cf174230
共有 1 个文件被更改,包括 1 次插入3 次删除
  1. 1 3
      drivers/gpu/drm/i915/i915_gem_execbuffer.c

+ 1 - 3
drivers/gpu/drm/i915/i915_gem_execbuffer.c

@@ -622,7 +622,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
 	int i, total, ret;
 	int i, total, ret;
 
 
 	/* We may process another execbuffer during the unlock... */
 	/* We may process another execbuffer during the unlock... */
-	while (list_empty(objects)) {
+	while (!list_empty(objects)) {
 		obj = list_first_entry(objects,
 		obj = list_first_entry(objects,
 				       struct drm_i915_gem_object,
 				       struct drm_i915_gem_object,
 				       exec_list);
 				       exec_list);
@@ -665,7 +665,6 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
 	}
 	}
 
 
 	/* reacquire the objects */
 	/* reacquire the objects */
-	INIT_LIST_HEAD(objects);
 	eb_reset(eb);
 	eb_reset(eb);
 	for (i = 0; i < count; i++) {
 	for (i = 0; i < count; i++) {
 		struct drm_i915_gem_object *obj;
 		struct drm_i915_gem_object *obj;
@@ -1353,4 +1352,3 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
 	drm_free_large(exec2_list);
 	drm_free_large(exec2_list);
 	return ret;
 	return ret;
 }
 }
-