tools/power turbostat: Enable non-privileged users to read sysfs counters
authorPatryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
Thu, 25 Apr 2024 15:54:18 +0000 (17:54 +0200)
committerLen Brown <len.brown@intel.com>
Wed, 1 May 2024 04:04:25 +0000 (00:04 -0400)
A group of counters called "sysfs" displays software
C-state request counts and resulting perceived C-state residency.

They are not built-in counters that turbostat knows about ahead of time,
rather they are discovered in sysfs when turbostat starts.

Thus, they are added dynamically, using the same interface
as user-added MSR counters.

When turbostat enters "no-msr" mode, such as when running as a
non-privileged user, it clears all added counters.

Updating that to clear only actual MSR added counters
allows regular users to see the sysfs counters.

[lenb: commit message]

Signed-off-by: Patryk Wlazlyn <patryk.wlazlyn@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
tools/power/x86/turbostat/turbostat.c

index bd6cb31b70996db27000d9a4b3d8c90b77f441db..f92b46cfda31bbdc5520247cc78e8ebdb7ef73c0 100644 (file)
@@ -1377,36 +1377,42 @@ struct sys_counters {
        struct msr_counter *pp;
 } sys;
 
-void free_sys_counters(void)
+static size_t free_msr_counters_(struct msr_counter **pp)
 {
-       struct msr_counter *p = sys.tp, *pnext = NULL;
+       struct msr_counter *p = NULL;
+       size_t num_freed = 0;
 
-       while (p) {
-               pnext = p->next;
-               free(p);
-               p = pnext;
-       }
+       while (*pp) {
+               p = *pp;
 
-       p = sys.cp, pnext = NULL;
-       while (p) {
-               pnext = p->next;
-               free(p);
-               p = pnext;
-       }
+               if (p->msr_num != 0) {
+                       *pp = p->next;
 
-       p = sys.pp, pnext = NULL;
-       while (p) {
-               pnext = p->next;
-               free(p);
-               p = pnext;
+                       free(p);
+                       ++num_freed;
+
+                       continue;
+               }
+
+               pp = &p->next;
        }
 
-       sys.added_thread_counters = 0;
-       sys.added_core_counters = 0;
-       sys.added_package_counters = 0;
-       sys.tp = NULL;
-       sys.cp = NULL;
-       sys.pp = NULL;
+       return num_freed;
+}
+
+/*
+ * Free all added counters accessed via msr.
+ */
+static void free_sys_msr_counters(void)
+{
+       /* Thread counters */
+       sys.added_thread_counters -= free_msr_counters_(&sys.tp);
+
+       /* Core counters */
+       sys.added_core_counters -= free_msr_counters_(&sys.cp);
+
+       /* Package counters */
+       sys.added_package_counters -= free_msr_counters_(&sys.pp);
 }
 
 struct system_summary {
@@ -1566,7 +1572,7 @@ static void bic_disable_msr_access(void)
 
        bic_enabled &= ~bic_msrs;
 
-       free_sys_counters();
+       free_sys_msr_counters();
 }
 
 static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags)