On Fri, Jun 03, 2016 at 05:55:42PM +0100, Chris Wilson wrote: > 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) > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > drivers/gpu/drm/i915/i915_gem.c | 29 ++++++++++++++++------------- > 1 file changed, 16 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index a4f949038d50..b78f9df1894c 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -1265,25 +1265,28 @@ 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 ret; > > 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) > + if (obj->pin_display) { READ_ONCE(obj->pin_display)? > + ret = i915_mutex_lock_interruptible(dev); > + if (ret) > + goto unref; > + > i915_gem_object_flush_cpu_write_domain(obj); > > - i915_gem_object_put(obj); > -unlock: > - mutex_unlock(&dev->struct_mutex); > + i915_gem_object_put(obj); > + mutex_unlock(&dev->struct_mutex); > + } else { > + ret = 0; > +unref: > + i915_gem_object_put_unlocked(obj); > + } > + > return ret; > } > > -- > 2.8.1 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx