powerpc/sysfs: Show idle_purr and idle_spurr for every CPU

On Pseries LPARs, to calculate utilization, we need to know the
[S]PURR ticks when the CPUs were busy or idle.

The total PURR and SPURR ticks are already exposed via the per-cpu
sysfs files "purr" and "spurr". This patch adds support for exposing
the idle PURR and SPURR ticks via new per-cpu sysfs files named
"idle_purr" and "idle_spurr".

This patch also adds helper functions to accurately read the values of
idle_purr and idle_spurr especially from an interrupt context between
when the interrupt has occurred between the pseries_idle_prolog() and
pseries_idle_epilog(). This will ensure that the idle purr/spurr
values corresponding to the latest idle period is accounted for before
these values are read.

Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/1586249263-14048-5-git-send-email-ego@linux.vnet.ibm.com
This commit is contained in:
Gautham R. Shenoy
2020-04-07 14:17:42 +05:30
committed by Michael Ellerman
parent dc8afce5f4
commit 6909f179ca
2 changed files with 111 additions and 3 deletions

View File

@@ -57,5 +57,37 @@ static inline void pseries_idle_epilog(void)
ppc64_runlatch_on();
}
static inline u64 read_this_idle_purr(void)
{
/*
* If we are reading from an idle context, update the
* idle-purr cycles corresponding to the last idle period.
* Since the idle context is not yet over, take a fresh
* snapshot of the idle-purr.
*/
if (unlikely(get_lppaca()->idle == 1)) {
update_idle_purr_accounting();
snapshot_purr_idle_entry();
}
return be64_to_cpu(get_lppaca()->wait_state_cycles);
}
static inline u64 read_this_idle_spurr(void)
{
/*
* If we are reading from an idle context, update the
* idle-spurr cycles corresponding to the last idle period.
* Since the idle context is not yet over, take a fresh
* snapshot of the idle-spurr.
*/
if (get_lppaca()->idle == 1) {
update_idle_spurr_accounting();
snapshot_spurr_idle_entry();
}
return *this_cpu_ptr(&idle_spurr_cycles);
}
#endif /* CONFIG_PPC_PSERIES */
#endif