mirror of https://gitee.com/openkylin/linux.git
drm/i915: Reduce locking inside swfinish ioctl
We only need to take the struct_mutex if the object is pinned to the display engine and so requires checking for clflush. (The race with userspace pinning the object to a framebuffer is irrelevant.) v2: Use access once for compiler hints (or not as it is a bitfield) v3: READ_ONCE, obj->pin_display is not a bitfield anymore v4: Don't be creative with goto. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1470388464-28458-14-git-send-email-chris@chris-wilson.co.uk
This commit is contained in:
parent
3fdc13c7a3
commit
c21724cc4d
|
@ -1518,26 +1518,23 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
|
|||
{
|
||||
struct drm_i915_gem_sw_finish *args = data;
|
||||
struct drm_i915_gem_object *obj;
|
||||
int ret = 0;
|
||||
|
||||
ret = i915_mutex_lock_interruptible(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
int err = 0;
|
||||
|
||||
obj = i915_gem_object_lookup(file, args->handle);
|
||||
if (!obj) {
|
||||
ret = -ENOENT;
|
||||
goto unlock;
|
||||
}
|
||||
if (!obj)
|
||||
return -ENOENT;
|
||||
|
||||
/* Pinned buffers may be scanout, so flush the cache */
|
||||
if (obj->pin_display)
|
||||
i915_gem_object_flush_cpu_write_domain(obj);
|
||||
if (READ_ONCE(obj->pin_display)) {
|
||||
err = i915_mutex_lock_interruptible(dev);
|
||||
if (!err) {
|
||||
i915_gem_object_flush_cpu_write_domain(obj);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
i915_gem_object_put(obj);
|
||||
unlock:
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return ret;
|
||||
i915_gem_object_put_unlocked(obj);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue