"Gautham R. Shenoy" <e...@linux.vnet.ibm.com> writes: > +static inline void snapshot_spurr_idle_entry(void) > +{ > + *this_cpu_ptr(&idle_entry_spurr_snap) = mfspr(SPRN_SPURR); > +} > +
[...] > +static inline void update_idle_spurr_accounting(void) > +{ > + u64 *idle_spurr_cycles_ptr = this_cpu_ptr(&idle_spurr_cycles); > + u64 in_spurr = *this_cpu_ptr(&idle_entry_spurr_snap); > + > + *idle_spurr_cycles_ptr += mfspr(SPRN_SPURR) - in_spurr; > +} [...] > +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(); This samples spurr twice when it could do with just one. I don't know the performance implications, but will the results be coherent?