iCreate sensor for all RAPLs. - energy - measure energy usage Err bitreich.org 70 hgit clone git://bitreich.org/energy git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/energy URL:git://bitreich.org/energy git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/energy bitreich.org 70 1Log /scm/energy/log.gph bitreich.org 70 1Files /scm/energy/files.gph bitreich.org 70 1Refs /scm/energy/refs.gph bitreich.org 70 1Tags /scm/energy/tag bitreich.org 70 1README /scm/energy/file/README.md.gph bitreich.org 70 1LICENSE /scm/energy/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit e7b10a359ff7396defb7e36dfe9f78b3c9d73b13 /scm/energy/commit/e7b10a359ff7396defb7e36dfe9f78b3c9d73b13.gph bitreich.org 70 1parent 3b9da8cb1c2fcacd4570f25d02194124e526caa2 /scm/energy/commit/3b9da8cb1c2fcacd4570f25d02194124e526caa2.gph bitreich.org 70 hAuthor: Troels Henriksen URL:mailto:athas@sigkill.dk bitreich.org 70 iDate: Thu, 24 Aug 2023 16:59:46 +0200 Err bitreich.org 70 i Err bitreich.org 70 iCreate sensor for all RAPLs. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M energy.c | 79 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 59 insertions(+), 20 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/energy.c b/energy.c /scm/energy/file/energy.c.gph bitreich.org 70 i@@ -16,14 +16,27 @@ Err bitreich.org 70 i // Err bitreich.org 70 i // https://www.kernel.org/doc/html/latest/power/power_supply_class.html Err bitreich.org 70 i Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i-#include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i-#include Err bitreich.org 70 i+ Err bitreich.org 70 i+// Allocates and returns a string of appropriate size. Err bitreich.org 70 i+static char* strprintf(const char *s, ...) { Err bitreich.org 70 i+ va_list vl; Err bitreich.org 70 i+ va_start(vl, s); Err bitreich.org 70 i+ size_t needed = 1 + (size_t)vsnprintf(NULL, 0, s, vl); Err bitreich.org 70 i+ char *buffer = (char*) malloc(needed); Err bitreich.org 70 i+ va_start(vl, s); // Must re-init. Err bitreich.org 70 i+ vsnprintf(buffer, needed, s, vl); Err bitreich.org 70 i+ return buffer; Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i struct sensor { Err bitreich.org 70 i const char *name; Err bitreich.org 70 i@@ -45,9 +58,6 @@ void add_sensor(struct sensor s) { Err bitreich.org 70 i sensors[num_sensors++] = s; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-const char *rapl_energy_uj = Err bitreich.org 70 i- "/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj"; Err bitreich.org 70 i- Err bitreich.org 70 i long long_from_file(const char *fname) { Err bitreich.org 70 i FILE *f = fopen(fname, "r"); Err bitreich.org 70 i if (f == NULL) { Err bitreich.org 70 i@@ -64,32 +74,61 @@ long long_from_file(const char *fname) { Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+struct rapl { Err bitreich.org 70 i+ long counter; Err bitreich.org 70 i+ char* energy_uj; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i void sensor_rapl_start(void* data) { Err bitreich.org 70 i- *(long*)data = long_from_file(rapl_energy_uj); Err bitreich.org 70 i+ struct rapl* rapl = (struct rapl*)data; Err bitreich.org 70 i+ rapl->counter = long_from_file(rapl->energy_uj); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void sensor_rapl_end(void* data) { Err bitreich.org 70 i- *(long*)data = long_from_file(rapl_energy_uj) - *(long*)data; Err bitreich.org 70 i+ struct rapl* rapl = (struct rapl*)data; Err bitreich.org 70 i+ rapl->counter = long_from_file(rapl->energy_uj) - rapl->counter; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i double sensor_rapl_usage(void* data) { Err bitreich.org 70 i+ struct rapl* rapl = (struct rapl*)data; Err bitreich.org 70 i // Convert microjoules to joules. Err bitreich.org 70 i- return (double)*(long*)data / 1e6; Err bitreich.org 70 i+ return (double)rapl->counter / 1e6; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void sensor_rapl(void) { Err bitreich.org 70 i- FILE *f = fopen(rapl_energy_uj, "r"); Err bitreich.org 70 i- if (f == NULL) { Err bitreich.org 70 i- fprintf(stderr, "%s: %s\n", rapl_energy_uj, strerror(errno)); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- fclose(f); Err bitreich.org 70 i- long* start = malloc(sizeof(long)); Err bitreich.org 70 i- add_sensor((struct sensor) { .name = "RAPL0", Err bitreich.org 70 i- .data = start, Err bitreich.org 70 i- .start = sensor_rapl_start, Err bitreich.org 70 i- .end = sensor_rapl_end, Err bitreich.org 70 i- .usage = sensor_rapl_usage}); Err bitreich.org 70 i+void sensor_rapl() { Err bitreich.org 70 i+ const char* rapl_path = "/sys/class/powercap/intel-rapl"; Err bitreich.org 70 i+ DIR* d = opendir(rapl_path); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (d == NULL) { Err bitreich.org 70 i+ return; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+ struct dirent* dirent; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while ((dirent = readdir(d)) != NULL) { Err bitreich.org 70 i+ if (dirent->d_type == DT_DIR) { Err bitreich.org 70 i+ char* rapl_energy_uj = strprintf("%s/%s/energy_uj", rapl_path, dirent->d_name); Err bitreich.org 70 i+ errno = 0; Err bitreich.org 70 i+ FILE *f = fopen(rapl_energy_uj, "r"); Err bitreich.org 70 i+ if (f == NULL) { Err bitreich.org 70 i+ if (errno != ENOENT) { Err bitreich.org 70 i+ fprintf(stderr, "%s: %s\n", rapl_energy_uj, strerror(errno)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(rapl_energy_uj); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ fclose(f); Err bitreich.org 70 i+ struct rapl *rapl = malloc(sizeof(struct rapl)); Err bitreich.org 70 i+ rapl->energy_uj = rapl_energy_uj; Err bitreich.org 70 i+ add_sensor((struct sensor) { .name = strdup(dirent->d_name), Err bitreich.org 70 i+ .data = rapl, Err bitreich.org 70 i+ .start = sensor_rapl_start, Err bitreich.org 70 i+ .end = sensor_rapl_end, Err bitreich.org 70 i+ .usage = sensor_rapl_usage}); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ closedir(d); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i const char *battery_status = Err bitreich.org 70 .