aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-03-07 08:20:31 -0500
committerJani Nikula <jani.nikula@intel.com>2017-03-09 03:45:58 -0500
commit0d9dc306e15b59bf50db87ebcb1e2248586d4733 (patch)
tree13c1f1e3caa5840f275108b0028471ab04954835
parent38230243ef316ac696956d75dc78a22e3aa789b9 (diff)
drm/i915: Store a permanent error in obj->mm.pages
Once the object has been truncated, it is unrecoverable. To facilitate detection of this state store the error in obj->mm.pages. This is required for the next patch which should be applied to v4.10 (via stable), so we also need to mark this patch for backporting. In that regard, let's consider this to be a fix/improvement too. v2: Avoid dereferencing the ERR_PTR when freeing the object. Fixes: 1233e2db199d ("drm/i915: Move object backing storage manipulation to its own locking") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: <stable@vger.kernel.org> # v4.10+ Link: http://patchwork.freedesktop.org/patch/msgid/20170307132031.32461-1-chris@chris-wilson.co.uk Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> (cherry picked from commit 4e5462ee843c883790e9609cf560d88960ea4227) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index c45af09555dc..3591e8656ff9 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2119,6 +2119,7 @@ i915_gem_object_truncate(struct drm_i915_gem_object *obj)
2119 */ 2119 */
2120 shmem_truncate_range(file_inode(obj->base.filp), 0, (loff_t)-1); 2120 shmem_truncate_range(file_inode(obj->base.filp), 0, (loff_t)-1);
2121 obj->mm.madv = __I915_MADV_PURGED; 2121 obj->mm.madv = __I915_MADV_PURGED;
2122 obj->mm.pages = ERR_PTR(-EFAULT);
2122} 2123}
2123 2124
2124/* Try to discard unwanted pages */ 2125/* Try to discard unwanted pages */
@@ -2218,7 +2219,9 @@ void __i915_gem_object_put_pages(struct drm_i915_gem_object *obj,
2218 2219
2219 __i915_gem_object_reset_page_iter(obj); 2220 __i915_gem_object_reset_page_iter(obj);
2220 2221
2221 obj->ops->put_pages(obj, pages); 2222 if (!IS_ERR(pages))
2223 obj->ops->put_pages(obj, pages);
2224
2222unlock: 2225unlock:
2223 mutex_unlock(&obj->mm.lock); 2226 mutex_unlock(&obj->mm.lock);
2224} 2227}
@@ -2437,7 +2440,7 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
2437 if (err) 2440 if (err)
2438 return err; 2441 return err;
2439 2442
2440 if (unlikely(!obj->mm.pages)) { 2443 if (unlikely(IS_ERR_OR_NULL(obj->mm.pages))) {
2441 err = ____i915_gem_object_get_pages(obj); 2444 err = ____i915_gem_object_get_pages(obj);
2442 if (err) 2445 if (err)
2443 goto unlock; 2446 goto unlock;
@@ -2515,7 +2518,7 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
2515 2518
2516 pinned = true; 2519 pinned = true;
2517 if (!atomic_inc_not_zero(&obj->mm.pages_pin_count)) { 2520 if (!atomic_inc_not_zero(&obj->mm.pages_pin_count)) {
2518 if (unlikely(!obj->mm.pages)) { 2521 if (unlikely(IS_ERR_OR_NULL(obj->mm.pages))) {
2519 ret = ____i915_gem_object_get_pages(obj); 2522 ret = ____i915_gem_object_get_pages(obj);
2520 if (ret) 2523 if (ret)
2521 goto err_unlock; 2524 goto err_unlock;