[PATCH 2/6] drm/i915: encapsulate conversion of i915 object to DRM object

Dave Gordon david.s.gordon at intel.com
Wed Jul 20 11:10:54 UTC 2016


Following on from the conversion of to_intel_bo() to a type-safe inline
function, this patch introduces the reverse conversion, to_gem_object().
This allows a degree of abstraction when i915 driver objects are to be
passed to DRM/GEM functions such as drm_gem_handle_create(), while the
implementation as an inline function (which in fact returns its argument
unchanged) means that this addds no overhead.

Coccinelle:

@obj_base@
    idexpression struct drm_i915_gem_object *OBJ;
@@
    {
      <...
-     &OBJ->base
+     to_gem_object(OBJ)
      ...>
    }

Signed-off-by: Dave Gordon <david.s.gordon at intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h            | 12 ++++++++++++
 drivers/gpu/drm/i915/i915_gem.c            | 10 +++++-----
 drivers/gpu/drm/i915/i915_gem_execbuffer.c |  2 +-
 drivers/gpu/drm/i915/i915_gem_stolen.c     |  2 +-
 drivers/gpu/drm/i915/i915_gem_userptr.c    |  4 ++--
 drivers/gpu/drm/i915/intel_display.c       |  2 +-
 6 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index dab0594..98d5184 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2287,6 +2287,18 @@ struct drm_i915_gem_object {
 		} userptr;
 	};
 };
+
+/*
+ * These functions insist that 'base' be the first member in the
+ * structure above; then if i915_obj is NULL, so is &i915->base,
+ * allowing us to avoid 'nearly-NULL' pointers
+ */
+static inline struct drm_gem_object *
+to_gem_object(struct drm_i915_gem_object *i915_obj)
+{
+	BUILD_BUG_ON(offsetof(struct drm_i915_gem_object, base));
+	return &i915_obj->base;
+}
 static inline struct drm_i915_gem_object *
 to_intel_bo(struct drm_gem_object *gem_obj)
 {
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 2574569..ad09032 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -408,7 +408,7 @@ void i915_gem_object_free(struct drm_i915_gem_object *obj)
 	if (IS_ERR(obj))
 		return PTR_ERR(obj);
 
-	ret = drm_gem_handle_create(file, &obj->base, &handle);
+	ret = drm_gem_handle_create(file, to_gem_object(obj), &handle);
 	/* drop reference from allocate - handle holds it now */
 	drm_gem_object_unreference_unlocked(&obj->base);
 	if (ret)
@@ -1952,7 +1952,7 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
 
 static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
 {
-	drm_gem_free_mmap_offset(&obj->base);
+	drm_gem_free_mmap_offset(to_gem_object(obj));
 }
 
 int
@@ -4165,7 +4165,7 @@ struct drm_i915_gem_object *i915_gem_object_create(struct drm_device *dev,
 	if (obj == NULL)
 		return ERR_PTR(-ENOMEM);
 
-	ret = drm_gem_object_init(dev, &obj->base, size);
+	ret = drm_gem_object_init(dev, to_gem_object(obj), size);
 	if (ret)
 		goto fail;
 
@@ -4284,12 +4284,12 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
 	BUG_ON(obj->pages);
 
 	if (obj->base.import_attach)
-		drm_prime_gem_destroy(&obj->base, NULL);
+		drm_prime_gem_destroy(to_gem_object(obj), NULL);
 
 	if (obj->ops->release)
 		obj->ops->release(obj);
 
-	drm_gem_object_release(&obj->base);
+	drm_gem_object_release(to_gem_object(obj));
 	i915_gem_info_remove_obj(dev_priv, obj->base.size);
 
 	kfree(obj->bit_17);
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index f6724ae..1f72d80 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -446,7 +446,7 @@ static inline uint64_t gen8_noncanonical_addr(uint64_t address)
 	if (unlikely(target_vma == NULL))
 		return -ENOENT;
 	target_i915_obj = target_vma->obj;
-	target_obj = &target_vma->obj->base;
+	target_obj = to_gem_object(target_i915_obj);
 
 	target_offset = gen8_canonical_addr(target_vma->node.start);
 
diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
index 66be299a1..ca96bcf 100644
--- a/drivers/gpu/drm/i915/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
@@ -574,7 +574,7 @@ static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj)
 	if (obj == NULL)
 		return NULL;
 
-	drm_gem_private_object_init(dev, &obj->base, stolen->size);
+	drm_gem_private_object_init(dev, to_gem_object(obj), stolen->size);
 	i915_gem_object_init(obj, &i915_gem_object_stolen_ops);
 
 	obj->pages = i915_pages_create_for_stolen(dev,
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
index 2314c88..3260614 100644
--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
@@ -826,7 +826,7 @@ struct get_pages_work {
 	if (obj == NULL)
 		return -ENOMEM;
 
-	drm_gem_private_object_init(dev, &obj->base, args->user_size);
+	drm_gem_private_object_init(dev, to_gem_object(obj), args->user_size);
 	i915_gem_object_init(obj, &i915_gem_userptr_ops);
 	obj->cache_level = I915_CACHE_LLC;
 	obj->base.write_domain = I915_GEM_DOMAIN_CPU;
@@ -843,7 +843,7 @@ struct get_pages_work {
 	if (ret == 0)
 		ret = i915_gem_userptr_init__mmu_notifier(obj, args->flags);
 	if (ret == 0)
-		ret = drm_gem_handle_create(file, &obj->base, &handle);
+		ret = drm_gem_handle_create(file, to_gem_object(obj), &handle);
 
 	/* drop reference from allocate - handle holds it now */
 	drm_gem_object_unreference_unlocked(&obj->base);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 5a5ef22..52f9858 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14870,7 +14870,7 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
 		return -EINVAL;
 	}
 
-	return drm_gem_handle_create(file, &obj->base, handle);
+	return drm_gem_handle_create(file, to_gem_object(obj), handle);
 }
 
 static int intel_user_framebuffer_dirty(struct drm_framebuffer *fb,
-- 
1.9.1



More information about the Intel-gfx-trybot mailing list