Commit c20e8355 authored by Daniel Vetter's avatar Daniel Vetter

drm/i915: fix the racy object accounting

Just use a spinlock to protect them.

v2: Rebase onto the new object create refcount fix patch.

v3: Don't kill dev_priv->mm.object_memory as requested by Chris and
hence just use a spinlock instead of atomic_t.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67287Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent ed71f1b4
...@@ -1478,6 +1478,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -1478,6 +1478,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
spin_lock_init(&dev_priv->gpu_error.lock); spin_lock_init(&dev_priv->gpu_error.lock);
spin_lock_init(&dev_priv->backlight.lock); spin_lock_init(&dev_priv->backlight.lock);
spin_lock_init(&dev_priv->uncore.lock); spin_lock_init(&dev_priv->uncore.lock);
spin_lock_init(&dev_priv->mm.object_stat_lock);
mutex_init(&dev_priv->dpio_lock); mutex_init(&dev_priv->dpio_lock);
mutex_init(&dev_priv->rps.hw_lock); mutex_init(&dev_priv->rps.hw_lock);
mutex_init(&dev_priv->modeset_restore_lock); mutex_init(&dev_priv->modeset_restore_lock);
......
...@@ -935,6 +935,7 @@ struct i915_gem_mm { ...@@ -935,6 +935,7 @@ struct i915_gem_mm {
struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT];
/* accounting, useful for userland debugging */ /* accounting, useful for userland debugging */
spinlock_t object_stat_lock;
size_t object_memory; size_t object_memory;
u32 object_count; u32 object_count;
}; };
......
...@@ -75,15 +75,19 @@ static inline void i915_gem_object_fence_lost(struct drm_i915_gem_object *obj) ...@@ -75,15 +75,19 @@ static inline void i915_gem_object_fence_lost(struct drm_i915_gem_object *obj)
static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv, static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv,
size_t size) size_t size)
{ {
spin_lock(&dev_priv->mm.object_stat_lock);
dev_priv->mm.object_count++; dev_priv->mm.object_count++;
dev_priv->mm.object_memory += size; dev_priv->mm.object_memory += size;
spin_unlock(&dev_priv->mm.object_stat_lock);
} }
static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv, static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv,
size_t size) size_t size)
{ {
spin_lock(&dev_priv->mm.object_stat_lock);
dev_priv->mm.object_count--; dev_priv->mm.object_count--;
dev_priv->mm.object_memory -= size; dev_priv->mm.object_memory -= size;
spin_unlock(&dev_priv->mm.object_stat_lock);
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment