Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0cd5182 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Use lockless object free



Having moved the locked phase of freeing an object to a separate worker,
we can now declare to the core that we only need the unlocked variant of
driver->gem_free_object, and can use the simple unreference internally.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161028125858.23563-20-chris@chris-wilson.co.uk
parent fbbd37b3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2575,7 +2575,7 @@ static struct drm_driver driver = {
	.set_busid = drm_pci_set_busid,

	.gem_close_object = i915_gem_close_object,
	.gem_free_object = i915_gem_free_object,
	.gem_free_object_unlocked = i915_gem_free_object,
	.gem_vm_ops = &i915_gem_vm_ops,

	.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+1 −9
Original line number Diff line number Diff line
@@ -2404,19 +2404,12 @@ __attribute__((nonnull))
static inline void
i915_gem_object_put(struct drm_i915_gem_object *obj)
{
	drm_gem_object_unreference(&obj->base);
	__drm_gem_object_unreference(&obj->base);
}

__deprecated
extern void drm_gem_object_unreference(struct drm_gem_object *);

__attribute__((nonnull))
static inline void
i915_gem_object_put_unlocked(struct drm_i915_gem_object *obj)
{
	drm_gem_object_unreference_unlocked(&obj->base);
}

__deprecated
extern void drm_gem_object_unreference_unlocked(struct drm_gem_object *);

@@ -2511,7 +2504,6 @@ static inline struct i915_vma *i915_vma_get(struct i915_vma *vma)

static inline void i915_vma_put(struct i915_vma *vma)
{
	lockdep_assert_held(&vma->vm->dev->struct_mutex);
	i915_gem_object_put(vma->obj);
}

+15 −15
Original line number Diff line number Diff line
@@ -617,7 +617,7 @@ i915_gem_create(struct drm_file *file,

	ret = drm_gem_handle_create(file, &obj->base, &handle);
	/* drop reference from allocate - handle holds it now */
	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	if (ret)
		return ret;

@@ -1111,7 +1111,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,

	i915_gem_object_unpin_pages(obj);
out:
	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	return ret;
}

@@ -1444,7 +1444,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,

	i915_gem_object_unpin_pages(obj);
err:
	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	return ret;
}

@@ -1520,7 +1520,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
				   MAX_SCHEDULE_TIMEOUT,
				   to_rps_client(file));
	if (err)
		goto out_unlocked;
		goto out;

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

	err = i915_mutex_lock_interruptible(dev);
	if (err)
		goto out_pages;
		goto out_unpin;

	if (read_domains & I915_GEM_DOMAIN_GTT)
		err = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
@@ -1551,10 +1551,10 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
	if (write_domain != 0)
		intel_fb_obj_invalidate(obj, write_origin(obj, write_domain));

out_pages:
out_unpin:
	i915_gem_object_unpin_pages(obj);
out_unlocked:
	i915_gem_object_put_unlocked(obj);
out:
	i915_gem_object_put(obj);
	return err;
}

@@ -1585,7 +1585,7 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
		}
	}

	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	return err;
}

@@ -1631,7 +1631,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
	 * pages from.
	 */
	if (!obj->base.filp) {
		i915_gem_object_put_unlocked(obj);
		i915_gem_object_put(obj);
		return -EINVAL;
	}

@@ -1643,7 +1643,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
		struct vm_area_struct *vma;

		if (down_write_killable(&mm->mmap_sem)) {
			i915_gem_object_put_unlocked(obj);
			i915_gem_object_put(obj);
			return -EINTR;
		}
		vma = find_vma(mm, addr);
@@ -1657,7 +1657,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
		/* This may race, but that's ok, it only gets set */
		WRITE_ONCE(obj->frontbuffer_ggtt_origin, ORIGIN_CPU);
	}
	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	if (IS_ERR((void *)addr))
		return addr;

@@ -2105,7 +2105,7 @@ i915_gem_mmap_gtt(struct drm_file *file,
	if (ret == 0)
		*offset = drm_vma_node_offset_addr(&obj->base.vma_node);

	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	return ret;
}

@@ -2932,7 +2932,7 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
			args->timeout_ns = 0;
	}

	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	return ret;
}

+1 −1
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,

	if (!i915_tiling_ok(dev,
			    args->stride, obj->base.size, args->tiling_mode)) {
		i915_gem_object_put_unlocked(obj);
		i915_gem_object_put(obj);
		return -EINVAL;
	}

+2 −2
Original line number Diff line number Diff line
@@ -546,7 +546,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
	release_pages(pvec, pinned, 0);
	drm_free_large(pvec);

	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	put_task_struct(work->task);
	kfree(work);
}
@@ -806,7 +806,7 @@ i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file
		ret = drm_gem_handle_create(file, &obj->base, &handle);

	/* drop reference from allocate - handle holds it now */
	i915_gem_object_put_unlocked(obj);
	i915_gem_object_put(obj);
	if (ret)
		return ret;

Loading