[PATCH 27/27] debug delayed free objects

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Wed Sep 22 10:48:47 UTC 2021


Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_object.c | 26 ++++++++++++++--------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index dc0d2da297a0..99d1656a7822 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -256,6 +256,19 @@ void __i915_gem_free_object(struct drm_i915_gem_object *obj)
 		i915_vm_resv_put(obj->shares_resv_from);
 }
 
+static void _i915_gem_free_object(struct drm_i915_gem_object *obj)
+{
+	if (obj->ops->delayed_free) {
+		obj->ops->delayed_free(obj);
+		return;
+	}
+
+	__i915_gem_free_object(obj);
+
+	/* But keep the pointer alive for RCU-protected lookups */
+	call_rcu(&obj->rcu, __i915_gem_free_object_rcu);
+}
+
 static void __i915_gem_free_objects(struct drm_i915_private *i915,
 				    struct llist_node *freed)
 {
@@ -263,14 +276,7 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
 
 	llist_for_each_entry_safe(obj, on, freed, freed) {
 		might_sleep();
-		if (obj->ops->delayed_free) {
-			obj->ops->delayed_free(obj);
-			continue;
-		}
-		__i915_gem_free_object(obj);
-
-		/* But keep the pointer alive for RCU-protected lookups */
-		call_rcu(&obj->rcu, __i915_gem_free_object_rcu);
+		_i915_gem_free_object(obj);
 		cond_resched();
 	}
 }
@@ -326,7 +332,9 @@ static void i915_gem_free_object(struct drm_gem_object *gem_obj)
 	 * crude but effective memory throttling.
 	 */
 
-	if (llist_add(&obj->freed, &i915->mm.free_list))
+	if (!in_atomic() && !irqs_disabled())
+		_i915_gem_free_object(obj);
+	else if (llist_add(&obj->freed, &i915->mm.free_list))
 		queue_work(i915->wq, &i915->mm.free_work);
 }
 
-- 
2.33.0



More information about the Intel-gfx-trybot mailing list