From d027d11cb7cefd100f3922b5e4e8627f30c1c831 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 20 Jul 2013 17:38:12 +0100 Subject: [PATCH] drm/i915: Replace racy object bookkeeping Now that we track objects for their entire lifetime in a list, we can move the cost of the bookkeeping to the infrequent query of i915_gem_objects. This also removes the race where we would increment the global object count and size without holding any locks. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67121 Signed-off-by: Chris Wilson --- drivers/gpu/drm/i915/i915_debugfs.c | 9 ++++++--- drivers/gpu/drm/i915/i915_drv.h | 4 ---- drivers/gpu/drm/i915/i915_gem.c | 19 ------------------- 3 files changed, 6 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index cc3e74a..baefd8b 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -228,9 +228,12 @@ static int i915_gem_object_info(struct seq_file *m, void *data) if (ret) return ret; - seq_printf(m, "%u objects, %zu bytes\n", - dev_priv->mm.object_count, - dev_priv->mm.object_memory); + size = count = 0; + list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) + size += obj->base.size, ++count; + list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) + size += obj->base.size, ++count; + seq_printf(m, "%u objects, %zu bytes\n", count, size); size = count = mappable_size = mappable_count = 0; count_objects(&dev_priv->mm.bound_list, global_list); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 2cfa12c..54d5627 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -932,10 +932,6 @@ struct i915_gem_mm { /* storage for physical objects */ struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; - - /* accounting, useful for userland debugging */ - size_t object_memory; - u32 object_count; }; struct drm_i915_error_state_buf { diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 321a187..2283765 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -71,21 +71,6 @@ static inline void i915_gem_object_fence_lost(struct drm_i915_gem_object *obj) obj->fence_reg = I915_FENCE_REG_NONE; } -/* some bookkeeping */ -static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv, - size_t size) -{ - dev_priv->mm.object_count++; - dev_priv->mm.object_memory += size; -} - -static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv, - size_t size) -{ - dev_priv->mm.object_count--; - dev_priv->mm.object_memory -= size; -} - static int i915_gem_wait_for_error(struct i915_gpu_error *error) { @@ -221,7 +206,6 @@ i915_gem_create(struct drm_file *file, ret = drm_gem_handle_create(file, &obj->base, &handle); if (ret) { drm_gem_object_release(&obj->base); - i915_gem_info_remove_obj(dev->dev_private, obj->base.size); i915_gem_object_free(obj); return ret; } @@ -3883,8 +3867,6 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj, obj->madv = I915_MADV_WILLNEED; /* Avoid an unnecessary call to unbind on the first bind. */ obj->map_and_fenceable = true; - - i915_gem_info_add_obj(obj->base.dev->dev_private, obj->base.size); } static const struct drm_i915_gem_object_ops i915_gem_object_ops = { @@ -3990,7 +3972,6 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj) drm_prime_gem_destroy(&obj->base, NULL); drm_gem_object_release(&obj->base); - i915_gem_info_remove_obj(dev_priv, obj->base.size); kfree(obj->bit_17); i915_gem_object_free(obj); -- 1.8.3.2