[Intel-xe] [PATCH v5 4/7] drm/xe: keep pulling mem_access_get further back
Rodrigo Vivi
rodrigo.vivi at kernel.org
Wed May 17 15:53:02 UTC 2023
On Wed, May 17, 2023 at 04:22:41PM +0100, Matthew Auld wrote:
> Lockdep is unhappy about ggtt->lock -> mem_access.lock, where it seems
> to think this can somehow get inverted. The ggtt->lock looks like a
> potentially sensitive driver lock, so likely a sensible move to never
> call the runtime_pm routines while holding it. Actually it looks like
> d3cold wants to grab this, so perhaps this can indeed deadlock.
I got me thinking that we should document this, but then
I remembered that we don't even have the mem_access documentation yet :(
My bad... I think I might have in some old branch here a draft
for it while moving mem_access to its own component files.
Anyway, let's put this in a gitlab issue so we don't forget:
https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/281
and let's move with this...
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
>
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> ---
> drivers/gpu/drm/xe/display/xe_fb_pin.c | 12 +++++++-----
> drivers/gpu/drm/xe/xe_ggtt.c | 6 ++++++
> drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | 2 --
> 3 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index ed691d28b34d..a2ed04ca2421 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -130,9 +130,10 @@ static int __xe_pin_fb_vma_ggtt(struct intel_framebuffer *fb,
> /* TODO: Consider sharing framebuffer mapping?
> * embed i915_vma inside intel_framebuffer
> */
> + xe_device_mem_access_get(ggtt->gt->xe);
> ret = mutex_lock_interruptible(&ggtt->lock);
> if (ret)
> - return ret;
> + goto out;
>
> align = XE_PAGE_SIZE;
> if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K)
> @@ -146,7 +147,7 @@ static int __xe_pin_fb_vma_ggtt(struct intel_framebuffer *fb,
> ret = xe_ggtt_insert_special_node_locked(ggtt, &vma->node, size,
> align, 0);
> if (ret)
> - goto out;
> + goto out_unlock;
>
> for (x = 0; x < size; x += XE_PAGE_SIZE)
> xe_ggtt_set_pte(ggtt, vma->node.start + x, xe_ggtt_pte_encode(bo, x));
> @@ -160,7 +161,7 @@ static int __xe_pin_fb_vma_ggtt(struct intel_framebuffer *fb,
> ret = xe_ggtt_insert_special_node_locked(ggtt, &vma->node, size,
> align, 0);
> if (ret)
> - goto out;
> + goto out_unlock;
>
> ggtt_ofs = vma->node.start;
>
> @@ -174,9 +175,10 @@ static int __xe_pin_fb_vma_ggtt(struct intel_framebuffer *fb,
> }
>
> xe_ggtt_invalidate(to_gt(xe));
> -
> -out:
> +out_unlock:
> mutex_unlock(&ggtt->lock);
> +out:
> + xe_device_mem_access_put(ggtt->gt->xe);
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 546240261e0a..f986e8218820 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> @@ -142,12 +142,14 @@ static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
> u64 start, end;
>
> /* Display may have allocated inside ggtt, so be careful with clearing here */
> + xe_device_mem_access_get(ggtt->gt->xe);
> mutex_lock(&ggtt->lock);
> drm_mm_for_each_hole(hole, &ggtt->mm, start, end)
> xe_ggtt_clear(ggtt, start, end - start);
>
> xe_ggtt_invalidate(ggtt->gt);
> mutex_unlock(&ggtt->lock);
> + xe_device_mem_access_put(ggtt->gt->xe);
> }
>
> int xe_ggtt_init(struct xe_gt *gt, struct xe_ggtt *ggtt)
> @@ -288,12 +290,14 @@ static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo,
> if (err)
> return err;
>
> + xe_device_mem_access_get(ggtt->gt->xe);
> mutex_lock(&ggtt->lock);
> err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node, bo->size,
> alignment, 0, start, end, 0);
> if (!err)
> xe_ggtt_map_bo(ggtt, bo);
> mutex_unlock(&ggtt->lock);
> + xe_device_mem_access_put(ggtt->gt->xe);
>
> return err;
> }
> @@ -311,6 +315,7 @@ int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
>
> void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node)
> {
> + xe_device_mem_access_get(ggtt->gt->xe);
> mutex_lock(&ggtt->lock);
>
> xe_ggtt_clear(ggtt, node->start, node->size);
> @@ -320,6 +325,7 @@ void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node)
> xe_ggtt_invalidate(ggtt->gt);
>
> mutex_unlock(&ggtt->lock);
> + xe_device_mem_access_put(ggtt->gt->xe);
> }
>
> void xe_ggtt_remove_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
> diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c
> index 20f8f0aae6b4..1961e9bc79f1 100644
> --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c
> +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c
> @@ -114,7 +114,6 @@ static int send_tlb_invalidation(struct xe_guc *guc,
> * need to be updated.
> */
>
> - xe_device_mem_access_get(gt->xe);
> mutex_lock(&guc->ct.lock);
> seqno = gt->tlb_invalidation.seqno;
> if (fence) {
> @@ -143,7 +142,6 @@ static int send_tlb_invalidation(struct xe_guc *guc,
> if (ret < 0 && fence)
> invalidation_fence_signal(fence);
> mutex_unlock(&guc->ct.lock);
> - xe_device_mem_access_put(gt->xe);
>
> return ret;
> }
> --
> 2.40.1
>
More information about the Intel-xe
mailing list