powerpc/perf: Fix for core/nest imc call trace on cpuhotplug
authorAnju T Sudhakar <anju@linux.vnet.ibm.com>
Wed, 4 Oct 2017 06:50:52 +0000 (12:20 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 12 Oct 2017 12:11:56 +0000 (23:11 +1100)
commit0d923820c6db1644c27c2d0a5af8920fc0f8cd81
tree08bf11262ad0ca5df40ef095b86a93e1a8359e7c
parent6b2c08f989250c54f31b53dba9ace863a1f3fff6
powerpc/perf: Fix for core/nest imc call trace on cpuhotplug

Nest/core pmu units are enabled only when it is used. A reference count is
maintained for the events which uses the nest/core pmu units. Currently in
*_imc_counters_release function a WARN() is used for notification of any
underflow of ref count.

The case where event ref count hit a negative value is, when perf session is
started, followed by offlining of all cpus in a given core.
i.e. in cpuhotplug offline path ppc_core_imc_cpu_offline() function set the
ref->count to zero, if the current cpu which is about to offline is the last
cpu in a given core and make an OPAL call to disable the engine in that core.
And on perf session termination, perf->destroy (core_imc_counters_release) will
first decrement the ref->count for this core and based on the ref->count value
an opal call is made to disable the core-imc engine.
Now, since cpuhotplug path already clears the ref->count for core and disabled
the engine, perf->destroy() decrementing again at event termination make it
negative which in turn fires the WARN_ON. The same happens for nest units.

Add a check to see if the reference count is alreday zero, before decrementing
the count, so that the ref count will not hit a negative value.

Signed-off-by: Anju T Sudhakar <anju@linux.vnet.ibm.com>
Reviewed-by: Santosh Sivaraj <santosh@fossix.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/perf/imc-pmu.c