<html><body><p><tt><font size="2">Kajol Jain <kjain@linux.ibm.com> wrote on 13/11/2019 09:40:56 PM:<br><br>> From: Kajol Jain <kjain@linux.ibm.com></font></tt><br><tt><font size="2">> To: linuxppc-dev@lists.ozlabs.org, mpe@ellerman.id.au</font></tt><br><tt><font size="2">> Cc: kjain@linux.ibm.com, anju@linux.vnet.ibm.com, maddy@linux.vnet.ibm.com</font></tt><br><tt><font size="2">> Date: 26/11/2019 10:16 AM</font></tt><br><tt><font size="2">> Subject: [EXTERNAL] [PATCH v2] powerpc/kernel/sysfs: Add PMU_SYSFS <br>> config option to enable PMU SPRs sysfs file creation</font></tt><br><tt><font size="2">> <br>> Many of the performance moniroting unit (PMU) SPRs are<br>> exposed in the sysfs. "perf" API is the primary interface to program<br>> PMU and collect counter data in the system. So expose these<br>> PMU SPRs in the absence of CONFIG_PERF_EVENTS.<br>> <br>> Patch adds a new CONFIG option 'CONFIG_PMU_SYSFS'. The new config<br>> option used in kernel/sysfs.c for PMU SPRs sysfs file creation and<br>> this new option is enabled only if 'CONFIG_PERF_EVENTS' option is<br>> disabled.<br>> <br>> Tested this patch with enable/disable CONFIG_PERF_EVENTS option<br>> in powernv and pseries machines.<br>> Also did compilation testing for different architecture include:<br>> x86, mips, mips64, alpha, arm. And with book3s_32.config option.<br>> <br>> Signed-off-by: Kajol Jain <kjain@linux.ibm.com><br>> ---<br>>  arch/powerpc/kernel/sysfs.c            | 21 +++++++++++++++++++++<br>>  arch/powerpc/platforms/Kconfig.cputype |  8 ++++++++<br>>  2 files changed, 29 insertions(+)<br></font></tt><br><tt><font size="2">Tested-by: Nageswara R Sastry <nasastry@in.ibm.com></font></tt><br><tt><font size="2" color="#1D1C1D">Tested using the following different scenarios:<br>1. CONFIG_PERF_EVENT - enabled, CONFIG_PMU_SYSFS - disabled,</font></tt><br><tt><font size="2" color="#1D1C1D">RESULT: not seen any sysfs files(mmrc*, pmc*) from /sys/bus/cpu/devices/cpu?/<br>2. CONFIG_PERF_EVENT - disabled, CONFIG_PMU_SYSFS - enabled,</font></tt><br><tt><font size="2" color="#1D1C1D">RESULT: seen any sysfs files(mmrc*, pmc*) from /sys/bus/cpu/devices/cpu?/<br>3. CONFIG_PERF_EVENT -disabled, CONFIG_PMU_SYSFS - disabled,</font></tt><br><tt><font size="2" color="#1D1C1D">RESULT: not possible, any one of the config options need to be enabled.<br>4. CONFIG_PERF_EVENT -enabled, CONFIG_PMU_SYSFS - enabled,</font></tt><br><tt><font size="2" color="#1D1C1D">RESULT: not possible, any one of the config options need to be enabled.</font></tt><br><br><tt><font size="2">> <br>> ---<br>> Changelog:<br>> v1 -> v2<br>> - Added new config option 'PMU_SYSFS' for PMU SPR's creation<br>>   rather than using PERF_EVENTS config option directly and make<br>>   sure SPR's file creation only if 'CONFIG_PERF_EVENTS' disabled.<br>> ---<br>> diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c<br>> index 80a676da11cb..b7c01f1ef236 100644<br>> --- a/arch/powerpc/kernel/sysfs.c<br>> +++ b/arch/powerpc/kernel/sysfs.c<br>> @@ -457,16 +457,21 @@ static ssize_t __used \<br>>  <br>>  #if defined(CONFIG_PPC64)<br>>  #define HAS_PPC_PMC_CLASSIC   1<br>> +#ifdef CONFIG_PMU_SYSFS<br>>  #define HAS_PPC_PMC_IBM      1<br>> +#endif<br>>  #define HAS_PPC_PMC_PA6T   1<br>>  #elif defined(CONFIG_PPC_BOOK3S_32)<br>>  #define HAS_PPC_PMC_CLASSIC   1<br>> +#ifdef CONFIG_PMU_SYSFS<br>>  #define HAS_PPC_PMC_IBM      1<br>>  #define HAS_PPC_PMC_G4      1<br>>  #endif<br>> +#endif<br>>  <br>>  <br>>  #ifdef HAS_PPC_PMC_CLASSIC<br>> +#ifdef CONFIG_PMU_SYSFS<br>>  SYSFS_PMCSETUP(mmcr0, SPRN_MMCR0);<br>>  SYSFS_PMCSETUP(mmcr1, SPRN_MMCR1);<br>>  SYSFS_PMCSETUP(pmc1, SPRN_PMC1);<br>> @@ -485,6 +490,10 @@ SYSFS_PMCSETUP(pmc7, SPRN_PMC7);<br>>  SYSFS_PMCSETUP(pmc8, SPRN_PMC8);<br>>  <br>>  SYSFS_PMCSETUP(mmcra, SPRN_MMCRA);<br>> +#endif /* CONFIG_PPC64 */<br>> +#endif /* CONFIG_PMU_SYSFS */<br>> +<br>> +#ifdef CONFIG_PPC64<br>>  SYSFS_SPRSETUP(purr, SPRN_PURR);<br>>  SYSFS_SPRSETUP(spurr, SPRN_SPURR);<br>>  SYSFS_SPRSETUP(pir, SPRN_PIR);<br>> @@ -495,7 +504,9 @@ SYSFS_SPRSETUP(tscr, SPRN_TSCR);<br>>    enable write when needed with a separate function.<br>>    Lets be conservative and default to pseries.<br>>  */<br>> +#ifdef CONFIG_PMU_SYSFS<br>>  static DEVICE_ATTR(mmcra, 0600, show_mmcra, store_mmcra);<br>> +#endif /* CONFIG_PMU_SYSFS */<br>>  static DEVICE_ATTR(spurr, 0400, show_spurr, NULL);<br>>  static DEVICE_ATTR(purr, 0400, show_purr, store_purr);<br>>  static DEVICE_ATTR(pir, 0400, show_pir, NULL);<br>> @@ -606,12 +617,14 @@ static void sysfs_create_dscr_default(void)<br>>  #endif /* CONFIG_PPC64 */<br>>  <br>>  #ifdef HAS_PPC_PMC_PA6T<br>> +#ifdef CONFIG_PMU_SYSFS<br>>  SYSFS_PMCSETUP(pa6t_pmc0, SPRN_PA6T_PMC0);<br>>  SYSFS_PMCSETUP(pa6t_pmc1, SPRN_PA6T_PMC1);<br>>  SYSFS_PMCSETUP(pa6t_pmc2, SPRN_PA6T_PMC2);<br>>  SYSFS_PMCSETUP(pa6t_pmc3, SPRN_PA6T_PMC3);<br>>  SYSFS_PMCSETUP(pa6t_pmc4, SPRN_PA6T_PMC4);<br>>  SYSFS_PMCSETUP(pa6t_pmc5, SPRN_PA6T_PMC5);<br>> +#endif /* CONFIG_PMU_SYSFS */<br>>  #ifdef CONFIG_DEBUG_MISC<br>>  SYSFS_SPRSETUP(hid0, SPRN_HID0);<br>>  SYSFS_SPRSETUP(hid1, SPRN_HID1);<br>> @@ -644,6 +657,7 @@ SYSFS_SPRSETUP(tsr3, SPRN_PA6T_TSR3);<br>>  #endif /* CONFIG_DEBUG_MISC */<br>>  #endif /* HAS_PPC_PMC_PA6T */<br>>  <br>> +#ifdef CONFIG_PMU_SYSFS<br>>  #ifdef HAS_PPC_PMC_IBM<br>>  static struct device_attribute ibm_common_attrs[] = {<br>>     __ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0),<br>> @@ -671,9 +685,11 @@ static struct device_attribute classic_pmc_attrs[] = {<br>>     __ATTR(pmc8, 0600, show_pmc8, store_pmc8),<br>>  #endif<br>>  };<br>> +#endif /* CONFIG_PMU_SYSFS */<br>>  <br>>  #ifdef HAS_PPC_PMC_PA6T<br>>  static struct device_attribute pa6t_attrs[] = {<br>> +#ifdef CONFIG_PMU_SYSFS<br>>     __ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0),<br>>     __ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1),<br>>     __ATTR(pmc0, 0600, show_pa6t_pmc0, store_pa6t_pmc0),<br>> @@ -682,6 +698,7 @@ static struct device_attribute pa6t_attrs[] = {<br>>     __ATTR(pmc3, 0600, show_pa6t_pmc3, store_pa6t_pmc3),<br>>     __ATTR(pmc4, 0600, show_pa6t_pmc4, store_pa6t_pmc4),<br>>     __ATTR(pmc5, 0600, show_pa6t_pmc5, store_pa6t_pmc5),<br>> +#endif /* CONFIG_PMU_SYSFS */<br>>  #ifdef CONFIG_DEBUG_MISC<br>>     __ATTR(hid0, 0600, show_hid0, store_hid0),<br>>     __ATTR(hid1, 0600, show_hid1, store_hid1),<br>> @@ -787,8 +804,10 @@ static int register_cpu_online(unsigned int cpu)<br>>           device_create_file(s, &pmc_attrs[i]);<br>>  <br>>  #ifdef CONFIG_PPC64<br>> +#ifdef CONFIG_PMU_SYSFS<br>>     if (cpu_has_feature(CPU_FTR_MMCRA))<br>>        device_create_file(s, &dev_attr_mmcra);<br>> +#endif /* CONFIG_PMU_SYSFS */<br>>  <br>>     if (cpu_has_feature(CPU_FTR_PURR)) {<br>>        if (!firmware_has_feature(FW_FEATURE_LPAR))<br>> @@ -876,8 +895,10 @@ static int unregister_cpu_online(unsigned int cpu)<br>>           device_remove_file(s, &pmc_attrs[i]);<br>>  <br>>  #ifdef CONFIG_PPC64<br>> +#ifdef CONFIG_PMU_SYSFS<br>>     if (cpu_has_feature(CPU_FTR_MMCRA))<br>>        device_remove_file(s, &dev_attr_mmcra);<br>> +#endif /* CONFIG_PMU_SYSFS */<br>>  <br>>     if (cpu_has_feature(CPU_FTR_PURR))<br>>        device_remove_file(s, &dev_attr_purr);<br>> diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/<br>> platforms/Kconfig.cputype<br>> index 12543e53fa96..f3ad579c559f 100644<br>> --- a/arch/powerpc/platforms/Kconfig.cputype<br>> +++ b/arch/powerpc/platforms/Kconfig.cputype<br>> @@ -417,6 +417,14 @@ config PPC_MM_SLICES<br>>  config PPC_HAVE_PMU_SUPPORT<br>>         bool<br>>  <br>> +config PMU_SYSFS<br>> +   bool<br>> +   default y if !PERF_EVENTS<br>> +   help<br>> +     This option enables PMU SPR sysfs file creation. Since PMU SPRs are<br>> +     intended to be used via "perf" interface, config option is enabled<br>> +     only when CONFIG_PERF_EVENTS is disabled.<br>> +<br>>  config PPC_PERF_CTRS<br>>         def_bool y<br>>         depends on PERF_EVENTS && PPC_HAVE_PMU_SUPPORT<br>> -- <br>> 2.12.3<br>> <br></font></tt><BR>
</body></html>