diff --git a/patches.suse/powerpc-pseries-Account-for-SPURR-ticks-on-idle-CPUs.patch b/patches.suse/powerpc-pseries-Account-for-SPURR-ticks-on-idle-CPUs.patch new file mode 100644 index 0000000..3d6bf29 --- /dev/null +++ b/patches.suse/powerpc-pseries-Account-for-SPURR-ticks-on-idle-CPUs.patch @@ -0,0 +1,95 @@ +From dc8afce5f45b099e3ea52a16b2f90e92f90f3af0 Mon Sep 17 00:00:00 2001 +From: "Gautham R. Shenoy" +Date: Tue, 7 Apr 2020 14:17:41 +0530 +Subject: [PATCH] powerpc/pseries: Account for SPURR ticks on idle CPUs + +References: PED-3947 bsc#1210544 ltc#202303 +Patch-mainline: v5.8-rc1 +Git-commit: dc8afce5f45b099e3ea52a16b2f90e92f90f3af0 + +On Pseries LPARs, to calculate utilization, we need to know the +[S]PURR ticks when the CPUs were busy or idle. + +Via pseries_idle_prolog(), pseries_idle_epilog(), we track the idle +PURR ticks in the VPA variable "wait_state_cycles". This patch extends +the support to account for the idle SPURR ticks. + +Signed-off-by: Gautham R. Shenoy +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/1586249263-14048-4-git-send-email-ego@linux.vnet.ibm.com +Acked-by: Michal Suchanek +--- + arch/powerpc/include/asm/idle.h | 17 +++++++++++++++++ + arch/powerpc/platforms/pseries/setup.c | 2 ++ + 2 files changed, 19 insertions(+) + +diff --git a/arch/powerpc/include/asm/idle.h b/arch/powerpc/include/asm/idle.h +index b90d75aa1f9e..0efb25071d87 100644 +--- a/arch/powerpc/include/asm/idle.h ++++ b/arch/powerpc/include/asm/idle.h +@@ -5,13 +5,20 @@ + #include + + #ifdef CONFIG_PPC_PSERIES ++DECLARE_PER_CPU(u64, idle_spurr_cycles); + DECLARE_PER_CPU(u64, idle_entry_purr_snap); ++DECLARE_PER_CPU(u64, idle_entry_spurr_snap); + + static inline void snapshot_purr_idle_entry(void) + { + *this_cpu_ptr(&idle_entry_purr_snap) = mfspr(SPRN_PURR); + } + ++static inline void snapshot_spurr_idle_entry(void) ++{ ++ *this_cpu_ptr(&idle_entry_spurr_snap) = mfspr(SPRN_SPURR); ++} ++ + static inline void update_idle_purr_accounting(void) + { + u64 wait_cycles; +@@ -22,10 +29,19 @@ static inline void update_idle_purr_accounting(void) + get_lppaca()->wait_state_cycles = cpu_to_be64(wait_cycles); + } + ++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 void pseries_idle_prolog(void) + { + ppc64_runlatch_off(); + snapshot_purr_idle_entry(); ++ snapshot_spurr_idle_entry(); + /* + * Indicate to the HV that we are idle. Now would be + * a good time to find other work to dispatch. +@@ -36,6 +52,7 @@ static inline void pseries_idle_prolog(void) + static inline void pseries_idle_epilog(void) + { + update_idle_purr_accounting(); ++ update_idle_spurr_accounting(); + get_lppaca()->idle = 0; + ppc64_runlatch_on(); + } +diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c +index 4905c965e111..1b55e804927d 100644 +--- a/arch/powerpc/platforms/pseries/setup.c ++++ b/arch/powerpc/platforms/pseries/setup.c +@@ -318,7 +318,9 @@ static int alloc_dispatch_log_kmem_cache(void) + } + machine_early_initcall(pseries, alloc_dispatch_log_kmem_cache); + ++DEFINE_PER_CPU(u64, idle_spurr_cycles); + DEFINE_PER_CPU(u64, idle_entry_purr_snap); ++DEFINE_PER_CPU(u64, idle_entry_spurr_snap); + static void pseries_lpar_idle(void) + { + /* +-- +2.40.0 + diff --git a/series.conf b/series.conf index 8ec3be2..3c5cc87 100644 --- a/series.conf +++ b/series.conf @@ -56767,6 +56767,7 @@ patches.suse/drivers-soc-ti-knav_qmss_queue-Make-knav_gp_range_op.patch patches.suse/powerpc-Move-idle_loop_prolog-epilog-functions-to-he.patch patches.suse/powerpc-idle-Store-PURR-snapshot-in-a-per-cpu-global.patch + patches.suse/powerpc-pseries-Account-for-SPURR-ticks-on-idle-CPUs.patch patches.suse/powerpc-eeh-Fix-pseries_eeh_configure_bridge.patch patches.suse/powerpc-pseries-ras-Avoid-calling-rtas_token-in-NMI-.patch patches.suse/powerpc-pseries-ras-Fix-FWNMI_VALID-off-by-one.patch