drm/i915: Lift has-pinned-pages assert to caller of ____i915_gem_object_get_pages
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 6 Sep 2017 13:52:20 +0000 (14:52 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 6 Sep 2017 21:12:10 +0000 (22:12 +0100)
i915_gem_object_attach_phys() is trying to swap out its shmemfs pages
for a new set of physically contiguous pages, but unfortunately triggers
an assert inside get-pages.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102561
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20170906135220.13508-1-chris@chris-wilson.co.uk
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
drivers/gpu/drm/i915/i915_gem.c

index 72008e4c8c8ff82b432607b0afee4222dabc85f1..1545a4ef09c49727f867d0c7df1cc796ff288516 100644 (file)
@@ -2479,8 +2479,6 @@ static int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 {
        struct sg_table *pages;
 
-       GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
-
        if (unlikely(obj->mm.madv != I915_MADV_WILLNEED)) {
                DRM_DEBUG("Attempting to obtain a purgeable object\n");
                return -EFAULT;
@@ -2510,6 +2508,8 @@ int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
                return err;
 
        if (unlikely(IS_ERR_OR_NULL(obj->mm.pages))) {
+               GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
+
                err = ____i915_gem_object_get_pages(obj);
                if (err)
                        goto unlock;
@@ -2593,6 +2593,8 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
 
        if (!atomic_inc_not_zero(&obj->mm.pages_pin_count)) {
                if (unlikely(IS_ERR_OR_NULL(obj->mm.pages))) {
+                       GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
+
                        ret = ____i915_gem_object_get_pages(obj);
                        if (ret)
                                goto err_unlock;