From: Maarten Lankhorst <maarten.lankho...@linux.intel.com>

vmap is using pin_pages, but needs to use ww locking,
add pin_pages_unlocked to correctly lock the mapping.

Also add ww locking to begin/end cpu access.

Signed-off-by: Maarten Lankhorst <maarten.lankho...@linux.intel.com>
Cc: Thomas Hellström <thomas.hellst...@linux.intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 60 ++++++++++++----------
 1 file changed, 33 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c 
b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index 36e3c2765f4c..c4b01e819786 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -82,7 +82,7 @@ static int i915_gem_dmabuf_vmap(struct dma_buf *dma_buf, 
struct dma_buf_map *map
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
        void *vaddr;
 
-       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+       vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
        if (IS_ERR(vaddr))
                return PTR_ERR(vaddr);
 
@@ -123,42 +123,48 @@ static int i915_gem_begin_cpu_access(struct dma_buf 
*dma_buf, enum dma_data_dire
 {
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
        bool write = (direction == DMA_BIDIRECTIONAL || direction == 
DMA_TO_DEVICE);
+       struct i915_gem_ww_ctx ww;
        int err;
 
-       err = i915_gem_object_pin_pages(obj);
-       if (err)
-               return err;
-
-       err = i915_gem_object_lock_interruptible(obj, NULL);
-       if (err)
-               goto out;
-
-       err = i915_gem_object_set_to_cpu_domain(obj, write);
-       i915_gem_object_unlock(obj);
-
-out:
-       i915_gem_object_unpin_pages(obj);
+       i915_gem_ww_ctx_init(&ww, true);
+retry:
+       err = i915_gem_object_lock(obj, &ww);
+       if (!err)
+               err = i915_gem_object_pin_pages(obj);
+       if (!err) {
+               err = i915_gem_object_set_to_cpu_domain(obj, write);
+               i915_gem_object_unpin_pages(obj);
+       }
+       if (err == -EDEADLK) {
+               err = i915_gem_ww_ctx_backoff(&ww);
+               if (!err)
+                       goto retry;
+       }
+       i915_gem_ww_ctx_fini(&ww);
        return err;
 }
 
 static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum 
dma_data_direction direction)
 {
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+       struct i915_gem_ww_ctx ww;
        int err;
 
-       err = i915_gem_object_pin_pages(obj);
-       if (err)
-               return err;
-
-       err = i915_gem_object_lock_interruptible(obj, NULL);
-       if (err)
-               goto out;
-
-       err = i915_gem_object_set_to_gtt_domain(obj, false);
-       i915_gem_object_unlock(obj);
-
-out:
-       i915_gem_object_unpin_pages(obj);
+       i915_gem_ww_ctx_init(&ww, true);
+retry:
+       err = i915_gem_object_lock(obj, &ww);
+       if (!err)
+               err = i915_gem_object_pin_pages(obj);
+       if (!err) {
+               err = i915_gem_object_set_to_gtt_domain(obj, false);
+               i915_gem_object_unpin_pages(obj);
+       }
+       if (err == -EDEADLK) {
+               err = i915_gem_ww_ctx_backoff(&ww);
+               if (!err)
+                       goto retry;
+       }
+       i915_gem_ww_ctx_fini(&ww);
        return err;
 }
 
-- 
2.26.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to