about summary refs log tree commit diff
path: root/users/multi/pkgs/htop/zfs-arc-cache/0001-Linux-consider-ZFS-ARC-to-be-cache.patch
diff options
context:
space:
mode:
Diffstat (limited to 'users/multi/pkgs/htop/zfs-arc-cache/0001-Linux-consider-ZFS-ARC-to-be-cache.patch')
-rw-r--r--users/multi/pkgs/htop/zfs-arc-cache/0001-Linux-consider-ZFS-ARC-to-be-cache.patch119
1 files changed, 119 insertions, 0 deletions
diff --git a/users/multi/pkgs/htop/zfs-arc-cache/0001-Linux-consider-ZFS-ARC-to-be-cache.patch b/users/multi/pkgs/htop/zfs-arc-cache/0001-Linux-consider-ZFS-ARC-to-be-cache.patch
new file mode 100644
index 000000000000..50b2abd2b803
--- /dev/null
+++ b/users/multi/pkgs/htop/zfs-arc-cache/0001-Linux-consider-ZFS-ARC-to-be-cache.patch
@@ -0,0 +1,119 @@
+From d1dadae5674222a0134092b3313383e088deda89 Mon Sep 17 00:00:00 2001
+From: multiplexd <multi@in-addr.xyz>
+Date: Sat, 9 May 2020 20:13:09 +0100
+Subject: [PATCH] Linux: consider ZFS ARC to be cache
+
+---
+ ProcessList.c            |  1 +
+ ProcessList.h            |  1 +
+ linux/LinuxProcessList.c | 27 +++++++++++++++++++++++++++
+ linux/LinuxProcessList.h |  4 ++++
+ linux/Platform.c         |  5 +++--
+ 5 files changed, 36 insertions(+), 2 deletions(-)
+
+diff --git a/ProcessList.c b/ProcessList.c
+index 7482b03..7083957 100644
+--- a/ProcessList.c
++++ b/ProcessList.c
+@@ -67,6 +67,7 @@ typedef struct ProcessList_ {
+    unsigned long long int totalSwap;
+    unsigned long long int usedSwap;
+    unsigned long long int freeSwap;
++   unsigned long long int arcSize;
+ 
+    int cpuCount;
+ 
+diff --git a/ProcessList.h b/ProcessList.h
+index 572d484..65029f1 100644
+--- a/ProcessList.h
++++ b/ProcessList.h
+@@ -61,6 +61,7 @@ typedef struct ProcessList_ {
+    unsigned long long int totalSwap;
+    unsigned long long int usedSwap;
+    unsigned long long int freeSwap;
++   unsigned long long int arcSize;
+ 
+    int cpuCount;
+ 
+diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
+index 5f38540..507ebd2 100644
+--- a/linux/LinuxProcessList.c
++++ b/linux/LinuxProcessList.c
+@@ -104,6 +104,10 @@ typedef struct LinuxProcessList_ {
+ #define PROCSTATFILE PROCDIR "/stat"
+ #endif
+ 
++#ifndef ARCSTATFILE
++#define ARCSTATFILE PROCDIR "/spl/kstat/zfs/arcstats"
++#endif
++
+ #ifndef PROCMEMINFOFILE
+ #define PROCMEMINFOFILE PROCDIR "/meminfo"
+ #endif
+@@ -962,6 +966,29 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) {
+    this->cachedMem = this->cachedMem + sreclaimable - shmem;
+    this->usedSwap = this->totalSwap - swapFree;
+    fclose(file);
++
++   file = fopen(ARCSTATFILE, "r");
++   if (file == NULL && errno != ENOENT) {
++      CRT_fatalError("Cannot open " ARCSTATFILE);
++   }
++
++   if (file != NULL) {
++      // skip the first two lines
++      fgets(buffer, sizeof buffer, file);
++      fgets(buffer, sizeof buffer, file);
++
++      unsigned long long int arcsize = 0;
++      while (fgets(buffer, sizeof buffer, file)) {
++         #define tryRead(label, variable) do { if (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %*d %llu", variable)) { break; } } while(0)
++         if (buffer[0] == 's') tryRead("size", &arcsize);
++      }
++
++      this->arcSize = arcsize / 1024;
++
++      fclose(file);
++   } else {
++      this->arcSize = 0;
++   }
+ }
+ 
+ static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) {
+diff --git a/linux/LinuxProcessList.h b/linux/LinuxProcessList.h
+index f30b487..8f2edbb 100644
+--- a/linux/LinuxProcessList.h
++++ b/linux/LinuxProcessList.h
+@@ -77,6 +77,10 @@ typedef struct LinuxProcessList_ {
+ #define PROCSTATFILE PROCDIR "/stat"
+ #endif
+ 
++#ifndef ARCSTATFILE
++#define ARCSTATFILE PROCDIR "/spl/kstat/zfs/arcstats"
++#endif
++
+ #ifndef PROCMEMINFOFILE
+ #define PROCMEMINFOFILE PROCDIR "/meminfo"
+ #endif
+diff --git a/linux/Platform.c b/linux/Platform.c
+index ab90ca7..fb78c4c 100644
+--- a/linux/Platform.c
++++ b/linux/Platform.c
+@@ -200,11 +200,12 @@ void Platform_setMemoryValues(Meter* this) {
+    long int usedMem = pl->usedMem;
+    long int buffersMem = pl->buffersMem;
+    long int cachedMem = pl->cachedMem;
+-   usedMem -= buffersMem + cachedMem;
++   long int arcSize = pl->arcSize;
++   usedMem -= buffersMem + cachedMem + arcSize;
+    this->total = pl->totalMem;
+    this->values[0] = usedMem;
+    this->values[1] = buffersMem;
+-   this->values[2] = cachedMem;
++   this->values[2] = cachedMem + arcSize;
+ }
+ 
+ void Platform_setSwapValues(Meter* this) {
+-- 
+2.20.1
+