diff mbox series

[2/4] tools/power turbostat: Add --no-perf option

Message ID 20240112124815.970-3-patryk.wlazlyn@linux.intel.com (mailing list archive)
State Superseded, archived
Delegated to: Len Brown
Headers show
Series turbostat msr, perf controls and aperf/mperf via perf | expand

Commit Message

Patryk Wlazlyn Jan. 12, 2024, 12:48 p.m. UTC
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(-)

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
>
>
diff mbox series

Patch

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();