SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/energy/commit/e7b10a359ff7396...
Content-Typetext/plain; charset=utf-8