summaryrefslogtreecommitdiff
path: root/linux-core
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2008-05-05 14:38:04 -0700
committerEric Anholt <eric@anholt.net>2008-05-05 14:38:26 -0700
commitdafe48e6239a4e9b49dd87b8c70224e8eeeb6079 (patch)
treed72d9158d30e83aea6ae6429a22d1a71c01297bd /linux-core
parentf0bc796a028dc7c6281d3d0cb2deef9df37e380a (diff)
GEM: Replace drm_memrange_for_each with just evicting what we brought in.
I was wrong about how the data structure worked, and didn't care to fix it to support debugging code.
Diffstat (limited to 'linux-core')
-rw-r--r--linux-core/drmP.h4
-rw-r--r--linux-core/drm_memrange.c27
-rw-r--r--linux-core/i915_gem.c49
3 files changed, 15 insertions, 65 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h
index 21a4dcd0..ffeafc18 100644
--- a/linux-core/drmP.h
+++ b/linux-core/drmP.h
@@ -1315,10 +1315,6 @@ extern int drm_memrange_remove_space_from_tail(struct drm_memrange *mm,
unsigned long size);
extern int drm_memrange_add_space_to_tail(struct drm_memrange *mm,
unsigned long size);
-extern int drm_memrange_for_each(struct drm_memrange *mm,
- int (*callback)(struct drm_memrange_node *node,
- void *data),
- void *data);
static inline struct drm_memrange *drm_get_mm(struct drm_memrange_node *block)
{
diff --git a/linux-core/drm_memrange.c b/linux-core/drm_memrange.c
index 7304cbaa..7014c4e2 100644
--- a/linux-core/drm_memrange.c
+++ b/linux-core/drm_memrange.c
@@ -275,33 +275,6 @@ int drm_memrange_init(struct drm_memrange * mm, unsigned long start, unsigned lo
return drm_memrange_create_tail_node(mm, start, size);
}
-/**
- * Walks the list of allocated memory ranges and calls the callback on
- * one.
- */
-int drm_memrange_for_each(struct drm_memrange *mm,
- int (*callback)(struct drm_memrange_node *node,
- void *data),
- void *data)
-{
- struct list_head *list, *next;
-
- list_for_each_safe(list, next, &mm->ml_entry) {
- struct drm_memrange_node *cur;
- int ret;
-
- cur = list_entry(list, struct drm_memrange_node, ml_entry);
- if (!cur->free) {
- ret = callback(cur, data);
- if (ret != 0)
- return ret;
- }
- }
-
- return 0;
-}
-EXPORT_SYMBOL(drm_memrange_for_each);
-
EXPORT_SYMBOL(drm_memrange_init);
void drm_memrange_takedown(struct drm_memrange * mm)
diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c
index a1ce139b..919f32d7 100644
--- a/linux-core/i915_gem.c
+++ b/linux-core/i915_gem.c
@@ -288,45 +288,17 @@ i915_gem_reloc_and_validate_object(struct drm_gem_object *obj,
}
static int
-evict_callback(struct drm_memrange_node *node, void *data)
-{
- struct drm_gem_object *obj;
- struct drm_i915_gem_object *obj_priv;
-
- DRM_INFO ("evict node %p\n", node);
-
- obj = node->private;
- DRM_INFO ("evict obj %p\n", obj);
-
- obj_priv = obj->driver_private;
- DRM_INFO ("evict priv %p\n", obj_priv);
-
- DRM_INFO ("pin_count %d\n", obj_priv->pin_count);
- if (obj_priv->pin_count == 0)
- i915_gem_object_unbind(obj);
-
- return 0;
-}
-
-static int
-i915_gem_sync_and_evict(struct drm_device *dev)
+i915_gem_sync(struct drm_device *dev)
{
drm_i915_private_t *dev_priv = dev->dev_private;
- int ret;
RING_LOCALS;
BEGIN_LP_RING(2);
OUT_RING(CMD_MI_FLUSH | MI_READ_FLUSH | MI_EXE_FLUSH);
OUT_RING(0); /* noop */
ADVANCE_LP_RING();
- ret = i915_quiescent(dev);
- if (ret != 0)
- return ret;
-
- /* Evict everything so we have space for sure. */
- drm_memrange_for_each(&dev_priv->mm.gtt_space, evict_callback, NULL);
- return 0;
+ return i915_quiescent(dev);
}
static int
@@ -410,9 +382,9 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
/* Big hammer: flush and idle the hardware so we can map things in/out.
*/
- ret = i915_gem_sync_and_evict(dev);
+ ret = i915_gem_sync(dev);
if (ret != 0) {
- DRM_ERROR ("i915_gem_sync_and_evict failed %d\n", ret);
+ DRM_ERROR ("i915_gem_sync failed %d\n", ret);
return ret;
}
@@ -477,9 +449,18 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
args->buffer_count, ret);
/* Clean up and return */
- ret = i915_gem_sync_and_evict(dev);
+ ret = i915_gem_sync(dev);
if (ret)
- DRM_ERROR ("failed to sync/evict buffers %d\n", ret);
+ DRM_ERROR ("failed to sync %d\n", ret);
+
+ /* Evict all the buffers we moved in, leaving room for the next guy. */
+ for (i = 0; i < args->buffer_count; i++) {
+ struct drm_gem_object *obj = object_list[i];
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
+
+ if (obj_priv->pin_count == 0)
+ i915_gem_object_unbind(obj);
+ }
err:
if (object_list != NULL) {
for (i = 0; i < args->buffer_count; i++)