Hello community,

here is the log from the commit of package cpupower for openSUSE:Factory 
checked in at 2017-10-21 20:21:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/cpupower (Old)
 and      /work/SRC/openSUSE:Factory/.cpupower.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "cpupower"

Sat Oct 21 20:21:41 2017 rev:33 rq:535513 version:4.11

Changes:
--------
--- /work/SRC/openSUSE:Factory/cpupower/cpupower.changes        2017-10-07 
17:52:49.797594957 +0200
+++ /work/SRC/openSUSE:Factory/.cpupower.new/cpupower.changes   2017-10-21 
20:21:42.695180852 +0200
@@ -1,0 +2,9 @@
+Fri Oct 20 15:09:15 UTC 2017 - tr...@suse.de
+
+fate#321274
+- Provide rapl domain info (cpupower powercap-info cmd)
+* Add: cpupower_rapl.patch
+- Provide rapl power monitoring
+* Add: rapl_monitor.patch
+
+-------------------------------------------------------------------

New:
----
  cpupower_rapl.patch
  rapl_monitor.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ cpupower.spec ++++++
--- /var/tmp/diff_new_pack.Ks2uJj/_old  2017-10-21 20:21:43.311152007 +0200
+++ /var/tmp/diff_new_pack.Ks2uJj/_new  2017-10-21 20:21:43.315151821 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package cpupower
 #
-# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
 # Author: Thomas Renninger <tr...@suse.de>
 #
 # All modifications and additions to the file contributed by third parties
@@ -31,6 +31,9 @@
 Source1:        turbostat-%tsversion.tar.bz2
 Source2:        cpupower_export_tarball_from_git.sh
 
+Patch1:         cpupower_rapl.patch
+Patch2:         rapl_monitor.patch
+
 Patch20:        turbostat_fix_man_perm.patch
 Patch22:        turbostat_makefile_fix_asm_header.patch
 # Fixes bsc#1048546:
@@ -79,6 +82,8 @@
 
 %prep
 %setup -D -b 1
+%patch1 -p1
+%patch2 -p1
 cd ../turbostat-%tsversion
 %patch20 -p1
 %patch22 -p1
@@ -144,6 +149,7 @@
 %defattr(-,root,root)
 %_includedir/cpufreq.h
 %_includedir/cpuidle.h
+/usr/include/powercap.h
 %_libdir/libcpu*.so
 
 %changelog

++++++ cpupower_rapl.patch ++++++
++++ 647 lines (skipped)

++++++ rapl_monitor.patch ++++++
cpupower: rapl monitor - shows the used power consumption in uj for each rapl 
domain


Signed-off-by: Thomas Renninger <tr...@suse.com>

diff --git a/Makefile b/Makefile
index bf968ec..9e746be 100644
--- a/Makefile
+++ b/Makefile
@@ -136,6 +136,7 @@ UTIL_OBJS =  utils/helpers/amd.o utils/helpers/msr.o \
        utils/idle_monitor/hsw_ext_idle.o \
        utils/idle_monitor/amd_fam14h_idle.o utils/idle_monitor/cpuidle_sysfs.o 
\
        utils/idle_monitor/mperf_monitor.o 
utils/idle_monitor/cpupower-monitor.o \
+       utils/idle_monitor/rapl_monitor.o \
        utils/cpupower.o utils/cpufreq-info.o utils/cpufreq-set.o \
        utils/cpupower-set.o utils/cpupower-info.o utils/cpuidle-info.o \
        utils/cpuidle-set.o utils/powercap-info.o
diff --git a/utils/idle_monitor/cpupower-monitor.c 
b/utils/idle_monitor/cpupower-monitor.c
index 05f953f..da1857a 100644
--- a/utils/idle_monitor/cpupower-monitor.c
+++ b/utils/idle_monitor/cpupower-monitor.c
@@ -454,9 +454,10 @@ int cmd_monitor(int argc, char **argv)
                        print_results(1, cpu);
        }
 
-       for (num = 0; num < avail_monitors; num++)
-               monitors[num]->unregister();
-
+       for (num = 0; num < avail_monitors; num++) {
+               if (monitors[num]->unregister)
+                       monitors[num]->unregister();
+       }
        cpu_topology_release(cpu_top);
        return 0;
 }
diff --git a/utils/idle_monitor/idle_monitors.def 
b/utils/idle_monitor/idle_monitors.def
index 0d6ba4d..7c926e9 100644
--- a/utils/idle_monitor/idle_monitors.def
+++ b/utils/idle_monitor/idle_monitors.def
@@ -4,5 +4,6 @@ DEF(intel_nhm)
 DEF(intel_snb)
 DEF(intel_hsw_ext)
 DEF(mperf)
+DEF(rapl)
 #endif
 DEF(cpuidle_sysfs)
diff --git a/utils/idle_monitor/rapl_monitor.c 
b/utils/idle_monitor/rapl_monitor.c
new file mode 100644
index 0000000..2b02b21
--- /dev/null
+++ b/utils/idle_monitor/rapl_monitor.c
@@ -0,0 +1,141 @@
+/*
+ *  (C) 2016      Thomas Renninger <tr...@suse.com>
+ *
+ *  Licensed under the terms of the GNU GPL License version 2.
+ *
+ */
+
+#if defined(__i386__) || defined(__x86_64__)
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <time.h>
+#include <string.h>
+
+#include <pci/pci.h>
+
+#include "idle_monitor/cpupower-monitor.h"
+#include "helpers/helpers.h"
+#include "powercap.h"
+
+#define MAX_RAPL_ZONES 10
+
+int rapl_zone_count = 0;
+cstate_t rapl_zones[MAX_RAPL_ZONES];
+struct powercap_zone *rapl_zones_pt[MAX_RAPL_ZONES] = { 0 };
+
+unsigned long long rapl_zone_previous_count[MAX_RAPL_ZONES];
+unsigned long long rapl_zone_current_count[MAX_RAPL_ZONES];
+unsigned long long rapl_max_count;
+
+static int rapl_get_count_uj(unsigned int id, unsigned long long *count,
+                            unsigned int cpu)
+{
+       if (rapl_zones_pt[id] == NULL)
+               /* error */
+               return -1;
+
+       *count = rapl_zone_current_count[id] - rapl_zone_previous_count[id];
+
+       return 0;
+}
+
+static int powercap_count_zones(struct powercap_zone *zone)
+{
+       if (rapl_zone_count >= MAX_RAPL_ZONES)
+               return -1;
+
+       if (!zone->has_energy_uj)
+               return 0;
+
+       strncpy(rapl_zones[rapl_zone_count].name, zone->name, CSTATE_NAME_LEN - 
1);
+       strcpy(rapl_zones[rapl_zone_count].desc, "");
+       rapl_zones[rapl_zone_count].id = rapl_zone_count;
+       rapl_zones[rapl_zone_count].range = RANGE_MACHINE;
+       rapl_zones[rapl_zone_count].get_count = rapl_get_count_uj;
+       rapl_zones_pt[rapl_zone_count] = zone;
+       rapl_zone_count++;
+
+       return 0;
+}
+
+static int rapl_start(void)
+{
+       int i, ret;
+       uint64_t uj_val;
+
+       for (i = 0; i < rapl_zone_count; i++) {
+               ret = powercap_get_energy_uj(rapl_zones_pt[i], &uj_val);
+               if (ret)
+                       return ret;
+               rapl_zone_previous_count[i] = uj_val;
+       }
+
+       return 0;
+}
+
+static int rapl_stop(void)
+{
+       int i;
+       uint64_t uj_val;
+
+       for (i = 0; i < rapl_zone_count; i++) {
+               int ret;
+               ret = powercap_get_energy_uj(rapl_zones_pt[i], &uj_val);
+               if (ret)
+                       return ret;
+               rapl_zone_current_count[i] = uj_val;
+               if (rapl_max_count < uj_val)
+                       rapl_max_count = uj_val - rapl_zone_previous_count[i];
+       }
+       return 0;
+}
+
+struct cpuidle_monitor *rapl_register(void)
+{
+       struct powercap_zone *root_zone;
+       char line[MAX_LINE_LEN] = "";
+       int ret, val;
+
+       ret = powercap_get_driver(line, MAX_LINE_LEN);
+       if (ret < 0) {
+               dprint("No powercapping driver loaded\n");
+               return NULL;
+       }
+
+       dprint("Driver: %s\n", line);
+       ret = powercap_get_enabled(&val);
+       if (ret < 0)
+               return NULL;
+       if (!val) {
+               dprint("Powercapping is disabled\n");
+               return NULL;
+       }
+
+       dprint("Powercap domain hierarchy:\n\n");
+       root_zone = powercap_init_zones();
+
+       if (root_zone == NULL) {
+               dprint("No powercap info found\n");
+               return NULL;
+       }
+
+       powercap_walk_zones(root_zone, powercap_count_zones);
+       rapl_monitor.hw_states_num = rapl_zone_count;
+
+       return &rapl_monitor;
+}
+
+struct cpuidle_monitor rapl_monitor = {
+       .name                   = "RAPL",
+       .hw_states              = rapl_zones,
+       .hw_states_num          = 0,
+       .start                  = rapl_start,
+       .stop                   = rapl_stop,
+       .do_register            = rapl_register,
+       .needs_root             = 0,
+       .overflow_s             = 60 * 60 * 24 * 100, /* To be implemented */
+};
+
+#endif

Reply via email to