Skip to content

Commit cbecc9f

Browse files
Shrikanth Hegdempe
authored andcommitted
powerpc/pseries: fix accuracy of stolen time
powerVM hypervisor updates the VPA fields with stolen time data. It currently reports enqueue_dispatch_tb and ready_enqueue_tb for this purpose. In linux these two fields are used to report the stolen time. The VPA fields are updated at the TB frequency. On powerPC its mostly set at 512Mhz. Hence this needs a conversion to ns when reporting it back as rest of the kernel timings are in ns. This conversion is already handled in tb_to_ns function. So use that function to report accurate stolen time. Observed this issue and used an Capped Shared Processor LPAR(SPLPAR) to simplify the experiments. In all these cases, 100% VP Load is run using stress-ng workload. Values of stolen time is in percentages as reported by mpstat. With the patch values are close to expected. 6.8.rc1 +Patch 12EC/12VP 0.0 0.0 12EC/24VP 25.7 50.2 12EC/36VP 37.3 69.2 12EC/48VP 38.5 78.3 Fixes: 0e8a631 ("powerpc/pseries: Implement CONFIG_PARAVIRT_TIME_ACCOUNTING") Cc: stable@vger.kernel.org # v6.1+ Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20240213052635.231597-1-sshegde@linux.ibm.com
1 parent ea73179 commit cbecc9f

File tree

1 file changed

+6
-2
lines changed
  • arch/powerpc/platforms/pseries

1 file changed

+6
-2
lines changed

arch/powerpc/platforms/pseries/lpar.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -662,8 +662,12 @@ u64 pseries_paravirt_steal_clock(int cpu)
662662
{
663663
struct lppaca *lppaca = &lppaca_of(cpu);
664664

665-
return be64_to_cpu(READ_ONCE(lppaca->enqueue_dispatch_tb)) +
666-
be64_to_cpu(READ_ONCE(lppaca->ready_enqueue_tb));
665+
/*
666+
* VPA steal time counters are reported at TB frequency. Hence do a
667+
* conversion to ns before returning
668+
*/
669+
return tb_to_ns(be64_to_cpu(READ_ONCE(lppaca->enqueue_dispatch_tb)) +
670+
be64_to_cpu(READ_ONCE(lppaca->ready_enqueue_tb)));
667671
}
668672
#endif
669673

0 commit comments

Comments
 (0)