| From df317cc14fbbe58fc26d444c33347e195a4b32bb Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 29 Jun 2025 13:13:22 -0700 |
| Subject: drm/msm: use trylock for debugfs |
| |
| From: Rob Clark <robdclark@chromium.org> |
| |
| [ Upstream commit 0a1ff88ec5b60b41ba830c5bf08b6cd8f45ab411 ] |
| |
| This resolves a potential deadlock vs msm_gem_vm_close(). Otherwise for |
| _NO_SHARE buffers msm_gem_describe() could be trying to acquire the |
| shared vm resv, while already holding priv->obj_lock. But _vm_close() |
| might drop the last reference to a GEM obj while already holding the vm |
| resv, and msm_gem_free_object() needs to grab priv->obj_lock, a locking |
| inversion. |
| |
| OTOH this is only for debugfs and it isn't critical if we undercount by |
| skipping a locked obj. So just use trylock() and move along if we can't |
| get the lock. |
| |
| Signed-off-by: Rob Clark <robdclark@chromium.org> |
| Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com> |
| Tested-by: Antonino Maniscalco <antomani103@gmail.com> |
| Reviewed-by: Antonino Maniscalco <antomani103@gmail.com> |
| Patchwork: https://patchwork.freedesktop.org/patch/661525/ |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/msm/msm_gem.c | 3 ++- |
| drivers/gpu/drm/msm/msm_gem.h | 6 ++++++ |
| 2 files changed, 8 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c |
| index 1dee0d18abbb..7116c2aac4cb 100644 |
| --- a/drivers/gpu/drm/msm/msm_gem.c |
| +++ b/drivers/gpu/drm/msm/msm_gem.c |
| @@ -874,7 +874,8 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m, |
| uint64_t off = drm_vma_node_start(&obj->vma_node); |
| const char *madv; |
| |
| - msm_gem_lock(obj); |
| + if (!msm_gem_trylock(obj)) |
| + return; |
| |
| stats->all.count++; |
| stats->all.size += obj->size; |
| diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h |
| index c4844cf3a585..4c8e0a022c24 100644 |
| --- a/drivers/gpu/drm/msm/msm_gem.h |
| +++ b/drivers/gpu/drm/msm/msm_gem.h |
| @@ -185,6 +185,12 @@ msm_gem_lock(struct drm_gem_object *obj) |
| dma_resv_lock(obj->resv, NULL); |
| } |
| |
| +static inline bool __must_check |
| +msm_gem_trylock(struct drm_gem_object *obj) |
| +{ |
| + return dma_resv_trylock(obj->resv); |
| +} |
| + |
| static inline int |
| msm_gem_lock_interruptible(struct drm_gem_object *obj) |
| { |
| -- |
| 2.39.5 |
| |