aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-09-20 12:36:15 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-09-21 06:24:17 -0400
commitf13d3f7311add99d1f874a6b67d56426afa35664 (patch)
tree949e7d6e4606f1b8051a8821a0694d1c5fd65027 /drivers/gpu/drm/i915
parent265db9585e570814d2f7aca109c5563bcde9c948 (diff)
drm/i915: Track pinned objects
Keep a list of pinned objects and display it via debugfs. Now all objects that exist in the GTT are always tracked on one of the active, flushing, inactive or pinned lists. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c16
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h6
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c18
3 files changed, 26 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index ac48115429ed..36f0e3630f74 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -40,10 +40,13 @@
40 40
41#if defined(CONFIG_DEBUG_FS) 41#if defined(CONFIG_DEBUG_FS)
42 42
43#define RENDER_LIST 1 43enum {
44#define BSD_LIST 2 44 RENDER_LIST,
45#define FLUSHING_LIST 3 45 BSD_LIST,
46#define INACTIVE_LIST 4 46 FLUSHING_LIST,
47 INACTIVE_LIST,
48 PINNED_LIST
49};
47 50
48static const char *yesno(int v) 51static const char *yesno(int v)
49{ 52{
@@ -150,6 +153,10 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
150 seq_printf(m, "Inactive:\n"); 153 seq_printf(m, "Inactive:\n");
151 head = &dev_priv->mm.inactive_list; 154 head = &dev_priv->mm.inactive_list;
152 break; 155 break;
156 case PINNED_LIST:
157 seq_printf(m, "Pinned:\n");
158 head = &dev_priv->mm.pinned_list;
159 break;
153 case FLUSHING_LIST: 160 case FLUSHING_LIST:
154 seq_printf(m, "Flushing:\n"); 161 seq_printf(m, "Flushing:\n");
155 head = &dev_priv->mm.flushing_list; 162 head = &dev_priv->mm.flushing_list;
@@ -983,6 +990,7 @@ static struct drm_info_list i915_debugfs_list[] = {
983 {"i915_gem_bsd_active", i915_gem_object_list_info, 0, (void *) BSD_LIST}, 990 {"i915_gem_bsd_active", i915_gem_object_list_info, 0, (void *) BSD_LIST},
984 {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST}, 991 {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST},
985 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST}, 992 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
993 {"i915_gem_pinned", i915_gem_object_list_info, 0, (void *) PINNED_LIST},
986 {"i915_gem_pageflip", i915_gem_pageflip_info, 0}, 994 {"i915_gem_pageflip", i915_gem_pageflip_info, 0},
987 {"i915_gem_request", i915_gem_request_info, 0}, 995 {"i915_gem_request", i915_gem_request_info, 0},
988 {"i915_gem_seqno", i915_gem_seqno_info, 0}, 996 {"i915_gem_seqno", i915_gem_seqno_info, 0},
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index ce8ff8fdc55c..12e9f853a5e9 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -569,6 +569,12 @@ typedef struct drm_i915_private {
569 */ 569 */
570 struct list_head inactive_list; 570 struct list_head inactive_list;
571 571
572 /**
573 * LRU list of objects which are not in the ringbuffer but
574 * are still pinned in the GTT.
575 */
576 struct list_head pinned_list;
577
572 /** LRU list of objects with fence regs on them. */ 578 /** LRU list of objects with fence regs on them. */
573 struct list_head fence_list; 579 struct list_head fence_list;
574 580
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index a8ddcd499b3b..151fa43e4417 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1051,7 +1051,6 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1051 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0); 1051 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
1052 } 1052 }
1053 1053
1054
1055 /* Maintain LRU order of "inactive" objects */ 1054 /* Maintain LRU order of "inactive" objects */
1056 if (ret == 0 && i915_gem_object_is_inactive(obj_priv)) 1055 if (ret == 0 && i915_gem_object_is_inactive(obj_priv))
1057 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list); 1056 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
@@ -1552,7 +1551,7 @@ i915_gem_object_move_to_inactive(struct drm_gem_object *obj)
1552 1551
1553 i915_verify_inactive(dev, __FILE__, __LINE__); 1552 i915_verify_inactive(dev, __FILE__, __LINE__);
1554 if (obj_priv->pin_count != 0) 1553 if (obj_priv->pin_count != 0)
1555 list_del_init(&obj_priv->list); 1554 list_move_tail(&obj_priv->list, &dev_priv->mm.pinned_list);
1556 else 1555 else
1557 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list); 1556 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
1558 1557
@@ -2044,9 +2043,7 @@ i915_gem_object_unbind(struct drm_gem_object *obj)
2044 obj_priv->gtt_space = NULL; 2043 obj_priv->gtt_space = NULL;
2045 } 2044 }
2046 2045
2047 /* Remove ourselves from the LRU list if present. */ 2046 list_del_init(&obj_priv->list);
2048 if (!list_empty(&obj_priv->list))
2049 list_del_init(&obj_priv->list);
2050 2047
2051 if (i915_gem_object_is_purgeable(obj_priv)) 2048 if (i915_gem_object_is_purgeable(obj_priv))
2052 i915_gem_object_truncate(obj); 2049 i915_gem_object_truncate(obj);
@@ -4030,6 +4027,7 @@ int
4030i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment) 4027i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment)
4031{ 4028{
4032 struct drm_device *dev = obj->dev; 4029 struct drm_device *dev = obj->dev;
4030 struct drm_i915_private *dev_priv = dev->dev_private;
4033 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 4031 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
4034 int ret; 4032 int ret;
4035 4033
@@ -4065,9 +4063,9 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment)
4065 if (obj_priv->pin_count == 1) { 4063 if (obj_priv->pin_count == 1) {
4066 atomic_inc(&dev->pin_count); 4064 atomic_inc(&dev->pin_count);
4067 atomic_add(obj->size, &dev->pin_memory); 4065 atomic_add(obj->size, &dev->pin_memory);
4068 if (!obj_priv->active && 4066 if (!obj_priv->active)
4069 (obj->write_domain & I915_GEM_GPU_DOMAINS) == 0) 4067 list_move_tail(&obj_priv->list,
4070 list_del_init(&obj_priv->list); 4068 &dev_priv->mm.pinned_list);
4071 } 4069 }
4072 i915_verify_inactive(dev, __FILE__, __LINE__); 4070 i915_verify_inactive(dev, __FILE__, __LINE__);
4073 4071
@@ -4091,8 +4089,7 @@ i915_gem_object_unpin(struct drm_gem_object *obj)
4091 * the inactive list 4089 * the inactive list
4092 */ 4090 */
4093 if (obj_priv->pin_count == 0) { 4091 if (obj_priv->pin_count == 0) {
4094 if (!obj_priv->active && 4092 if (!obj_priv->active)
4095 (obj->write_domain & I915_GEM_GPU_DOMAINS) == 0)
4096 list_move_tail(&obj_priv->list, 4093 list_move_tail(&obj_priv->list,
4097 &dev_priv->mm.inactive_list); 4094 &dev_priv->mm.inactive_list);
4098 atomic_dec(&dev->pin_count); 4095 atomic_dec(&dev->pin_count);
@@ -4614,6 +4611,7 @@ i915_gem_load(struct drm_device *dev)
4614 INIT_LIST_HEAD(&dev_priv->mm.flushing_list); 4611 INIT_LIST_HEAD(&dev_priv->mm.flushing_list);
4615 INIT_LIST_HEAD(&dev_priv->mm.gpu_write_list); 4612 INIT_LIST_HEAD(&dev_priv->mm.gpu_write_list);
4616 INIT_LIST_HEAD(&dev_priv->mm.inactive_list); 4613 INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
4614 INIT_LIST_HEAD(&dev_priv->mm.pinned_list);
4617 INIT_LIST_HEAD(&dev_priv->mm.fence_list); 4615 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
4618 INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list); 4616 INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
4619 INIT_LIST_HEAD(&dev_priv->render_ring.active_list); 4617 INIT_LIST_HEAD(&dev_priv->render_ring.active_list);