Skip to content
  • Dave Airlie's avatar
    drm/dp/mst: drop cancel work sync in the mstb destroy path (v2) · 274d8352
    Dave Airlie authored
    Since 9eb1e57f
    
    
    drm/dp/mst: make sure mst_primary mstb is valid in work function
    
    we validate the mstb structs in the work function, and doing
    that takes a reference. So we should never get here with the
    work function running using the mstb device, only if the work
    function hasn't run yet or is running for another mstb.
    
    So we don't need to sync the work here, this was causing
    lockdep spew as below.
    
    [  +0.000160] =============================================
    [  +0.000001] [ INFO: possible recursive locking detected ]
    [  +0.000002] 3.10.0-320.el7.rhel72.stable.backport.3.x86_64.debug #1 Tainted: G        W      ------------
    [  +0.000001] ---------------------------------------------
    [  +0.000001] kworker/4:2/1262 is trying to acquire lock:
    [  +0.000001]  ((&mgr->work)){+.+.+.}, at: [<ffffffff810b29a5>] flush_work+0x5/0x2e0
    [  +0.000007]
    but task is already holding lock:
    [  +0.000001]  ((&mgr->work)){+.+.+.}, at: [<ffffffff810b57e4>] process_one_work+0x1b4/0x710
    [  +0.000004]
    other info that might help us debug this:
    [  +0.000001]  Possible unsafe locking scenario:
    
    [  +0.000002]        CPU0
    [  +0.000000]        ----
    [  +0.000001]   lock((&mgr->work));
    [  +0.000002]   lock((&mgr->work));
    [  +0.000001]
     *** DEADLOCK ***
    
    [  +0.000001]  May be due to missing lock nesting notation
    
    [  +0.000002] 2 locks held by kworker/4:2/1262:
    [  +0.000001]  #0:  (events_long){.+.+.+}, at: [<ffffffff810b57e4>] process_one_work+0x1b4/0x710
    [  +0.000004]  #1:  ((&mgr->work)){+.+.+.}, at: [<ffffffff810b57e4>] process_one_work+0x1b4/0x710
    [  +0.000003]
    stack backtrace:
    [  +0.000003] CPU: 4 PID: 1262 Comm: kworker/4:2 Tainted: G        W      ------------   3.10.0-320.el7.rhel72.stable.backport.3.x86_64.debug #1
    [  +0.000001] Hardware name: LENOVO 20EGS0R600/20EGS0R600, BIOS GNET71WW (2.19 ) 02/05/2015
    [  +0.000008] Workqueue: events_long drm_dp_mst_link_probe_work [drm_kms_helper]
    [  +0.000001]  ffffffff82c26c90 00000000a527b914 ffff88046399bae8 ffffffff816fe04d
    [  +0.000004]  ffff88046399bb58 ffffffff8110f47f ffff880461438000 0001009b840fc003
    [  +0.000002]  ffff880461438a98 0000000000000000 0000000804dc26e1 ffffffff824a2c00
    [  +0.000003] Call Trace:
    [  +0.000004]  [<ffffffff816fe04d>] dump_stack+0x19/0x1b
    [  +0.000004]  [<ffffffff8110f47f>] __lock_acquire+0x115f/0x1250
    [  +0.000002]  [<ffffffff8110fd49>] lock_acquire+0x99/0x1e0
    [  +0.000002]  [<ffffffff810b29a5>] ? flush_work+0x5/0x2e0
    [  +0.000002]  [<ffffffff810b29ee>] flush_work+0x4e/0x2e0
    [  +0.000002]  [<ffffffff810b29a5>] ? flush_work+0x5/0x2e0
    [  +0.000004]  [<ffffffff81025905>] ? native_sched_clock+0x35/0x80
    [  +0.000002]  [<ffffffff81025959>] ? sched_clock+0x9/0x10
    [  +0.000002]  [<ffffffff810da1f5>] ? local_clock+0x25/0x30
    [  +0.000002]  [<ffffffff8110dca9>] ? mark_held_locks+0xb9/0x140
    [  +0.000003]  [<ffffffff810b4ed5>] ? __cancel_work_timer+0x95/0x160
    [  +0.000002]  [<ffffffff810b4ee8>] __cancel_work_timer+0xa8/0x160
    [  +0.000002]  [<ffffffff810b4fb0>] cancel_work_sync+0x10/0x20
    [  +0.000007]  [<ffffffffa0160d17>] drm_dp_destroy_mst_branch_device+0x27/0x120 [drm_kms_helper]
    [  +0.000006]  [<ffffffffa0163968>] drm_dp_mst_link_probe_work+0x78/0xa0 [drm_kms_helper]
    [  +0.000002]  [<ffffffff810b5850>] process_one_work+0x220/0x710
    [  +0.000002]  [<ffffffff810b57e4>] ? process_one_work+0x1b4/0x710
    [  +0.000005]  [<ffffffff810b5e5b>] worker_thread+0x11b/0x3a0
    [  +0.000003]  [<ffffffff810b5d40>] ? process_one_work+0x710/0x710
    [  +0.000002]  [<ffffffff810beced>] kthread+0xed/0x100
    [  +0.000003]  [<ffffffff810bec00>] ? insert_kthread_work+0x80/0x80
    [  +0.000003]  [<ffffffff817121d8>] ret_from_fork+0x58/0x90
    
    v2: add flush_work.
    
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    274d8352