• Junhao He's avatar
    coresight: ultrasoc-smb: Fix sleep while close preempt in enable_smb · b8411287
    Junhao He authored
    When we to enable the SMB by perf, the perf sched will call perf_ctx_lock()
    to close system preempt in event_function_call(). But SMB::enable_smb() use
    mutex to lock the critical section, which may sleep.
    
     BUG: sleeping function called from invalid context at kernel/locking/mutex.c:580
     in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 153023, name: perf
     preempt_count: 2, expected: 0
     RCU nest depth: 0, expected: 0
     INFO: lockdep is turned off.
     irq event stamp: 0
     hardirqs last  enabled at (0): [<0000000000000000>] 0x0
     hardirqs last disabled at (0): [<ffffa2983f5c5f40>] copy_process+0xae8/0x2b48
     softirqs last  enabled at (0): [<ffffa2983f5c5f40>] copy_process+0xae8/0x2b48
     softirqs last disabled at (0): [<0000000000000000>] 0x0
     CPU: 2 PID: 153023 Comm: perf Kdump: loaded Tainted: G   W  O   6.5.0-rc4+ #1
    
     Call trace:
     ...
      __mutex_lock+0xbc/0xa70
      mutex_lock_nested+0x34/0x48
      smb_update_buffer+0x58/0x360 [ultrasoc_smb]
      etm_event_stop+0x204/0x2d8 [coresight]
      etm_event_del+0x1c/0x30 [coresight]
      event_sched_out+0x17c/0x3b8
      group_sched_out.part.0+0x5c/0x208
      __perf_event_disable+0x15c/0x210
      event_function+0xe0/0x230
      remote_function+0xb4/0xe8
      generic_exec_single+0x160/0x268
      smp_call_function_single+0x20c/0x2a0
      event_function_call+0x20c/0x220
      _perf_event_disable+0x5c/0x90
      perf_event_for_each_child+0x58/0xc0
      _perf_ioctl+0x34c/0x1250
      perf_ioctl+0x64/0x98
     ...
    
    Use spinlock to replace mutex to control driver data access to one at a
    time. The function copy_to_user() may sleep, it cannot be in a spinlock
    context, so we can't simply replace it in smb_read(). But we can ensure
    that only one user gets the SMB device fd by smb_open(), so remove the
    locks from smb_read() and buffer synchronization is guaranteed by the user.
    
    Fixes: 06f5c292 ("drivers/coresight: Add UltraSoc System Memory Buffer driver")
    Signed-off-by: default avatarJunhao He <hejunhao3@huawei.com>
    Reviewed-by: default avatarJames Clark <james.clark@arm.com>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Link: https://lore.kernel.org/r/20231114133346.30489-2-hejunhao3@huawei.com
    b8411287
ultrasoc-smb.h 4.19 KB