drm: fix deadlock of syncobj v6

v2:
add a mutex between sync_cb execution and free.
v3:
clearly separating the roles for pt_lock and cb_mutex (Chris)
v4:
the cb_mutex should be taken outside of the pt_lock around
this if() block. (Chris)
v5:
fix a corner case
v6:
tidy drm_syncobj_fence_get_or_add_callback up. (Chris)

Tested by syncobj_basic and syncobj_wait of igt.

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Christian König <christian.koenig@amd.com>
Cc: intel-gfx@lists.freedesktop.org
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.kernel.org/patch/10652893/
This commit is contained in:
Chunming Zhou 2018-10-23 17:37:45 +08:00 committed by Christian König
parent 3d42f1ddc4
commit 43cf1fc0e2
2 changed files with 95 additions and 97 deletions

View file

@ -75,9 +75,13 @@ struct drm_syncobj {
*/
struct list_head cb_list;
/**
* @lock: Protects syncobj list and write-locks &fence.
* @pt_lock: Protects pt list.
*/
spinlock_t lock;
spinlock_t pt_lock;
/**
* @cb_mutex: Protects syncobj cb list.
*/
struct mutex cb_mutex;
/**
* @file: A file backing for this syncobj.
*/