[PATCH 03/27] kref

Matthew Auld matthew.auld at intel.com
Tue Oct 1 15:18:53 UTC 2019


---
 drivers/gpu/drm/i915/gem/i915_gem_region.c    |  3 +-
 .../gpu/drm/i915/gem/selftests/huge_pages.c   | 12 +++-----
 drivers/gpu/drm/i915/intel_memory_region.c    | 29 +++++++++++++++----
 drivers/gpu/drm/i915/intel_memory_region.h    |  9 ++++--
 .../drm/i915/selftests/intel_memory_region.c  |  3 +-
 5 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_region.c b/drivers/gpu/drm/i915/gem/i915_gem_region.c
index 5c3bfc121921..5fc6e4540f82 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_region.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_region.c
@@ -101,11 +101,12 @@ void i915_gem_object_init_memory_region(struct drm_i915_gem_object *obj,
 					struct intel_memory_region *mem)
 {
 	INIT_LIST_HEAD(&obj->mm.blocks);
-	obj->mm.region = mem;
+	obj->mm.region = intel_memory_region_get(mem);
 }
 
 void i915_gem_object_release_memory_region(struct drm_i915_gem_object *obj)
 {
+	intel_memory_region_put(obj->mm.region);
 }
 
 struct drm_i915_gem_object *
diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
index 4e1805aaeb99..514ed5d74904 100644
--- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
@@ -474,7 +474,7 @@ static int igt_mock_memory_region_huge_pages(void *arg)
 		obj = i915_gem_object_create_region(mem, page_size, 0);
 		if (IS_ERR(obj)) {
 			err = PTR_ERR(obj);
-			goto out_destroy_device;
+			goto out_region;
 		}
 
 		vma = i915_vma_instance(obj, &ppgtt->vm, NULL);
@@ -507,7 +507,7 @@ static int igt_mock_memory_region_huge_pages(void *arg)
 		i915_gem_object_put(obj);
 	}
 
-	goto out_destroy_device;
+	goto out_region;
 
 out_unpin:
 	i915_vma_unpin(vma);
@@ -515,12 +515,8 @@ static int igt_mock_memory_region_huge_pages(void *arg)
 	i915_vma_close(vma);
 out_put:
 	i915_gem_object_put(obj);
-out_destroy_device:
-	mutex_unlock(&i915->drm.struct_mutex);
-	i915_gem_drain_freed_objects(i915);
-	mutex_lock(&i915->drm.struct_mutex);
-	intel_memory_region_destroy(mem);
-
+out_region:
+	intel_memory_region_put(mem);
 	return err;
 }
 
diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c
index c8d1722a1894..1b24f5af8ea2 100644
--- a/drivers/gpu/drm/i915/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/intel_memory_region.c
@@ -149,18 +149,23 @@ intel_memory_region_create(struct drm_i915_private *i915,
 
 	if (ops->init) {
 		err = ops->init(mem);
-		if (err) {
-			kfree(mem);
-			mem = ERR_PTR(err);
-		}
+		if (err)
+			goto err_free;
 	}
 
+	kref_init(&mem->kref);
 	return mem;
+
+err_free:
+	kfree(mem);
+	return ERR_PTR(err);
 }
 
-void
-intel_memory_region_destroy(struct intel_memory_region *mem)
+void __intel_memory_region_destroy(struct kref *kref)
 {
+	struct intel_memory_region *mem =
+		container_of(kref, typeof(*mem), kref);
+
 	if (mem->ops->release)
 		mem->ops->release(mem);
 
@@ -168,6 +173,18 @@ intel_memory_region_destroy(struct intel_memory_region *mem)
 	kfree(mem);
 }
 
+struct intel_memory_region *
+intel_memory_region_get(struct intel_memory_region *mem)
+{
+	kref_get(&mem->kref);
+	return mem;
+}
+
+void intel_memory_region_put(struct intel_memory_region *mem)
+{
+	kref_put(&mem->kref, __intel_memory_region_destroy);
+}
+
 #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
 #include "selftests/intel_memory_region.c"
 #include "selftests/mock_region.c"
diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h
index 6f4cb256dd98..eb304a3ed6ad 100644
--- a/drivers/gpu/drm/i915/intel_memory_region.h
+++ b/drivers/gpu/drm/i915/intel_memory_region.h
@@ -6,6 +6,7 @@
 #ifndef __INTEL_MEMORY_REGION_H__
 #define __INTEL_MEMORY_REGION_H__
 
+#include <linux/kref.h>
 #include <linux/ioport.h>
 #include <linux/mutex.h>
 #include <linux/io-mapping.h>
@@ -42,6 +43,8 @@ struct intel_memory_region {
 	struct i915_buddy_mm mm;
 	struct mutex mm_lock;
 
+	struct kref kref;
+
 	resource_size_t io_start;
 	resource_size_t min_page_size;
 
@@ -72,7 +75,9 @@ intel_memory_region_create(struct drm_i915_private *i915,
 			   resource_size_t min_page_size,
 			   resource_size_t io_start,
 			   const struct intel_memory_region_ops *ops);
-void
-intel_memory_region_destroy(struct intel_memory_region *mem);
+
+struct intel_memory_region *
+intel_memory_region_get(struct intel_memory_region *mem);
+void intel_memory_region_put(struct intel_memory_region *mem);
 
 #endif
diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
index 2d77b80d712f..42dad6067c47 100644
--- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
@@ -111,8 +111,7 @@ int intel_memory_region_mock_selftests(void)
 	err = i915_subtests(tests, mem);
 	mutex_unlock(&i915->drm.struct_mutex);
 
-	i915_gem_drain_freed_objects(i915);
-	intel_memory_region_destroy(mem);
+	intel_memory_region_put(mem);
 out_unref:
 	drm_dev_put(&i915->drm);
 	return err;
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list