• Namhyung Kim's avatar
    perf/x86: Fix lockdep warning in for_each_sibling_event() on SPR · 27c68c21
    Namhyung Kim authored
    On SPR, the load latency event needs an auxiliary event in the same
    group to work properly.  There's a check in intel_pmu_hw_config()
    for this to iterate sibling events and find a mem-loads-aux event.
    
    The for_each_sibling_event() has a lockdep assert to make sure if it
    disabled hardirq or hold leader->ctx->mutex.  This works well if the
    given event has a separate leader event since perf_try_init_event()
    grabs the leader->ctx->mutex to protect the sibling list.  But it can
    cause a problem when the event itself is a leader since the event is
    not initialized yet and there's no ctx for the event.
    
    Actually I got a lockdep warning when I run the below command on SPR,
    but I guess it could be a NULL pointer dereference.
    
      $ perf record -d -e cpu/mem-loads/uP true
    
    The code path to the warning is:
    
      sys_perf_event_open()
        perf_event_alloc()
          perf_init_event()
            perf_try_init_event()
              x86_pmu_event_init()
                hsw_hw_config()
                  intel_pmu_hw_config()
                    for_each_sibling_event()
                      lockdep_assert_event_ctx()
    
    We don't need for_each_sibling_event() when it's a standalone event.
    Let's return the error code directly.
    
    Fixes: f3c0eba2 ("perf: Add a few assertions")
    Reported-by: default avatarGreg Thelen <gthelen@google.com>
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20230704181516.3293665-1-namhyung@kernel.org
    27c68c21
core.c 196 KB