spin_lock_init(&dev->object_name_lock);
idr_init(&dev->object_name_idr);
atomic_set(&dev->object_count, 0);
+ atomic_set(&dev->object_memory, 0);
+ atomic_set(&dev->pin_count, 0);
+ atomic_set(&dev->pin_memory, 0);
+ atomic_set(&dev->gtt_count, 0);
+ atomic_set(&dev->gtt_memory, 0);
return 0;
}
return NULL;
}
atomic_inc(&dev->object_count);
+ atomic_add(obj->size, &dev->object_memory);
return obj;
}
EXPORT_SYMBOL(drm_gem_object_alloc);
fput(obj->filp);
atomic_dec(&dev->object_count);
+ atomic_sub(obj->size, &dev->object_memory);
kfree(obj);
}
EXPORT_SYMBOL(drm_gem_object_free);
*start = &buf[offset];
*eof = 0;
DRM_PROC_PRINT ("%d objects\n", atomic_read (&dev->object_count));
+ DRM_PROC_PRINT ("%d object bytes\n", atomic_read (&dev->object_memory));
+ DRM_PROC_PRINT ("%d pinned\n", atomic_read (&dev->pin_count));
+ DRM_PROC_PRINT ("%d pin bytes\n", atomic_read (&dev->pin_memory));
+ DRM_PROC_PRINT ("%d gtt bytes\n", atomic_read (&dev->gtt_memory));
if (len > request + offset)
return request;
*eof = 1;
static int
i915_gem_object_unbind(struct drm_gem_object *obj)
{
+ struct drm_device *dev = obj->dev;
struct drm_i915_gem_object *obj_priv = obj->driver_private;
int ret = 0;
i915_gem_object_free_page_list(obj);
+ atomic_dec(&dev->gtt_count);
+ atomic_sub(obj->size, &dev->gtt_memory);
+
drm_memrange_put_block(obj_priv->gtt_space);
obj_priv->gtt_space = NULL;
obj_priv->gtt_space = NULL;
return -ENOMEM;
}
+ atomic_inc(&dev->gtt_count);
+ atomic_add(obj->size, &dev->gtt_memory);
/* Assert that the object is not currently in any GPU domain. As it
* wasn't in the GTT, there shouldn't be any way it could have been in
int
i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment)
{
+ struct drm_device *dev = obj->dev;
struct drm_i915_gem_object *obj_priv = obj->driver_private;
int ret;
/* If the object is not active and not pending a flush,
* remove it from the inactive list
*/
- if (obj_priv->pin_count == 1 &&
- !obj_priv->active &&
- obj->write_domain == 0)
- list_del_init(&obj_priv->list);
+ if (obj_priv->pin_count == 1) {
+ atomic_inc(&dev->pin_count);
+ atomic_add(obj->size, &dev->pin_memory);
+ if (!obj_priv->active && obj->write_domain == 0)
+ list_del_init(&obj_priv->list);
+ }
return 0;
}
* neither active nor being flushed, then stick it on
* the inactive list
*/
- if (obj_priv->pin_count == 0 &&
- !obj_priv->active && obj->write_domain == 0)
- list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
+ if (obj_priv->pin_count == 0) {
+ if (!obj_priv->active && obj->write_domain == 0)
+ list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
+ atomic_dec(&dev->pin_count);
+ atomic_sub(obj->size, &dev->pin_memory);
+ }
}
int