• Desmond Cheong Zhi Xi's avatar
    drm: avoid blocking in drm_clients_info's rcu section · 5eff9585
    Desmond Cheong Zhi Xi authored
    Inside drm_clients_info, the rcu_read_lock is held to lock
    pid_task()->comm. However, within this protected section, a call to
    drm_is_current_master is made, which involves a mutex lock in a future
    patch. However, this is illegal because the mutex lock might block
    while in the RCU read-side critical section.
    
    Since drm_is_current_master isn't protected by rcu_read_lock, we avoid
    this by moving it out of the RCU critical section.
    
    The following report came from intel-gfx ci's
    igt@debugfs_test@read_all_entries testcase:
    
    =============================
    [ BUG: Invalid wait context ]
    5.13.0-CI-Patchwork_20515+ #1 Tainted: G        W
    -----------------------------
    debugfs_test/1101 is trying to lock:
    ffff888132d901a8 (&dev->master_mutex){+.+.}-{3:3}, at:
    drm_is_current_master+0x1e/0x50
    other info that might help us debug this:
    context-{4:4}
    3 locks held by debugfs_test/1101:
     #0: ffff88810fdffc90 (&p->lock){+.+.}-{3:3}, at:
     seq_read_iter+0x53/0x3b0
     #1: ffff888132d90240 (&dev->filelist_mutex){+.+.}-{3:3}, at:
     drm_clients_info+0x63/0x2a0
     #2: ffffffff82734220 (rcu_read_lock){....}-{1:2}, at:
     drm_clients_info+0x1b1/0x2a0
    stack backtrace:
    CPU: 8 PID: 1101 Comm: debugfs_test Tainted: G        W
    5.13.0-CI-Patchwork_20515+ #1
    Hardware name: Intel Corporation CometLake Client Platform/CometLake S
    UDIMM (ERB/CRB), BIOS CMLSFWR1.R00.1263.D00.1906260926 06/26/2019
    Call Trace:
     dump_stack+0x7f/0xad
     __lock_acquire.cold.78+0x2af/0x2ca
     lock_acquire+0xd3/0x300
     ? drm_is_current_master+0x1e/0x50
     ? __mutex_lock+0x76/0x970
     ? lockdep_hardirqs_on+0xbf/0x130
     __mutex_lock+0xab/0x970
     ? drm_is_current_master+0x1e/0x50
     ? drm_is_current_master+0x1e/0x50
     ? drm_is_current_master+0x1e/0x50
     drm_is_current_master+0x1e/0x50
     drm_clients_info+0x107/0x2a0
     seq_read_iter+0x178/0x3b0
     seq_read+0x104/0x150
     full_proxy_read+0x4e/0x80
     vfs_read+0xa5/0x1b0
     ksys_read+0x5a/0xd0
     do_syscall_64+0x39/0xb0
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    Signed-off-by: default avatarDesmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210712043508.11584-3-desmondcheongzx@gmail.com
    5eff9585
drm_debugfs.c 12 KB