On 7/26/21 9:19 AM, Nicholas Piggin wrote:
It can be useful in simulators (with very constrained environments)
to allow some PMCs to run from boot so they can be sampled directly
by a test harness, rather than having to run perf.

A previous change freezes counters at boot by default, so provide
a boot time option to un-freeze (plus a bit more flexibility).

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
  .../admin-guide/kernel-parameters.txt         |  7 ++++
  arch/powerpc/perf/core-book3s.c               | 35 +++++++++++++++++++
  2 files changed, 42 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt 
b/Documentation/admin-guide/kernel-parameters.txt
index bdb22006f713..96b7d0ebaa40 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4089,6 +4089,13 @@
                        Override pmtimer IOPort with a hex value.
                        e.g. pmtmr=0x508

+       pmu=            [PPC] Manually enable the PMU.


This is bit confusing, IIUC, we are manually disabling the perf registration
with this option and not pmu. If this option is used, we will unfreeze the
MMCR0_FC (only in the HV_mode) and not register perf subsystem.
Since this option is valid only for HV_mode, canwe call it
kvm_disable_perf or kvm_dis_perf.


+                       Enable the PMU by setting MMCR0 to 0 (clear FC bit).
+                       This option is implemented for Book3S processors.
+                       If a number is given, then MMCR1 is set to that number,
+                       otherwise (e.g., 'pmu=on'), it is left 0. The perf
+                       subsystem is disabled if this option is used.
+
        pm_debug_messages       [SUSPEND,KNL]
                        Enable suspend/resume debug messages during boot up.

diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
index 65795cadb475..e7cef4fe17d7 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ b/arch/powerpc/perf/core-book3s.c
@@ -2428,8 +2428,24 @@ int register_power_pmu(struct power_pmu *pmu)
  }

  #ifdef CONFIG_PPC64
+static bool pmu_override = false;
+static unsigned long pmu_override_val;
+static void do_pmu_override(void *data)
+{
+       ppc_set_pmu_inuse(1);
+       if (pmu_override_val)
+               mtspr(SPRN_MMCR1, pmu_override_val);
+       mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC);
+}
+
  static int __init init_ppc64_pmu(void)
  {
+       if (cpu_has_feature(CPU_FTR_HVMODE) && pmu_override) {
+               printk(KERN_WARNING "perf: disabling perf due to pmu= command line 
option.\n");
+               on_each_cpu(do_pmu_override, NULL, 1);
+               return 0;
+       }
+
        /* run through all the pmu drivers one at a time */
        if (!init_power5_pmu())
                return 0;
@@ -2451,4 +2467,23 @@ static int __init init_ppc64_pmu(void)
                return init_generic_compat_pmu();
  }
  early_initcall(init_ppc64_pmu);
+
+static int __init pmu_setup(char *str)
+{
+       unsigned long val;
+
+       if (!early_cpu_has_feature(CPU_FTR_HVMODE))
+               return 0;
+
+       pmu_override = true;
+
+       if (kstrtoul(str, 0, &val))
+               val = 0;
+
+       pmu_override_val = val;
+
+       return 1;
+}
+__setup("pmu=", pmu_setup);
+
  #endif

Reply via email to