Commit ec701249 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Daniel Vetter
Browse files

drm/i915: Take obj lock around set_domain ioctl

parent b51ed60e
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -541,6 +541,10 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
		goto out;
	}

	err = i915_gem_object_lock_interruptible(obj, NULL);
	if (err)
		goto out;

	/*
	 * Flush and acquire obj->pages so that we are coherent through
	 * direct access in memory with previous cached writes through
@@ -552,7 +556,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
	 */
	err = i915_gem_object_pin_pages(obj);
	if (err)
		goto out;
		goto out_unlock;

	/*
	 * Already in the desired write domain? Nothing for us to do!
@@ -567,10 +571,6 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
	if (READ_ONCE(obj->write_domain) == read_domains)
		goto out_unpin;

	err = i915_gem_object_lock_interruptible(obj, NULL);
	if (err)
		goto out_unpin;

	if (read_domains & I915_GEM_DOMAIN_WC)
		err = i915_gem_object_set_to_wc_domain(obj, write_domain);
	else if (read_domains & I915_GEM_DOMAIN_GTT)
@@ -578,13 +578,15 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
	else
		err = i915_gem_object_set_to_cpu_domain(obj, write_domain);

out_unpin:
	i915_gem_object_unpin_pages(obj);

out_unlock:
	i915_gem_object_unlock(obj);

	if (write_domain)
	if (!err && write_domain)
		i915_gem_object_invalidate_frontbuffer(obj, ORIGIN_CPU);

out_unpin:
	i915_gem_object_unpin_pages(obj);
out:
	i915_gem_object_put(obj);
	return err;