drm/i915: Force ww lock for i915_gem_object_ggtt_pin_ww, v2.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Thu, 16 Dec 2021 14:27:37 +0000 (15:27 +0100)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 20 Dec 2021 15:33:03 +0000 (16:33 +0100)
We will need the lock to unbind the vma, and wait for bind to complete.
Remove the special casing for the !ww path, and force ww locking for all.

Changes since v1:
- Pass err to for_i915_gem_ww handling for -EDEADLK handling.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211216142749.1966107-6-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c

index 80b80d8bda2de3e46271cf300f2063792416a313..ec6dc508099171dc72ecace58898056996e32dd1 100644 (file)
@@ -1869,13 +1869,10 @@ i915_gem_object_ggtt_pin_ww(struct drm_i915_gem_object *obj,
                            const struct i915_ggtt_view *view,
                            u64 size, u64 alignment, u64 flags);
 
-static inline struct i915_vma * __must_check
+struct i915_vma * __must_check
 i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
                         const struct i915_ggtt_view *view,
-                        u64 size, u64 alignment, u64 flags)
-{
-       return i915_gem_object_ggtt_pin_ww(obj, NULL, view, size, alignment, flags);
-}
+                        u64 size, u64 alignment, u64 flags);
 
 int i915_gem_object_unbind(struct drm_i915_gem_object *obj,
                           unsigned long flags);
index 8ba2119092f205d620aad75d27a025ee708f76ab..915bf431f3209ba631e839d2e107f271a063bbd2 100644 (file)
@@ -877,6 +877,8 @@ i915_gem_object_ggtt_pin_ww(struct drm_i915_gem_object *obj,
        struct i915_vma *vma;
        int ret;
 
+       GEM_WARN_ON(!ww);
+
        if (flags & PIN_MAPPABLE &&
            (!view || view->type == I915_GGTT_VIEW_NORMAL)) {
                /*
@@ -936,10 +938,7 @@ new_vma:
                        return ERR_PTR(ret);
        }
 
-       if (ww)
-               ret = i915_vma_pin_ww(vma, ww, size, alignment, flags | PIN_GLOBAL);
-       else
-               ret = i915_vma_pin(vma, size, alignment, flags | PIN_GLOBAL);
+       ret = i915_vma_pin_ww(vma, ww, size, alignment, flags | PIN_GLOBAL);
 
        if (ret)
                return ERR_PTR(ret);
@@ -959,6 +958,29 @@ new_vma:
        return vma;
 }
 
+struct i915_vma * __must_check
+i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
+                        const struct i915_ggtt_view *view,
+                        u64 size, u64 alignment, u64 flags)
+{
+       struct i915_gem_ww_ctx ww;
+       struct i915_vma *ret;
+       int err;
+
+       for_i915_gem_ww(&ww, err, true) {
+               err = i915_gem_object_lock(obj, &ww);
+               if (err)
+                       continue;
+
+               ret = i915_gem_object_ggtt_pin_ww(obj, &ww, view, size,
+                                                 alignment, flags);
+               if (IS_ERR(ret))
+                       err = PTR_ERR(ret);
+       }
+
+       return err ? ERR_PTR(err) : ret;
+}
+
 int
 i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
                       struct drm_file *file_priv)