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 <athas@sigkill.dk> 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 <assert.h> Err bitreich.org 70
i+#include <dirent.h> Err bitreich.org 70
i #include <errno.h> Err bitreich.org 70
i+#include <stdarg.h> Err bitreich.org 70
i #include <stdio.h> Err bitreich.org 70
i #include <stdlib.h> Err bitreich.org 70
i #include <string.h> Err bitreich.org 70
i-#include <sys/wait.h> Err bitreich.org 70
i #include <sys/stat.h> Err bitreich.org 70
i+#include <sys/wait.h> Err bitreich.org 70
i #include <unistd.h> Err bitreich.org 70
i-#include <assert.h> 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
.
Response:
text/plain