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

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

drm/i915: Refactor common list iteration over GGTT vma



In quite a few places, we have a list iteration over the vma on an
object that only want to inspect GGTT vma. By construction, these are
placed at the start of the list, so we have copied that knowledge into
many callsites. Pull that knowledge back to i915_vma.h and provide a
for_each_ggtt_vma() to tidy up the code.

v2: Add a backreference from vma_create() to remind ourselves why we put
ggtt vma at the head of the obj->vma_list (and ppgtt vma at the tail).
v3: Fixup s/vma/V/

Suggested-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20171207211407.31549-1-chris@chris-wilson.co.uk
parent 7125397b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -111,8 +111,8 @@ static u64 i915_gem_obj_total_ggtt_size(struct drm_i915_gem_object *obj)
	u64 size = 0;
	struct i915_vma *vma;

	list_for_each_entry(vma, &obj->vma_list, obj_link) {
		if (i915_vma_is_ggtt(vma) && drm_mm_node_allocated(&vma->node))
	for_each_ggtt_vma(vma, obj) {
		if (drm_mm_node_allocated(&vma->node))
			size += vma->node.size;
	}

+4 −14
Original line number Diff line number Diff line
@@ -714,10 +714,7 @@ flush_write_domain(struct drm_i915_gem_object *obj, unsigned int flush_domains)
		intel_fb_obj_flush(obj,
				   fb_write_origin(obj, I915_GEM_DOMAIN_GTT));

		list_for_each_entry(vma, &obj->vma_list, obj_link) {
			if (!i915_vma_is_ggtt(vma))
				break;

		for_each_ggtt_vma(vma, obj) {
			if (vma->iomap)
				continue;

@@ -1569,10 +1566,7 @@ static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)

	GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));

	list_for_each_entry(vma, &obj->vma_list, obj_link) {
		if (!i915_vma_is_ggtt(vma))
			break;

	for_each_ggtt_vma(vma, obj) {
		if (i915_vma_is_active(vma))
			continue;

@@ -2051,13 +2045,9 @@ static void __i915_gem_object_release_mmap(struct drm_i915_gem_object *obj)
	drm_vma_node_unmap(&obj->base.vma_node,
			   obj->base.dev->anon_inode->i_mapping);

	list_for_each_entry(vma, &obj->vma_list, obj_link) {
		if (!i915_vma_is_ggtt(vma))
			break;

	for_each_ggtt_vma(vma, obj)
		i915_vma_unset_userfault(vma);
}
}

/**
 * i915_gem_release_mmap - remove physical page mappings
@@ -3822,7 +3812,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
			 * dropped the fence as all snoopable access is
			 * supposed to be linear.
			 */
			list_for_each_entry(vma, &obj->vma_list, obj_link) {
			for_each_ggtt_vma(vma, obj) {
				ret = i915_vma_put_fence(vma);
				if (ret)
					return ret;
+1 −4
Original line number Diff line number Diff line
@@ -3620,10 +3620,7 @@ void i915_gem_restore_gtt_mappings(struct drm_i915_private *dev_priv)
		bool ggtt_bound = false;
		struct i915_vma *vma;

		list_for_each_entry(vma, &obj->vma_list, obj_link) {
			if (vma->vm != &ggtt->base)
				continue;

		for_each_ggtt_vma(vma, obj) {
			if (!i915_vma_unbind(vma))
				continue;

+2 −8
Original line number Diff line number Diff line
@@ -205,10 +205,7 @@ i915_gem_object_fence_prepare(struct drm_i915_gem_object *obj,
	if (tiling_mode == I915_TILING_NONE)
		return 0;

	list_for_each_entry(vma, &obj->vma_list, obj_link) {
		if (!i915_vma_is_ggtt(vma))
			break;

	for_each_ggtt_vma(vma, obj) {
		if (i915_vma_fence_prepare(vma, tiling_mode, stride))
			continue;

@@ -285,10 +282,7 @@ i915_gem_object_set_tiling(struct drm_i915_gem_object *obj,
	}
	mutex_unlock(&obj->mm.lock);

	list_for_each_entry(vma, &obj->vma_list, obj_link) {
		if (!i915_vma_is_ggtt(vma))
			break;

	for_each_ggtt_vma(vma, obj) {
		vma->fence_size =
			i915_gem_fence_size(i915, vma->size, tiling, stride);
		vma->fence_alignment =
+6 −0
Original line number Diff line number Diff line
@@ -142,6 +142,12 @@ vma_create(struct drm_i915_gem_object *obj,
								i915_gem_object_get_stride(obj));
		GEM_BUG_ON(!is_power_of_2(vma->fence_alignment));

		/*
		 * We put the GGTT vma at the start of the vma-list, followed
		 * by the ppGGTT vma. This allows us to break early when
		 * iterating over only the GGTT vma for an object, see
		 * for_each_ggtt_vma()
		 */
		vma->flags |= I915_VMA_GGTT;
		list_add(&vma->obj_link, &obj->vma_list);
	} else {
Loading