• James Clark's avatar
    perf: Fix perf_event_pmu_context serialization · 4f64a6c9
    James Clark authored
    Syzkaller triggered a WARN in put_pmu_ctx().
    
      WARNING: CPU: 1 PID: 2245 at kernel/events/core.c:4925 put_pmu_ctx+0x1f0/0x278
    
    This is because there is no locking around the access of "if
    (!epc->ctx)" in find_get_pmu_context() and when it is set to NULL in
    put_pmu_ctx().
    
    The decrement of the reference count in put_pmu_ctx() also happens
    outside of the spinlock, leading to the possibility of this order of
    events, and the context being cleared in put_pmu_ctx(), after its
    refcount is non zero:
    
     CPU0                                   CPU1
     find_get_pmu_context()
       if (!epc->ctx) == false
                                            put_pmu_ctx()
                                            atomic_dec_and_test(&epc->refcount) == true
                                            epc->refcount == 0
         atomic_inc(&epc->refcount);
         epc->refcount == 1
                                            list_del_init(&epc->pmu_ctx_entry);
    	                                      epc->ctx = NULL;
    
    Another issue is that WARN_ON for no active PMU events in put_pmu_ctx()
    is outside of the lock. If the perf_event_pmu_context is an embedded
    one, even after clearing it, it won't be deleted and can be re-used. So
    the warning can trigger. For this reason it also needs to be moved
    inside the lock.
    
    The above warning is very quick to trigger on Arm by running these two
    commands at the same time:
    
      while true; do perf record -- ls; done
      while true; do perf record -- ls; done
    
    [peterz: atomic_dec_and_raw_lock*()]
    Fixes: bd275681 ("perf: Rewrite core context handling")
    Reported-by: syzbot+697196bc0265049822bd@syzkaller.appspotmail.com
    Signed-off-by: default avatarJames Clark <james.clark@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
    Link: https://lore.kernel.org/r/20230127143141.1782804-2-james.clark@arm.com
    4f64a6c9
core.c 329 KB