From 6a97b8723d7e7f7f0ba3e39a85984db96242704c Mon Sep 17 00:00:00 2001 From: Jaehoon Chung Date: Tue, 21 Mar 2023 14:20:27 +0900 Subject: [PATCH] amlogic: drm: meson_gem: Fix a deadlock issue After enabled the lock debug config, the below message is displayed. [ 20.897676@5] ============================================= [ 20.899234@5] [ INFO: possible recursive locking detected ] [ 20.904782@5] 4.9.241-TIZEN-amlogic-kvim+ #6 Not tainted [ 20.910067@5] --------------------------------------------- [ 20.915614@5] enlightenment/579 is trying to acquire lock: [ 20.921074@5] (&dev->struct_mutex){+.+...}, at: [] drm_gem_object_unreference_unlocked+0x20/0x140 [ 20.931561@5] [ 20.931561@5] but task is already holding lock: [ 20.937714@5] (&dev->struct_mutex){+.+...}, at: [] am_meson_gem_cpu_fini_ioctl+0x34/0xe8 [ 20.947421@5] [ 20.947421@5] other info that might help us debug this: [ 20.954267@5] Possible unsafe locking scenario: [ 20.954267@5] [ 20.960507@5] CPU0 [ 20.963107@5] ---- [ 20.965707@5] lock(&dev->struct_mutex); [ 20.969693@5] lock(&dev->struct_mutex); [ 20.973680@5] [ 20.973680@5] *** DEADLOCK *** [ 20.973680@5] [ 20.980094@5] May be due to missing lock nesting notation [ 20.980094@5] [ 20.987201@5] 1 lock held by enlightenment/579: [ 20.991707@5] #0: (&dev->struct_mutex){+.+...}, at: [] am_meson_gem_cpu_fini_ioctl+0x34/0xe8 [ 21.001847@5] [ 21.001847@5] stack backtrace: [ 21.006529@5] CPU: 5 PID: 579 Comm: enlightenment Not tainted 4.9.241-TIZEN-amlogic-kvim+ #6 [ 21.014934@5] Hardware name: Khadas VIM3 (DT) [ 21.019268@5] Call trace: [ 21.021871@5] [] dump_backtrace+0x0/0x268 [ 21.027415@5] [] show_stack+0x28/0x38 [ 21.032616@5] [] dump_stack+0xe0/0x12c [ 21.037903@5] [] __lock_acquire+0x1064/0x1b28 [ 21.043795@5] [] lock_acquire+0xe8/0x288 [ 21.049255@5] [] drm_gem_object_unreference_unlocked+0x50/0x140 [ 21.056709@5] [] am_meson_gem_cpu_fini_ioctl+0xa8/0xe8 [ 21.063382@5] [] drm_ioctl+0x204/0x4a8 [ 21.068670@5] [] do_vfs_ioctl+0x674/0x8e0 [ 21.074215@5] [] SyS_ioctl+0x94/0xa8 [ 21.079328@5] [] __sys_trace_return+0x0/0x4 [ 21.166643@2] input: Virtual Key Device as /devices/virtual/input/input6 Change-Id: Iadb1df81b88b288f2d6841520ce55c2ee47cedef Signed-off-by: Jaehoon Chung --- drivers/amlogic/drm/meson_gem.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/amlogic/drm/meson_gem.c b/drivers/amlogic/drm/meson_gem.c index 6864ed4..314045d 100644 --- a/drivers/amlogic/drm/meson_gem.c +++ b/drivers/amlogic/drm/meson_gem.c @@ -563,7 +563,8 @@ int am_meson_gem_cpu_fini_ioctl( obj = drm_gem_object_lookup(file_priv, args->handle); if (!obj) { err = -ENOENT; - goto exit_unlock; + mutex_unlock(&dev->struct_mutex); + return err; } meson_gem_obj = to_am_meson_gem_obj(obj); @@ -580,10 +581,8 @@ int am_meson_gem_cpu_fini_ioctl( meson_gem_obj->prep_data.cpu_prep = false; exit_unref: - drm_gem_object_unreference_unlocked(obj); -exit_unlock: mutex_unlock(&dev->struct_mutex); - + drm_gem_object_unreference_unlocked(obj); return err; } -- 2.7.4