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