• Mark Rutland's avatar
    perf: Drop module reference on event init failure · cc34b98b
    Mark Rutland authored
    When initialising an event, perf_init_event will call try_module_get() to
    ensure that the PMU's module cannot be removed for the lifetime of the
    event, with __free_event() dropping the reference when the event is
    finally destroyed. If something fails after the event has been
    initialised, but before the event is installed, perf_event_alloc will
    drop the reference on the module.
    
    However, if we fail to initialise an event for some reason (e.g. we ask
    an uncore PMU to perform sampling, and it refuses to initialise the
    event), we do not drop the refcount. If we try to open such a bogus
    event without a precise IDR type, we will loop over each PMU in the pmus
    list, incrementing each of their refcounts without decrementing them.
    
    This patch adds a module_put when pmu->event_init(event) fails, ensuring
    that the refcounts are balanced in failure cases. As the innards of the
    precise and search based initialisation look very similar, this logic is
    hoisted out into a new helper function. While the early return for the
    failed try_module_get is removed from the search case, this is handled
    by the remaining return when ret is not -ENOENT.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/1420642611-22667-1-git-send-email-mark.rutland@arm.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    cc34b98b
core.c 201 KB