summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2008-07-23 11:49:25 -0700
committerEric Anholt <eric@anholt.net>2008-07-23 11:49:25 -0700
commit6d258ddf7715412e2fb6fae35ea28d49c57ee130 (patch)
treed0e6744e678dc2c2d2037b3027a5117529ce1e3a
parent439d7106832f2e9742deb900d96f1d3bc07162b1 (diff)
intel-gem: Fix pread math and logic errors.
Fixes an oops in fbotexture from walking off the end of the page list.
-rw-r--r--linux-core/i915_gem.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c
index db068ce3..e4697427 100644
--- a/linux-core/i915_gem.c
+++ b/linux-core/i915_gem.c
@@ -169,20 +169,16 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
}
}
if ((obj->read_domains & I915_GEM_DOMAIN_CPU) == 0) {
- int got_page_list = 0;
int first_page = args->offset / PAGE_SIZE;
- int last_page = (args->offset + args->size) / PAGE_SIZE;
+ int last_page = (args->offset + args->size - 1) / PAGE_SIZE;
- if (obj_priv->page_list == NULL) {
- i915_gem_object_get_page_list(obj);
- got_page_list = 1;
- }
+ /* If we don't have the page list, the pages are unpinned
+ * and swappable, and thus should already be in the CPU domain.
+ */
+ BUG_ON(obj_priv->page_list == NULL);
drm_ttm_cache_flush(&obj_priv->page_list[first_page],
last_page - first_page + 1);
-
- if (got_page_list)
- i915_gem_object_free_page_list(obj);
}
offset = args->offset;