[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