[PATCH 3/6] drm/i915: introduce & use i915_gem_object_reference()

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


Most driver code that manipulates objects of type 'drm_i915_gem_object'
doesn't really need to know about the parent class 'drm_gem_object',
a.k.a. the "base" member.

However many of these functions *do* need to manipulate the object's
refcount, which currently requires them to know that the refcount
happens to be part of the base class, thus requiring:
    drm_gem_object_reference(&obj->base);

To encourage a little more abstraction and remove the necessity of
knowing an object's parentage, this patch introduces the function
i915_gem_object_reference() with an i915 object as argument, so the
caller can ignore the details of the class hierarchy.  Conversion
between the derived class and the parent is done using type-safe
inline functions, so there is no overhead in this conversion.

Then we convert the callers using Coccinelle:

@i915_reference@
    idexpression struct drm_i915_gem_object *OBJ;
@@
    {
      ...
-   drm_gem_object_reference(&OBJ->base)
+   i915_gem_object_reference(OBJ)
      ...
    }

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

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 98d5184..4774ec9 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2305,6 +2305,8 @@ to_intel_bo(struct drm_gem_object *gem_obj)
 	BUILD_BUG_ON(offsetof(struct drm_i915_gem_object, base));
 	return container_of(gem_obj, struct drm_i915_gem_object, base);
 }
+#define	i915_gem_object_reference(i915_obj)		\
+		drm_gem_object_reference(to_gem_object(i915_obj))
 
 static inline bool
 i915_gem_object_has_struct_page(const struct drm_i915_gem_object *obj)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index ad09032..ba245b0 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -289,7 +289,7 @@ int i915_mutex_lock_interruptible(struct drm_device *dev)
 	struct i915_vma *vma, *next;
 	int ret;
 
-	drm_gem_object_reference(&obj->base);
+	i915_gem_object_reference(obj);
 	list_for_each_entry_safe(vma, next, &obj->vma_list, obj_link)
 		if (i915_vma_unbind(vma))
 			break;
@@ -2361,7 +2361,7 @@ void i915_vma_move_to_active(struct i915_vma *vma,
 
 	/* Add a reference if we're newly entering the active list. */
 	if (obj->active == 0)
-		drm_gem_object_reference(&obj->base);
+		i915_gem_object_reference(obj);
 	obj->active |= intel_engine_flag(engine);
 
 	list_move_tail(&obj->engine_list[engine->id], &engine->active_list);
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index b1194c7..c1c695b 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -183,7 +183,7 @@
 				       exec_list);
 		if (drm_mm_scan_remove_block(&vma->node)) {
 			list_move(&vma->exec_list, &eviction_list);
-			drm_gem_object_reference(&vma->obj->base);
+			i915_gem_object_reference(vma->obj);
 			continue;
 		}
 		list_del_init(&vma->exec_list);
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 1f72d80..7f83280 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -123,7 +123,7 @@ struct eb_vmas {
 			goto err;
 		}
 
-		drm_gem_object_reference(&obj->base);
+		i915_gem_object_reference(obj);
 		list_add_tail(&obj->obj_exec_link, &objects);
 	}
 	spin_unlock(&file->table_lock);
@@ -1236,7 +1236,7 @@ static bool only_mappable_for_reloc(unsigned int flags)
 	vma = i915_gem_obj_to_ggtt(shadow_batch_obj);
 	vma->exec_entry = shadow_exec_entry;
 	vma->exec_entry->flags = __EXEC_OBJECT_HAS_PIN;
-	drm_gem_object_reference(&shadow_batch_obj->base);
+	i915_gem_object_reference(shadow_batch_obj);
 	list_add_tail(&vma->exec_list, &eb->vmas);
 
 	shadow_batch_obj->base.pending_read_domains = I915_GEM_DOMAIN_COMMAND;
diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
index 6f10b42..0668d4c 100644
--- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
+++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
@@ -190,7 +190,7 @@ static bool can_release_pages(struct drm_i915_gem_object *obj)
 			if (!can_release_pages(obj))
 				continue;
 
-			drm_gem_object_reference(&obj->base);
+			i915_gem_object_reference(obj);
 
 			/* For the unbound phase, this should be a no-op! */
 			list_for_each_entry_safe(vma, v,
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
index 3260614..3532aa6 100644
--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
@@ -623,7 +623,7 @@ struct get_pages_work {
 	obj->userptr.workers++;
 
 	work->obj = obj;
-	drm_gem_object_reference(&obj->base);
+	i915_gem_object_reference(obj);
 
 	work->task = current;
 	get_task_struct(work->task);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 52f9858..37b2b62 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -11650,7 +11650,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
 
 	/* Reference the objects for the scheduled work. */
 	drm_framebuffer_reference(work->old_fb);
-	drm_gem_object_reference(&obj->base);
+	i915_gem_object_reference(obj);
 
 	crtc->primary->fb = fb;
 	update_state_fb(crtc->primary);
-- 
1.9.1



More information about the Intel-gfx-trybot mailing list