drm/i915: Lock ww in ucode objects correctly
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 23 Mar 2021 15:50:25 +0000 (16:50 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 24 Mar 2021 16:27:21 +0000 (17:27 +0100)
In the ucode functions, the calls are done before userspace runs,
when debugging using debugfs, or when creating semi-permanent mappings;
we can safely use the unlocked versions that does the ww dance for us.

Because there is no pin_pages_unlocked yet, add it as convenience function.

This removes possible lockdep splats about missing resv lock for ucode.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20210323155059.628690-37-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/gem/i915_gem_object.h
drivers/gpu/drm/i915/gem/i915_gem_pages.c
drivers/gpu/drm/i915/gt/uc/intel_guc.c
drivers/gpu/drm/i915/gt/uc/intel_guc_log.c
drivers/gpu/drm/i915/gt/uc/intel_huc.c
drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c

index 54bd743..2be6e02 100644 (file)
@@ -366,6 +366,8 @@ i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
        return __i915_gem_object_get_pages(obj);
 }
 
+int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj);
+
 static inline bool
 i915_gem_object_has_pages(struct drm_i915_gem_object *obj)
 {
index 2d0065f..5b8af8f 100644 (file)
@@ -139,6 +139,26 @@ unlock:
        return err;
 }
 
+int i915_gem_object_pin_pages_unlocked(struct drm_i915_gem_object *obj)
+{
+       struct i915_gem_ww_ctx ww;
+       int err;
+
+       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 == -EDEADLK) {
+               err = i915_gem_ww_ctx_backoff(&ww);
+               if (!err)
+                       goto retry;
+       }
+       i915_gem_ww_ctx_fini(&ww);
+       return err;
+}
+
 /* Immediately discard the backing storage */
 void i915_gem_object_truncate(struct drm_i915_gem_object *obj)
 {
index 4545e90..78305b2 100644 (file)
@@ -682,7 +682,7 @@ int intel_guc_allocate_and_map_vma(struct intel_guc *guc, u32 size,
        if (IS_ERR(vma))
                return PTR_ERR(vma);
 
-       vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
+       vaddr = i915_gem_object_pin_map_unlocked(vma->obj, I915_MAP_WB);
        if (IS_ERR(vaddr)) {
                i915_vma_unpin_and_release(&vma, 0);
                return PTR_ERR(vaddr);
index c92f2c0..c36d5eb 100644 (file)
@@ -335,7 +335,7 @@ static int guc_log_map(struct intel_guc_log *log)
         * buffer pages, so that we can directly get the data
         * (up-to-date) from memory.
         */
-       vaddr = i915_gem_object_pin_map(log->vma->obj, I915_MAP_WC);
+       vaddr = i915_gem_object_pin_map_unlocked(log->vma->obj, I915_MAP_WC);
        if (IS_ERR(vaddr))
                return PTR_ERR(vaddr);
 
@@ -744,7 +744,7 @@ int intel_guc_log_dump(struct intel_guc_log *log, struct drm_printer *p,
        if (!obj)
                return 0;
 
-       map = i915_gem_object_pin_map(obj, I915_MAP_WC);
+       map = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
        if (IS_ERR(map)) {
                DRM_DEBUG("Failed to pin object\n");
                drm_puts(p, "(log data unaccessible)\n");
index 65eeb44..2126dd8 100644 (file)
@@ -82,7 +82,7 @@ static int intel_huc_rsa_data_create(struct intel_huc *huc)
        if (IS_ERR(vma))
                return PTR_ERR(vma);
 
-       vaddr = i915_gem_object_pin_map(vma->obj, I915_MAP_WB);
+       vaddr = i915_gem_object_pin_map_unlocked(vma->obj, I915_MAP_WB);
        if (IS_ERR(vaddr)) {
                i915_vma_unpin_and_release(&vma, 0);
                return PTR_ERR(vaddr);
index 984fa79..df647c9 100644 (file)
@@ -539,7 +539,7 @@ int intel_uc_fw_init(struct intel_uc_fw *uc_fw)
        if (!intel_uc_fw_is_available(uc_fw))
                return -ENOEXEC;
 
-       err = i915_gem_object_pin_pages(uc_fw->obj);
+       err = i915_gem_object_pin_pages_unlocked(uc_fw->obj);
        if (err) {
                DRM_DEBUG_DRIVER("%s fw pin-pages err=%d\n",
                                 intel_uc_fw_type_repr(uc_fw->type), err);