Explorar o código

drm/i915: Avoid taking the mutex for dropping the refcnt upon creation

After allocation a handle for the fresh object, we know that we can
safely drop the refcnt without triggering a free so we do not need the
mutex. Strangely, this mutex acquisition is the one that appears on
driver profiles.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Chris Wilson %!s(int64=14) %!d(string=hai) anos
pai
achega
202f2fef7a
Modificáronse 1 ficheiros con 7 adicións e 4 borrados
  1. 7 4
      drivers/gpu/drm/i915/i915_gem.c

+ 7 - 4
drivers/gpu/drm/i915/i915_gem.c

@@ -244,12 +244,17 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	ret = drm_gem_handle_create(file_priv, obj, &handle);
 	ret = drm_gem_handle_create(file_priv, obj, &handle);
-	/* drop reference from allocate - handle holds it now */
-	drm_gem_object_unreference_unlocked(obj);
 	if (ret) {
 	if (ret) {
+		drm_gem_object_release(obj);
+		i915_gem_info_remove_obj(dev->dev_private, obj->size);
+		kfree(obj);
 		return ret;
 		return ret;
 	}
 	}
 
 
+	/* drop reference from allocate - handle holds it now */
+	drm_gem_object_unreference(obj);
+	trace_i915_gem_object_create(obj);
+
 	args->handle = handle;
 	args->handle = handle;
 	return 0;
 	return 0;
 }
 }
@@ -4380,8 +4385,6 @@ struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
 	INIT_LIST_HEAD(&obj->gpu_write_list);
 	INIT_LIST_HEAD(&obj->gpu_write_list);
 	obj->madv = I915_MADV_WILLNEED;
 	obj->madv = I915_MADV_WILLNEED;
 
 
-	trace_i915_gem_object_create(&obj->base);
-
 	return &obj->base;
 	return &obj->base;
 }
 }