[Intel-gfx] [PATCH 26/39] drm/i915: Consolidate the bound/unbound vma lists into one

Chris Wilson chris at chris-wilson.co.uk
Wed Jan 2 09:41:26 UTC 2019


Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_gem.c               |  4 +--
 drivers/gpu/drm/i915/i915_gem_evict.c         | 12 ++++++---
 drivers/gpu/drm/i915/i915_gem_gtt.c           | 27 ++++++-------------
 drivers/gpu/drm/i915/i915_gem_gtt.h           | 10 +------
 drivers/gpu/drm/i915/i915_gem_shrinker.c      |  3 +--
 drivers/gpu/drm/i915/i915_gem_stolen.c        |  4 ---
 drivers/gpu/drm/i915/i915_gpu_error.c         | 11 ++++----
 drivers/gpu/drm/i915/i915_vma.c               |  7 +----
 .../gpu/drm/i915/selftests/i915_gem_evict.c   | 11 +++-----
 drivers/gpu/drm/i915/selftests/i915_gem_gtt.c |  4 ---
 10 files changed, 32 insertions(+), 61 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 66445e34c93c..a954e15c0315 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -254,7 +254,7 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
 	mutex_lock(&ggtt->vm.mutex);
 
 	pinned = ggtt->vm.reserved;
-	list_for_each_entry(vma, &ggtt->vm.bound_list, vm_link)
+	list_for_each_entry(vma, &ggtt->vm.vma_list, vm_link)
 		if (i915_vma_is_pinned(vma))
 			pinned += vma->node.size;
 
@@ -1692,7 +1692,7 @@ static void i915_gem_object_bump_inactive_ggtt(struct drm_i915_gem_object *obj)
 		if (!drm_mm_node_allocated(&vma->node))
 			continue;
 
-		list_move_tail(&vma->vm_link, &vma->vm->bound_list);
+		list_move_tail(&vma->vm_link, &i915->ggtt.vm.vma_list);
 	}
 	mutex_unlock(&i915->ggtt.vm.mutex);
 
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index b7c2a396a63f..8ccde5761c2c 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -170,7 +170,10 @@ i915_gem_evict_something(struct i915_address_space *vm,
 search_again:
 	active = NULL;
 	INIT_LIST_HEAD(&eviction_list);
-	list_for_each_entry_safe(vma, next, &vm->bound_list, vm_link) {
+	list_for_each_entry_safe(vma, next, &vm->vma_list, vm_link) {
+		if (!drm_mm_node_allocated(&vma->node))
+			continue;
+
 		if (i915_vma_is_active(vma)) {
 			if (vma == active) {
 				if (flags & PIN_NONBLOCK)
@@ -183,7 +186,7 @@ i915_gem_evict_something(struct i915_address_space *vm,
 				if (!active)
 					active = vma;
 
-				list_move_tail(&vma->vm_link, &vm->bound_list);
+				list_move_tail(&vma->vm_link, &vm->vma_list);
 				continue;
 			}
 		}
@@ -419,7 +422,10 @@ int i915_gem_evict_vm(struct i915_address_space *vm)
 
 	INIT_LIST_HEAD(&eviction_list);
 	mutex_lock(&vm->mutex);
-	list_for_each_entry(vma, &vm->bound_list, vm_link) {
+	list_for_each_entry(vma, &vm->vma_list, vm_link) {
+		if (!drm_mm_node_allocated(&vma->node))
+			continue;
+
 		if (i915_vma_is_pinned(vma))
 			continue;
 
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 7ae10fbb2ee0..17b752f9a1e6 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -492,8 +492,7 @@ static void i915_address_space_init(struct i915_address_space *vm, int subclass)
 
 	stash_init(&vm->free_pages);
 
-	INIT_LIST_HEAD(&vm->unbound_list);
-	INIT_LIST_HEAD(&vm->bound_list);
+	INIT_LIST_HEAD(&vm->vma_list);
 }
 
 static void i915_address_space_fini(struct i915_address_space *vm)
@@ -1934,7 +1933,7 @@ static struct i915_vma *pd_vma_create(struct gen6_hw_ppgtt *ppgtt, int size)
 	INIT_LIST_HEAD(&vma->obj_link);
 
 	mutex_lock(&vma->vm->mutex);
-	list_add(&vma->vm_link, &vma->vm->unbound_list);
+	list_add(&vma->vm_link, &vma->vm->vma_list);
 	mutex_unlock(&vma->vm->mutex);
 
 	return vma;
@@ -2113,19 +2112,12 @@ void i915_ppgtt_close(struct i915_address_space *vm)
 
 static void ppgtt_destroy_vma(struct i915_address_space *vm)
 {
-	struct list_head *phases[] = {
-		&vm->bound_list,
-		&vm->unbound_list,
-		NULL,
-	}, **phase;
+	struct i915_vma *vma, *vn;
 
 	vm->closed = true;
-	for (phase = phases; *phase; phase++) {
-		struct i915_vma *vma, *vn;
-
-		list_for_each_entry_safe(vma, vn, *phase, vm_link)
-			i915_vma_destroy(vma);
-	}
+	list_for_each_entry_safe(vma, vn, &vm->vma_list, vm_link)
+		i915_vma_destroy(vma);
+	GEM_BUG_ON(!list_empty(&vm->vma_list));
 }
 
 void i915_ppgtt_release(struct kref *kref)
@@ -2137,9 +2129,6 @@ void i915_ppgtt_release(struct kref *kref)
 
 	ppgtt_destroy_vma(&ppgtt->vm);
 
-	GEM_BUG_ON(!list_empty(&ppgtt->vm.bound_list));
-	GEM_BUG_ON(!list_empty(&ppgtt->vm.unbound_list));
-
 	ppgtt->vm.cleanup(&ppgtt->vm);
 	i915_address_space_fini(&ppgtt->vm);
 	kfree(ppgtt);
@@ -2802,7 +2791,7 @@ void i915_ggtt_cleanup_hw(struct drm_i915_private *dev_priv)
 	mutex_lock(&dev_priv->drm.struct_mutex);
 	i915_gem_fini_aliasing_ppgtt(dev_priv);
 
-	list_for_each_entry_safe(vma, vn, &ggtt->vm.bound_list, vm_link)
+	list_for_each_entry_safe(vma, vn, &ggtt->vm.vma_list, vm_link)
 		WARN_ON(i915_vma_unbind(vma));
 
 	if (drm_mm_node_allocated(&ggtt->error_capture))
@@ -3514,7 +3503,7 @@ void i915_gem_restore_gtt_mappings(struct drm_i915_private *dev_priv)
 	ggtt->vm.closed = true; /* skip rewriting PTE on VMA unbind */
 
 	/* clflush objects bound into the GGTT and rebind them. */
-	list_for_each_entry_safe(vma, vn, &ggtt->vm.bound_list, vm_link) {
+	list_for_each_entry_safe(vma, vn, &ggtt->vm.vma_list, vm_link) {
 		struct drm_i915_gem_object *obj = vma->obj;
 
 		if (!(vma->flags & I915_VMA_GLOBAL_BIND))
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index bd679c8c56dd..ac11f2bce2d5 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -298,15 +298,7 @@ struct i915_address_space {
 	struct i915_page_directory *scratch_pd;
 	struct i915_page_directory_pointer *scratch_pdp; /* GEN8+ & 48b PPGTT */
 
-	/**
-	 * List of vma currently bound.
-	 */
-	struct list_head bound_list;
-
-	/**
-	 * List of vma that are not unbound.
-	 */
-	struct list_head unbound_list;
+	struct list_head vma_list;
 
 	struct pagestash free_pages;
 
diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
index 9d04c26c04f9..f4bc72d4f44f 100644
--- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
+++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
@@ -491,8 +491,7 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
 
 	/* We also want to clear any cached iomaps as they wrap vmap */
 	mutex_lock(&i915->ggtt.vm.mutex);
-	list_for_each_entry_safe(vma, next,
-				 &i915->ggtt.vm.bound_list, vm_link) {
+	list_for_each_entry_safe(vma, next, &i915->ggtt.vm.vma_list, vm_link) {
 		unsigned long count = vma->node.size >> PAGE_SHIFT;
 
 		if (!vma->iomap || i915_vma_is_active(vma))
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
index 21de3a5e9910..7c8725f12cef 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -703,10 +703,6 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
 	vma->flags |= I915_VMA_GLOBAL_BIND;
 	__i915_vma_set_map_and_fenceable(vma);
 
-	mutex_lock(&ggtt->vm.mutex);
-	list_move_tail(&vma->vm_link, &ggtt->vm.bound_list);
-	mutex_unlock(&ggtt->vm.mutex);
-
 	spin_lock(&dev_priv->mm.obj_lock);
 	list_move_tail(&obj->mm.link, &dev_priv->mm.bound_list);
 	obj->bind_count++;
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 61ae07993ae7..8cd7e444f38f 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -1609,7 +1609,7 @@ static void gem_capture_vm(struct i915_gpu_state *error,
 	int count;
 
 	count = 0;
-	list_for_each_entry(vma, &vm->bound_list, vm_link)
+	list_for_each_entry(vma, &vm->vma_list, vm_link)
 		if (i915_vma_is_active(vma))
 			count++;
 
@@ -1617,7 +1617,7 @@ static void gem_capture_vm(struct i915_gpu_state *error,
 	if (count)
 		active_bo = kcalloc(count, sizeof(*active_bo), GFP_ATOMIC);
 	if (active_bo)
-		count = capture_error_bo(active_bo, count, &vm->bound_list,
+		count = capture_error_bo(active_bo, count, &vm->vma_list,
 					 true, false);
 	else
 		count = 0;
@@ -1659,8 +1659,9 @@ static void capture_pinned_buffers(struct i915_gpu_state *error)
 	int count;
 
 	count = 0;
-	list_for_each_entry(vma, &vm->bound_list, vm_link)
-		count++;
+	list_for_each_entry(vma, &vm->vma_list, vm_link)
+		if (i915_vma_is_pinned(vma))
+			count++;
 
 	bo = NULL;
 	if (count)
@@ -1669,7 +1670,7 @@ static void capture_pinned_buffers(struct i915_gpu_state *error)
 		return;
 
 	error->pinned_bo_count =
-		capture_error_bo(bo, count, &vm->bound_list, false, true);
+		capture_error_bo(bo, count, &vm->vma_list, false, true);
 	error->pinned_bo = bo;
 }
 
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index dcbd0d345c72..ad76a3309830 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -215,7 +215,7 @@ vma_create(struct drm_i915_gem_object *obj,
 	rb_insert_color(&vma->obj_node, &obj->vma_tree);
 
 	mutex_lock(&vm->mutex);
-	list_add(&vma->vm_link, &vm->unbound_list);
+	list_add_tail(&vma->vm_link, &vm->vma_list);
 	mutex_unlock(&vm->mutex);
 
 	return vma;
@@ -659,10 +659,6 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
 	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
 	GEM_BUG_ON(!i915_gem_valid_gtt_space(vma, cache_level));
 
-	mutex_lock(&vma->vm->mutex);
-	list_move_tail(&vma->vm_link, &vma->vm->bound_list);
-	mutex_unlock(&vma->vm->mutex);
-
 	if (vma->obj) {
 		struct drm_i915_gem_object *obj = vma->obj;
 
@@ -696,7 +692,6 @@ i915_vma_remove(struct i915_vma *vma)
 
 	mutex_lock(&vma->vm->mutex);
 	drm_mm_remove_node(&vma->node);
-	list_move_tail(&vma->vm_link, &vma->vm->unbound_list);
 	mutex_unlock(&vma->vm->mutex);
 
 	/*
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
index eaefba7470f7..8750cfbf1486 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
@@ -57,11 +57,6 @@ static int populate_ggtt(struct drm_i915_private *i915)
 		return -EINVAL;
 	}
 
-	if (list_empty(&i915->ggtt.vm.bound_list)) {
-		pr_err("No objects on the GGTT inactive list!\n");
-		return -EINVAL;
-	}
-
 	return 0;
 }
 
@@ -71,8 +66,10 @@ static void unpin_ggtt(struct drm_i915_private *i915)
 	struct i915_vma *vma;
 
 	mutex_lock(&ggtt->vm.mutex);
-	list_for_each_entry(vma, &i915->ggtt.vm.bound_list, vm_link)
-		i915_vma_unpin(vma);
+	list_for_each_entry(vma, &i915->ggtt.vm.vma_list, vm_link) {
+		if (i915_vma_is_pinned(vma))
+			i915_vma_unpin(vma);
+	}
 	mutex_unlock(&ggtt->vm.mutex);
 }
 
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index 850f9eff6029..550cb72f1e2b 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -1237,10 +1237,6 @@ static void track_vma_bind(struct i915_vma *vma)
 	__i915_gem_object_pin_pages(obj);
 
 	vma->pages = obj->mm.pages;
-
-	mutex_lock(&vma->vm->mutex);
-	list_move_tail(&vma->vm_link, &vma->vm->bound_list);
-	mutex_unlock(&vma->vm->mutex);
 }
 
 static int exercise_mock(struct drm_i915_private *i915,
-- 
2.20.1



More information about the Intel-gfx mailing list