Skip to content

Instantly share code, notes, and snippets.

@mthierry
Created April 29, 2015 13:43
Show Gist options
  • Save mthierry/ca1cc63c54b692e49106 to your computer and use it in GitHub Desktop.
Save mthierry/ca1cc63c54b692e49106 to your computer and use it in GitHub Desktop.
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 6adee4c..4956f03 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -234,6 +234,7 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
}
mutex_unlock(&obj->dev->object_name_lock);
+ trace_printk("handle_unref_unlocked, obj=%p\n", obj);
drm_gem_object_unreference_unlocked(obj);
}
@@ -280,6 +281,8 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
if (dev->driver->gem_close_object)
dev->driver->gem_close_object(obj, filp);
+
+ trace_printk("handle_delete, handle=0x%x, obj=%p\n", handle, obj);
drm_gem_object_handle_unreference_unlocked(obj);
return 0;
@@ -582,8 +585,9 @@ drm_gem_close_ioctl(struct drm_device *dev, void *data,
if (!(dev->driver->driver_features & DRIVER_GEM))
return -ENODEV;
+ trace_printk("s gem_close_ioctl, handle=0x%x\n", args->handle);
ret = drm_gem_handle_delete(file_priv, args->handle);
-
+ trace_printk("e gem_close_ioctl, handle=0x%x\n", args->handle);
return ret;
}
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index d8a5ce7..14ff618 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -5234,6 +5234,7 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
intel_runtime_pm_get(dev_priv);
trace_i915_gem_object_destroy(obj);
+ trace_printk("i915 free, obj=%p\n", gem_obj);
kfree(obj->userdata_blk);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index a270ca6..0557828 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1561,27 +1561,50 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
static inline void
drm_gem_object_reference(struct drm_gem_object *obj)
{
+ trace_printk("obj_ref s, obj=%p refcount=%d\n", obj, atomic_read(&obj->refcount.refcount));
kref_get(&obj->refcount);
+ trace_printk("obj_ref e, obj=%p refcount=%d\n", obj, atomic_read(&obj->refcount.refcount));
}
static inline void
drm_gem_object_unreference(struct drm_gem_object *obj)
{
- if (obj != NULL)
+ if (obj != NULL) {
+ trace_printk("obj_unref, obj=%p refcount=%d\n", obj, atomic_read(&obj->refcount.refcount));
kref_put(&obj->refcount, drm_gem_object_free);
+ }
}
static inline void
drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
{
+#if 1
+ trace_printk("obj_unref_unlocked 1, obj=%p refcount=%d\n", obj, atomic_read(&obj->refcount.refcount));
+
if (obj && !atomic_add_unless(&obj->refcount.refcount, -1, 1)) {
struct drm_device *dev = obj->dev;
+ trace_printk("obj_unref_unlocked 2, obj=%p refcount=%d\n", obj, atomic_read(&obj->refcount.refcount));
mutex_lock(&dev->struct_mutex);
- if (likely(atomic_dec_and_test(&obj->refcount.refcount)))
+ if (likely(atomic_dec_and_test(&obj->refcount.refcount))) {
+ trace_printk("obj_unref_unlocked 3, obj=%p, refcount=%d\n", obj, atomic_read(&obj->refcount.refcount));
drm_gem_object_free(&obj->refcount);
+ }
mutex_unlock(&dev->struct_mutex);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment