mbox series

[0/4] turbostat msr, perf controls and aperf/mperf via perf

Message ID 20240112124815.970-1-patryk.wlazlyn@linux.intel.com
Headers show
Series turbostat msr, perf controls and aperf/mperf via perf | expand

Message

Patryk Wlazlyn Jan. 12, 2024, 12:48 p.m. UTC
Hi Len!

Hope you had a teriffic Christmas break ;]

Sending the patches for tubostat that add --no-msr and --no-perf
options.  Rebased on top of v6.7.  The last patch also adds getting
aperf and mperf counters via perf API, which I believe you breifly
looked at, but It was before I rebased and had to make few more changes
since, so I expect some more comments on that.

Happy 2024!

Comments

Len Brown Jan. 13, 2024, 1:03 a.m. UTC | #1
Looks good,
but it depends on 1/4, which you are about to change, so I'll wait for
the refresh.

thanks,
-Len

On Fri, Jan 12, 2024 at 6:49 AM Patryk Wlazlyn
<patryk.wlazlyn@linux.intel.com> wrote:
>
> Add the --no-perf option to allow users to run turbostat without
> accessing perf.
>
> Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
> Reviewed-by: Len Brown <len.brown@intel.com>
> ---
>  tools/power/x86/turbostat/turbostat.8 |  2 ++
>  tools/power/x86/turbostat/turbostat.c | 26 +++++++++++++++++++++++---
>  2 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8
> index 5575c947134d..8d3d9cac27e0 100644
> --- a/tools/power/x86/turbostat/turbostat.8
> +++ b/tools/power/x86/turbostat/turbostat.8
> @@ -69,6 +69,8 @@ The column name "all" can be used to enable all disabled-by-default built-in cou
>  .PP
>  +\fB--no-msr\fP Disable all the uses of the MSR driver.
>  +.PP
> ++\fB--no-perf\fP Disable all the uses of the perf API.
> ++.PP
>  \fB--interval seconds\fP overrides the default 5.0 second measurement interval.
>  .PP
>  \fB--num_iterations num\fP number of the measurement iterations.
> diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
> index f192d75d5977..ba10a10c5144 100644
> --- a/tools/power/x86/turbostat/turbostat.c
> +++ b/tools/power/x86/turbostat/turbostat.c
> @@ -265,6 +265,7 @@ unsigned int has_hwp_pkg;   /* IA32_HWP_REQUEST_PKG */
>  unsigned int first_counter_read = 1;
>  int ignore_stdin;
>  bool no_msr;
> +bool no_perf;
>
>  int get_msr(int cpu, off_t offset, unsigned long long *msr);
>
> @@ -1321,8 +1322,17 @@ static void bic_disable_msr_access(void)
>         bic_enabled &= ~bic_msrs;
>  }
>
> +static void bic_disable_perf_access(void)
> +{
> +       const unsigned long bic_perf = BIC_IPC;
> +
> +       bic_enabled &= ~bic_perf;
> +}
> +
>  static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags)
>  {
> +       assert(!no_perf);
> +
>         return syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
>  }
>
> @@ -1339,8 +1349,9 @@ static int perf_instr_count_open(int cpu_num)
>         /* counter for cpu_num, including user + kernel and all processes */
>         fd = perf_event_open(&pea, -1, cpu_num, -1, 0);
>         if (fd == -1) {
> -               warnx("capget(CAP_PERFMON) failed, try \"# setcap cap_sys_admin=ep %s\"", progname);
> -               BIC_NOT_PRESENT(BIC_IPC);
> +               warnx("capget(CAP_PERFMON) failed, try \"# setcap cap_sys_admin=ep %s\""
> +                     " or use --no-perf", progname);
> +               bic_disable_perf_access();
>         }
>
>         return fd;
> @@ -1406,6 +1417,7 @@ void help(void)
>                 "  -J, --Joules displays energy in Joules instead of Watts\n"
>                 "  -l, --list   list column headers only\n"
>                 "  -M, --no-msr Disable all uses of the MSR driver\n"
> +               "  -P, --no-perf Disable all uses of the perf API\n"
>                 "  -n, --num_iterations num\n"
>                 "               number of the measurement iterations\n"
>                 "  -N, --header_iterations num\n"
> @@ -6676,6 +6688,7 @@ void cmdline(int argc, char **argv)
>                 { "out", required_argument, 0, 'o' },
>                 { "quiet", no_argument, 0, 'q' },
>                 { "no-msr", no_argument, 0, 'M' },
> +               { "no-perf", no_argument, 0, 'P' },
>                 { "show", required_argument, 0, 's' },
>                 { "Summary", no_argument, 0, 'S' },
>                 { "TCC", required_argument, 0, 'T' },
> @@ -6689,11 +6702,14 @@ void cmdline(int argc, char **argv)
>          * Parse some options early, because they may make other options invalid,
>          * like adding the MSR counter with --add and at the same time using --no-msr.
>          */
> -       while ((opt = getopt_long_only(argc, argv, "M", long_options, &option_index)) != -1) {
> +       while ((opt = getopt_long_only(argc, argv, "MP", long_options, &option_index)) != -1) {
>                 switch (opt) {
>                 case 'M':
>                         no_msr = 1;
>                         break;
> +               case 'P':
> +                       no_perf = 1;
> +                       break;
>                 default:
>                         break;
>                 }
> @@ -6759,6 +6775,7 @@ void cmdline(int argc, char **argv)
>                         quiet = 1;
>                         break;
>                 case 'M':
> +               case 'P':
>                         /* Parsed earlier */
>                         break;
>                 case 'n':
> @@ -6824,6 +6841,9 @@ int main(int argc, char **argv)
>         if (no_msr)
>                 bic_disable_msr_access();
>
> +       if (no_perf)
> +               bic_disable_perf_access();
> +
>         if (!quiet) {
>                 print_version();
>                 print_bootcmd();
> --
> 2.43.0
>
>
Len Brown Jan. 13, 2024, 1:15 a.m. UTC | #2
Applied.

This patch can be found on the latest development turbostat branch, here:

git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux.git turbostat

thanks!
-Len

On Fri, Jan 12, 2024 at 6:49 AM Patryk Wlazlyn
<patryk.wlazlyn@linux.intel.com> wrote:
>
> Earlier we printed "microcode 0x0" if we failed to obtain it via MSR.
>
> Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
> Reviewed-by: Len Brown <len.brown@intel.com>
> ---
>  tools/power/x86/turbostat/turbostat.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
> index ba10a10c5144..bf733e7d73b5 100644
> --- a/tools/power/x86/turbostat/turbostat.c
> +++ b/tools/power/x86/turbostat/turbostat.c
> @@ -5710,6 +5710,7 @@ void process_cpuid()
>         unsigned int eax, ebx, ecx, edx;
>         unsigned int fms, family, model, stepping, ecx_flags, edx_flags;
>         unsigned long long ucode_patch = 0;
> +       bool ucode_patch_valid = false;
>
>         eax = ebx = ecx = edx = 0;
>
> @@ -5740,6 +5741,8 @@ void process_cpuid()
>         if (!no_msr) {
>                 if (get_msr(sched_getcpu(), MSR_IA32_UCODE_REV, &ucode_patch))
>                         warnx("get_msr(UCODE)");
> +               else
> +                       ucode_patch_valid = true;
>         }
>
>         /*
> @@ -5751,9 +5754,12 @@ void process_cpuid()
>         __cpuid(0x80000000, max_extended_level, ebx, ecx, edx);
>
>         if (!quiet) {
> -               fprintf(outf, "CPUID(1): family:model:stepping 0x%x:%x:%x (%d:%d:%d) microcode 0x%x\n",
> -                       family, model, stepping, family, model, stepping,
> -                       (unsigned int)((ucode_patch >> 32) & 0xFFFFFFFF));
> +               fprintf(outf, "CPUID(1): family:model:stepping 0x%x:%x:%x (%d:%d:%d)",
> +                       family, model, stepping, family, model, stepping);
> +               if (ucode_patch_valid)
> +                       fprintf(outf, " microcode 0x%x", (unsigned int)((ucode_patch >> 32) & 0xFFFFFFFF));
> +               fputc('\n', outf);
> +
>                 fprintf(outf, "CPUID(0x80000000): max_extended_levels: 0x%x\n", max_extended_level);
>                 fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n",
>                         ecx_flags & (1 << 0) ? "SSE3" : "-",
> --
> 2.43.0
>
>