about summary refs log tree commit diff
path: root/users/multi/pkgs/htop/zfs-arc-stats/0008-Support-for-ZFS-Compressed-ARC-statistics.patch
diff options
context:
space:
mode:
Diffstat (limited to 'users/multi/pkgs/htop/zfs-arc-stats/0008-Support-for-ZFS-Compressed-ARC-statistics.patch')
-rw-r--r--users/multi/pkgs/htop/zfs-arc-stats/0008-Support-for-ZFS-Compressed-ARC-statistics.patch628
1 files changed, 0 insertions, 628 deletions
diff --git a/users/multi/pkgs/htop/zfs-arc-stats/0008-Support-for-ZFS-Compressed-ARC-statistics.patch b/users/multi/pkgs/htop/zfs-arc-stats/0008-Support-for-ZFS-Compressed-ARC-statistics.patch
deleted file mode 100644
index 14bc83d866..0000000000
--- a/users/multi/pkgs/htop/zfs-arc-stats/0008-Support-for-ZFS-Compressed-ARC-statistics.patch
+++ /dev/null
@@ -1,628 +0,0 @@
-From 613556faebd16325da8c9057c81f39a2410d803f Mon Sep 17 00:00:00 2001
-From: Ross Williams <ross@ross-williams.net>
-Date: Tue, 3 Sep 2019 18:26:02 +0000
-Subject: [PATCH 8/9] Support for ZFS Compressed ARC statistics
-
----
- CRT.c                        | 14 ++++++
- CRT.h                        |  2 +
- Makefile.am                  | 12 +++--
- darwin/Platform.c            |  8 ++++
- darwin/Platform.h            |  2 +
- freebsd/Platform.c           |  8 ++++
- freebsd/Platform.h           |  2 +
- linux/LinuxProcessList.c     | 10 +++++
- linux/Platform.c             |  7 +++
- linux/Platform.h             |  2 +
- solaris/Platform.c           |  8 ++++
- solaris/Platform.h           |  2 +
- solaris/SolarisProcessList.c | 10 +++++
- zfs/ZfsArcStats.c            |  3 ++
- zfs/ZfsArcStats.h            |  3 ++
- zfs/ZfsCompressedArcMeter.c  | 86 ++++++++++++++++++++++++++++++++++++
- zfs/ZfsCompressedArcMeter.h  | 22 +++++++++
- zfs/openzfs_sysctl.c         | 18 ++++++++
- 18 files changed, 215 insertions(+), 4 deletions(-)
- create mode 100644 zfs/ZfsCompressedArcMeter.c
- create mode 100644 zfs/ZfsCompressedArcMeter.h
-
-diff --git a/CRT.c b/CRT.c
-index b9017aa..cb36b6c 100644
---- a/CRT.c
-+++ b/CRT.c
-@@ -133,6 +133,8 @@ typedef enum ColorElements_ {
-    ZFS_ANON,
-    ZFS_HEADER,
-    ZFS_OTHER,
-+   ZFS_COMPRESSED,
-+   ZFS_RATIO,
-    LAST_COLORELEMENT
- } ColorElements;
- 
-@@ -242,6 +244,8 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
-       [ZFS_ANON] = ColorPair(Magenta,Black),
-       [ZFS_HEADER] = ColorPair(Cyan,Black),
-       [ZFS_OTHER] = ColorPair(Magenta,Black),
-+      [ZFS_COMPRESSED] = ColorPair(Blue,Black),
-+      [ZFS_RATIO] = ColorPair(Magenta,Black),
-    },
-    [COLORSCHEME_MONOCHROME] = {
-       [RESET_COLOR] = A_NORMAL,
-@@ -306,6 +310,8 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
-       [ZFS_ANON] = A_DIM,
-       [ZFS_HEADER] = A_BOLD,
-       [ZFS_OTHER] = A_DIM,
-+      [ZFS_COMPRESSED] = A_BOLD,
-+      [ZFS_RATIO] = A_BOLD,
-    },
-    [COLORSCHEME_BLACKONWHITE] = {
-       [RESET_COLOR] = ColorPair(Black,White),
-@@ -370,6 +376,8 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
-       [ZFS_ANON] = ColorPair(Magenta,White),
-       [ZFS_HEADER] = ColorPair(Yellow,White),
-       [ZFS_OTHER] = ColorPair(Magenta,White),
-+      [ZFS_COMPRESSED] = ColorPair(Cyan,White),
-+      [ZFS_RATIO] = ColorPair(Magenta,White),
-    },
-    [COLORSCHEME_LIGHTTERMINAL] = {
-       [RESET_COLOR] = ColorPair(Black,Black),
-@@ -434,6 +442,8 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
-       [ZFS_ANON] = A_BOLD | ColorPair(Magenta,Black),
-       [ZFS_HEADER] = ColorPair(Black,Black),
-       [ZFS_OTHER] = A_BOLD | ColorPair(Magenta,Black),
-+      [ZFS_COMPRESSED] = ColorPair(Cyan,Black),
-+      [ZFS_RATIO] = A_BOLD | ColorPair(Magenta,Black),
-    },
-    [COLORSCHEME_MIDNIGHT] = {
-       [RESET_COLOR] = ColorPair(White,Blue),
-@@ -498,6 +508,8 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
-       [ZFS_ANON] = A_BOLD | ColorPair(Magenta,Blue),
-       [ZFS_HEADER] = A_BOLD | ColorPair(Yellow,Blue),
-       [ZFS_OTHER] = A_BOLD | ColorPair(Magenta,Blue),
-+      [ZFS_COMPRESSED] = A_BOLD | ColorPair(White,Blue),
-+      [ZFS_RATIO] = A_BOLD | ColorPair(Magenta,Blue),
-    },
-    [COLORSCHEME_BLACKNIGHT] = {
-       [RESET_COLOR] = ColorPair(Cyan,Black),
-@@ -562,6 +574,8 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
-       [ZFS_ANON] = ColorPair(Magenta,Black),
-       [ZFS_HEADER] = ColorPair(Yellow,Black),
-       [ZFS_OTHER] = ColorPair(Magenta,Black),
-+      [ZFS_COMPRESSED] = ColorPair(Blue,Black),
-+      [ZFS_RATIO] = ColorPair(Magenta,Black),
-    },
-    [COLORSCHEME_BROKENGRAY] = { 0 } // dynamically generated.
- };
-diff --git a/CRT.h b/CRT.h
-index 2275349..d9eba55 100644
---- a/CRT.h
-+++ b/CRT.h
-@@ -121,6 +121,8 @@ typedef enum ColorElements_ {
-    ZFS_ANON,
-    ZFS_HEADER,
-    ZFS_OTHER,
-+   ZFS_COMPRESSED,
-+   ZFS_RATIO,
-    LAST_COLORELEMENT
- } ColorElements;
- 
-diff --git a/Makefile.am b/Makefile.am
-index 204a8b7..2d159f0 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -50,6 +50,7 @@ linux_platform_headers = \
- 	linux/LinuxCRT.h \
- 	linux/Battery.h \
- 	zfs/ZfsArcMeter.h \
-+	zfs/ZfsCompressedArcMeter.h \
- 	zfs/ZfsArcStats.h
- 
- all_platform_headers += $(linux_platform_headers)
-@@ -58,7 +59,7 @@ if HTOP_LINUX
- AM_CFLAGS += -rdynamic
- myhtopplatsources = linux/Platform.c linux/IOPriorityPanel.c linux/IOPriority.c \
- linux/LinuxProcess.c linux/LinuxProcessList.c linux/LinuxCRT.c linux/Battery.c \
--zfs/ZfsArcMeter.c zfs/ZfsArcStats.c
-+zfs/ZfsArcMeter.c zfs/ZfsCompressedArcMeter.c zfs/ZfsArcStats.c
- 
- myhtopplatheaders = $(linux_platform_headers)
- endif
-@@ -73,6 +74,7 @@ freebsd_platform_headers = \
- 	freebsd/FreeBSDCRT.h \
- 	freebsd/Battery.h \
- 	zfs/ZfsArcMeter.h \
-+	zfs/ZfsCompressedArcMeter.h \
- 	zfs/ZfsArcStats.h \
- 	zfs/openzfs_sysctl.h
- 
-@@ -81,7 +83,7 @@ all_platform_headers += $(freebsd_platform_headers)
- if HTOP_FREEBSD
- myhtopplatsources = freebsd/Platform.c freebsd/FreeBSDProcessList.c \
- freebsd/FreeBSDProcess.c freebsd/FreeBSDCRT.c freebsd/Battery.c \
--zfs/ZfsArcMeter.c zfs/ZfsArcStats.c zfs/openzfs_sysctl.c
-+zfs/ZfsArcMeter.c zfs/ZfsCompressedArcMeter.c zfs/ZfsArcStats.c zfs/openzfs_sysctl.c
- 
- myhtopplatheaders = $(freebsd_platform_headers)
- endif
-@@ -135,6 +137,7 @@ darwin_platform_headers = \
- 	darwin/DarwinCRT.h \
- 	darwin/Battery.h \
- 	zfs/ZfsArcMeter.h \
-+	zfs/ZfsCompressedArcMeter.h \
- 	zfs/ZfsArcStats.h \
- 	zfs/openzfs_sysctl.h
- 
-@@ -144,7 +147,7 @@ if HTOP_DARWIN
- AM_LDFLAGS += -framework IOKit -framework CoreFoundation
- myhtopplatsources = darwin/Platform.c darwin/DarwinProcess.c \
- darwin/DarwinProcessList.c darwin/DarwinCRT.c darwin/Battery.c \
--zfs/ZfsArcMeter.c zfs/ZfsArcStats.c zfs/openzfs_sysctl.c
-+zfs/ZfsArcMeter.c zfs/ZfsCompressedArcMeter.c zfs/ZfsArcStats.c zfs/openzfs_sysctl.c
- 
- myhtopplatheaders = $(darwin_platform_headers)
- endif
-@@ -159,6 +162,7 @@ solaris_platform_headers = \
- 	solaris/SolarisCRT.h \
- 	solaris/Battery.h \
- 	zfs/ZfsArcMeter.h \
-+	zfs/ZfsCompressedArcMeter.h \
- 	zfs/ZfsArcStats.h
- 
- all_platform_headers += $(solaris_platform_headers)
-@@ -167,7 +171,7 @@ if HTOP_SOLARIS
- myhtopplatsources = solaris/Platform.c \
- solaris/SolarisProcess.c solaris/SolarisProcessList.c \
- solaris/SolarisCRT.c solaris/Battery.c \
--zfs/ZfsArcMeter.c zfs/ZfsArcStats.c
-+zfs/ZfsArcMeter.c zfs/ZfsCompressedArcMeter.c zfs/ZfsArcStats.c
- 
- myhtopplatheaders = $(solaris_platform_headers)
- endif
-diff --git a/darwin/Platform.c b/darwin/Platform.c
-index f9f09b5..286ff16 100644
---- a/darwin/Platform.c
-+++ b/darwin/Platform.c
-@@ -16,6 +16,7 @@ in the source distribution for its full text.
- #include "HostnameMeter.h"
- #include "UptimeMeter.h"
- #include "zfs/ZfsArcMeter.h"
-+#include "zfs/ZfsCompressedArcMeter.h"
- #include "DarwinProcessList.h"
- 
- #include <stdlib.h>
-@@ -119,6 +120,7 @@ MeterClass* Platform_meterTypes[] = {
-    &LeftCPUs2Meter_class,
-    &RightCPUs2Meter_class,
-    &ZfsArcMeter_class,
-+   &ZfsCompressedArcMeter_class,
-    &BlankMeter_class,
-    NULL
- };
-@@ -249,6 +251,12 @@ void Platform_setZfsArcValues(Meter* this) {
-    ZfsArcMeter_readStats(this, &(dpl->zfs));
- }
- 
-+void Platform_setZfsCompressedArcValues(Meter* this) {
-+   DarwinProcessList* dpl = (DarwinProcessList*) this->pl;
-+
-+   ZfsCompressedArcMeter_readStats(this, &(dpl->zfs));
-+}
-+
- char* Platform_getProcessEnv(pid_t pid) {
-    char* env = NULL;
- 
-diff --git a/darwin/Platform.h b/darwin/Platform.h
-index f836077..e17661d 100644
---- a/darwin/Platform.h
-+++ b/darwin/Platform.h
-@@ -50,6 +50,8 @@ void Platform_setSwapValues(Meter* mtr);
- 
- void Platform_setZfsArcValues(Meter* this);
- 
-+void Platform_setZfsCompressedArcValues(Meter* this);
-+
- char* Platform_getProcessEnv(pid_t pid);
- 
- #endif
-diff --git a/freebsd/Platform.c b/freebsd/Platform.c
-index b08a508..0986a3d 100644
---- a/freebsd/Platform.c
-+++ b/freebsd/Platform.c
-@@ -16,6 +16,7 @@ in the source distribution for its full text.
- #include "ClockMeter.h"
- #include "HostnameMeter.h"
- #include "zfs/ZfsArcMeter.h"
-+#include "zfs/ZfsCompressedArcMeter.h"
- #include "FreeBSDProcess.h"
- #include "FreeBSDProcessList.h"
- 
-@@ -106,6 +107,7 @@ MeterClass* Platform_meterTypes[] = {
-    &RightCPUs2Meter_class,
-    &BlankMeter_class,
-    &ZfsArcMeter_class,
-+   &ZfsCompressedArcMeter_class,
-    NULL
- };
- 
-@@ -205,6 +207,12 @@ void Platform_setZfsArcValues(Meter* this) {
-    ZfsArcMeter_readStats(this, &(fpl->zfs));
- }
- 
-+void Platform_setZfsCompressedArcValues(Meter* this) {
-+   FreeBSDProcessList* fpl = (FreeBSDProcessList*) this->pl;
-+
-+   ZfsCompressedArcMeter_readStats(this, &(fpl->zfs));
-+}
-+
- void Platform_setTasksValues(Meter* this) {
-    // TODO
- }
-diff --git a/freebsd/Platform.h b/freebsd/Platform.h
-index 3dc7ebf..0268f2c 100644
---- a/freebsd/Platform.h
-+++ b/freebsd/Platform.h
-@@ -46,6 +46,8 @@ void Platform_setSwapValues(Meter* this);
- 
- void Platform_setZfsArcValues(Meter* this);
- 
-+void Platform_setZfsCompressedArcValues(Meter* this);
-+
- void Platform_setTasksValues(Meter* this);
- 
- char* Platform_getProcessEnv(pid_t pid);
-diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
-index 3e88910..4596c3b 100644
---- a/linux/LinuxProcessList.c
-+++ b/linux/LinuxProcessList.c
-@@ -984,9 +984,14 @@ static inline void LinuxProcessList_scanZfsArcstats(LinuxProcessList* lpl) {
-    char buffer[128];
-    while (fgets(buffer, 128, file)) {
-       #define tryRead(label, variable) do { if (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %*2u %32llu", variable)) { break; } } while(0)
-+      #define tryReadFlag(label, variable, flag) do { if (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %*2u %32llu", variable)) { flag = 1; break; } else { flag = 0; } } while(0)
-       switch (buffer[0]) {
-       case 'c':
-          tryRead("c_max", &lpl->zfs.max);
-+         tryReadFlag("compressed", &lpl->zfs.compressed, &lpl->zfs.isCompressed);
-+         break;
-+      case 'u':
-+         tryRead("uncompressed", &lpl->zfs.uncompressed);
-          break;
-       case 's':
-          tryRead("size", &lpl->zfs.size);
-@@ -1010,6 +1015,7 @@ static inline void LinuxProcessList_scanZfsArcstats(LinuxProcessList* lpl) {
-          break;
-       }
-       #undef tryRead
-+      #undef tryReadFlag
-    }
-    fclose(file);
- 
-@@ -1021,6 +1027,10 @@ static inline void LinuxProcessList_scanZfsArcstats(LinuxProcessList* lpl) {
-    lpl->zfs.anon   /= 1024;
-    lpl->zfs.header /= 1024;
-    lpl->zfs.other   = (dbufSize + dnodeSize + bonusSize) / 1024;
-+   if ( lpl->zfs.isCompressed ) {
-+      lpl->zfs.compressed /= 1024;
-+      lpl->zfs.uncompressed /= 1024;
-+   }
- }
- 
- static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) {
-diff --git a/linux/Platform.c b/linux/Platform.c
-index 69f6688..f7088cf 100644
---- a/linux/Platform.c
-+++ b/linux/Platform.c
-@@ -22,6 +22,7 @@ in the source distribution for its full text.
- #include "ClockMeter.h"
- #include "HostnameMeter.h"
- #include "zfs/ZfsArcMeter.h"
-+#include "zfs/ZfsCompressedArcMeter.h"
- #include "LinuxProcess.h"
- 
- #include <math.h>
-@@ -128,6 +129,7 @@ MeterClass* Platform_meterTypes[] = {
-    &RightCPUs2Meter_class,
-    &BlankMeter_class,
-    &ZfsArcMeter_class,
-+   &ZfsCompressedArcMeter_class,
-    NULL
- };
- 
-@@ -221,6 +223,11 @@ void Platform_setZfsArcValues(Meter* this) {
-    ZfsArcMeter_readStats(this, &(lpl->zfs));
- }
- 
-+void Platform_setZfsCompressedArcValues(Meter* this) {
-+   LinuxProcessList* lpl = (LinuxProcessList*) this->pl;
-+
-+   ZfsCompressedArcMeter_readStats(this, &(lpl->zfs));
-+}
- char* Platform_getProcessEnv(pid_t pid) {
-    char procname[32+1];
-    xSnprintf(procname, 32, "/proc/%d/environ", pid);
-diff --git a/linux/Platform.h b/linux/Platform.h
-index e775181..5d85eb3 100644
---- a/linux/Platform.h
-+++ b/linux/Platform.h
-@@ -45,6 +45,8 @@ void Platform_setSwapValues(Meter* this);
- 
- void Platform_setZfsArcValues(Meter* this);
- 
-+void Platform_setZfsCompressedArcValues(Meter* this);
-+
- char* Platform_getProcessEnv(pid_t pid);
- 
- #endif
-diff --git a/solaris/Platform.c b/solaris/Platform.c
-index 74ae14e..7dcfe32 100644
---- a/solaris/Platform.c
-+++ b/solaris/Platform.c
-@@ -18,6 +18,7 @@ in the source distribution for its full text.
- #include "HostnameMeter.h"
- #include "UptimeMeter.h"
- #include "zfs/ZfsArcMeter.h"
-+#include "zfs/ZfsCompressedArcMeter.h"
- #include "SolarisProcess.h"
- #include "SolarisProcessList.h"
- 
-@@ -124,6 +125,7 @@ MeterClass* Platform_meterTypes[] = {
-    &LeftCPUs2Meter_class,
-    &RightCPUs2Meter_class,
-    &ZfsArcMeter_class,
-+   &ZfsCompressedArcMeter_class,
-    &BlankMeter_class,
-    NULL
- };
-@@ -228,6 +230,12 @@ void Platform_setZfsArcValues(Meter* this) {
-    ZfsArcMeter_readStats(this, &(spl->zfs));
- }
- 
-+void Platform_setZfsCompressedArcValues(Meter* this) {
-+   SolarisProcessList* spl = (SolarisProcessList*) this->pl;
-+
-+   ZfsCompressedArcMeter_readStats(this, &(spl->zfs));
-+}
-+
- static int Platform_buildenv(void *accum, struct ps_prochandle *Phandle, uintptr_t addr, const char *str) {
-    envAccum *accump = accum;
-    (void) Phandle;
-diff --git a/solaris/Platform.h b/solaris/Platform.h
-index 62757ff..3b5aef8 100644
---- a/solaris/Platform.h
-+++ b/solaris/Platform.h
-@@ -62,6 +62,8 @@ void Platform_setSwapValues(Meter* this);
- 
- void Platform_setZfsArcValues(Meter* this);
- 
-+void Platform_setZfsCompressedArcValues(Meter* this);
-+
- char* Platform_getProcessEnv(pid_t pid);
- 
- #endif
-diff --git a/solaris/SolarisProcessList.c b/solaris/SolarisProcessList.c
-index b6bc6f5..d62ea1d 100644
---- a/solaris/SolarisProcessList.c
-+++ b/solaris/SolarisProcessList.c
-@@ -263,6 +263,16 @@ static inline void SolarisProcessList_scanZfsArcstats(ProcessList* pl) {
- 
-       cur_kstat = kstat_data_lookup( arcstats, "other_size" );
-       spl->zfs.other = cur_kstat->value.ui64 / 1024;
-+
-+      if ((cur_kstat = kstat_data_lookup( arcstats, "compressed_size" )) != NULL) {
-+         spl->zfs.compressed = cur_kstat->value.ui64 / 1024;
-+         spl->zfs.isCompressed = 1;
-+
-+         cur_kstat = kstat_data_lookup( arcstats, "uncompressed_size" );
-+         spl->zfs.uncompressed = cur_kstat->value.ui64 / 1024;
-+      } else {
-+         spl->zfs.isCompressed = 0;
-+      }
-    }
- }
- 
-diff --git a/zfs/ZfsArcStats.c b/zfs/ZfsArcStats.c
-index c33076a..1bfaf47 100644
---- a/zfs/ZfsArcStats.c
-+++ b/zfs/ZfsArcStats.c
-@@ -8,6 +8,7 @@ in the source distribution for its full text.
- /*{
- typedef struct ZfsArcStats_ {
-    int enabled;
-+   int isCompressed;
-    unsigned long long int max;
-    unsigned long long int size;
-    unsigned long long int MFU;
-@@ -15,5 +16,7 @@ typedef struct ZfsArcStats_ {
-    unsigned long long int anon;
-    unsigned long long int header;
-    unsigned long long int other;
-+   unsigned long long int compressed;
-+   unsigned long long int uncompressed;
- } ZfsArcStats;
- }*/
-diff --git a/zfs/ZfsArcStats.h b/zfs/ZfsArcStats.h
-index 3697af2..ee5d0ed 100644
---- a/zfs/ZfsArcStats.h
-+++ b/zfs/ZfsArcStats.h
-@@ -11,6 +11,7 @@ in the source distribution for its full text.
- 
- typedef struct ZfsArcStats_ {
-    int enabled;
-+   int isCompressed;
-    unsigned long long int max;
-    unsigned long long int size;
-    unsigned long long int MFU;
-@@ -18,6 +19,8 @@ typedef struct ZfsArcStats_ {
-    unsigned long long int anon;
-    unsigned long long int header;
-    unsigned long long int other;
-+   unsigned long long int compressed;
-+   unsigned long long int uncompressed;
- } ZfsArcStats;
- 
- #endif
-diff --git a/zfs/ZfsCompressedArcMeter.c b/zfs/ZfsCompressedArcMeter.c
-new file mode 100644
-index 0000000..ac3944d
---- /dev/null
-+++ b/zfs/ZfsCompressedArcMeter.c
-@@ -0,0 +1,86 @@
-+/*
-+htop - ZfsCompressedArcMeter.c
-+(C) 2004-2011 Hisham H. Muhammad
-+Released under the GNU GPL, see the COPYING file
-+in the source distribution for its full text.
-+*/
-+
-+#include "ZfsCompressedArcMeter.h"
-+#include "ZfsArcStats.h"
-+
-+#include "CRT.h"
-+#include "Platform.h"
-+
-+#include <stdlib.h>
-+#include <string.h>
-+#include <math.h>
-+#include <sys/param.h>
-+#include <assert.h>
-+
-+/*{
-+#include "ZfsArcStats.h"
-+
-+#include "Meter.h"
-+}*/
-+
-+int ZfsCompressedArcMeter_attributes[] = {
-+   ZFS_COMPRESSED
-+};
-+
-+void ZfsCompressedArcMeter_readStats(Meter* this, ZfsArcStats* stats) {
-+   if ( stats->isCompressed ) {
-+      this->total = stats->uncompressed;
-+      this->values[0] = stats->compressed;
-+   } else {
-+      // For uncompressed ARC, report 1:1 ratio
-+      this->total = stats->size;
-+      this->values[0] = stats->size;
-+   }
-+}
-+
-+static void ZfsCompressedArcMeter_printRatioString(Meter* this, char* buffer, int size) {
-+   xSnprintf(buffer, size, "%.2f:1", this->total/this->values[0]);
-+}
-+
-+static void ZfsCompressedArcMeter_updateValues(Meter* this, char* buffer, int size) {
-+   Platform_setZfsCompressedArcValues(this);
-+
-+   ZfsCompressedArcMeter_printRatioString(this, buffer, size);
-+}
-+
-+static void ZfsCompressedArcMeter_display(Object* cast, RichString* out) {
-+   char buffer[50];
-+   Meter* this = (Meter*)cast;
-+
-+   if (this->values[0] > 0) {
-+      Meter_humanUnit(buffer, this->total, 50);
-+      RichString_append(out, CRT_colors[METER_VALUE], buffer);
-+      RichString_append(out, CRT_colors[METER_TEXT], " Uncompressed, ");
-+      Meter_humanUnit(buffer, this->values[0], 50);
-+      RichString_append(out, CRT_colors[METER_VALUE], buffer);
-+      RichString_append(out, CRT_colors[METER_TEXT], " Compressed, ");
-+      ZfsCompressedArcMeter_printRatioString(this, buffer, 50);
-+      RichString_append(out, CRT_colors[METER_VALUE], buffer);
-+      RichString_append(out, CRT_colors[METER_TEXT], " Ratio");
-+   } else {
-+      RichString_write(out, CRT_colors[METER_TEXT], " ");
-+      RichString_append(out, CRT_colors[FAILED_SEARCH], "Compression Unavailable");
-+   }
-+}
-+
-+MeterClass ZfsCompressedArcMeter_class = {
-+   .super = {
-+      .extends = Class(Meter),
-+      .delete = Meter_delete,
-+      .display = ZfsCompressedArcMeter_display,
-+   },
-+   .updateValues = ZfsCompressedArcMeter_updateValues,
-+   .defaultMode = TEXT_METERMODE,
-+   .maxItems = 1,
-+   .total = 100.0,
-+   .attributes = ZfsCompressedArcMeter_attributes,
-+   .name = "ZFSCARC",
-+   .uiName = "ZFS CARC",
-+   .description = "ZFS CARC: Compressed ARC statistics",
-+   .caption = "ARC: "
-+};
-diff --git a/zfs/ZfsCompressedArcMeter.h b/zfs/ZfsCompressedArcMeter.h
-new file mode 100644
-index 0000000..5afcc99
---- /dev/null
-+++ b/zfs/ZfsCompressedArcMeter.h
-@@ -0,0 +1,22 @@
-+/* Do not edit this file. It was automatically generated. */
-+
-+#ifndef HEADER_ZfsCompressedArcMeter
-+#define HEADER_ZfsCompressedArcMeter
-+/*
-+htop - ZfsCompressedArcMeter.h
-+(C) 2004-2011 Hisham H. Muhammad
-+Released under the GNU GPL, see the COPYING file
-+in the source distribution for its full text.
-+*/
-+
-+#include "ZfsArcStats.h"
-+
-+#include "Meter.h"
-+
-+extern int ZfsCompressedArcMeter_attributes[];
-+
-+void ZfsCompressedArcMeter_readStats(Meter* this, ZfsArcStats* stats);
-+
-+extern MeterClass ZfsCompressedArcMeter_class;
-+
-+#endif
-diff --git a/zfs/openzfs_sysctl.c b/zfs/openzfs_sysctl.c
-index ceee4d1..c1ab223 100644
---- a/zfs/openzfs_sysctl.c
-+++ b/zfs/openzfs_sysctl.c
-@@ -20,6 +20,8 @@ static int MIB_kstat_zfs_misc_arcstats_mru_size[5];
- static int MIB_kstat_zfs_misc_arcstats_anon_size[5];
- static int MIB_kstat_zfs_misc_arcstats_hdr_size[5];
- static int MIB_kstat_zfs_misc_arcstats_other_size[5];
-+static int MIB_kstat_zfs_misc_arcstats_compressed_size[5];
-+static int MIB_kstat_zfs_misc_arcstats_uncompressed_size[5];
- 
- /*{
- #include "zfs/ZfsArcStats.h"
-@@ -41,6 +43,12 @@ void openzfs_sysctl_init(ZfsArcStats *stats) {
-                   sysctlnametomib("kstat.zfs.misc.arcstats.anon_size", MIB_kstat_zfs_misc_arcstats_anon_size, &len);
-                   sysctlnametomib("kstat.zfs.misc.arcstats.hdr_size", MIB_kstat_zfs_misc_arcstats_hdr_size, &len);
-                   sysctlnametomib("kstat.zfs.misc.arcstats.other_size", MIB_kstat_zfs_misc_arcstats_other_size, &len);
-+                  if (sysctlnametomib("kstat.zfs.misc.arcstats.compressed_size", MIB_kstat_zfs_misc_arcstats_compressed_size, &len) == 0) {
-+                     stats->isCompressed = 1;
-+                     sysctlnametomib("kstat.zfs.misc.arcstats.uncompressed_size", MIB_kstat_zfs_misc_arcstats_uncompressed_size, &len);
-+                  } else {
-+                     stats->isCompressed = 0;
-+                  }
-    } else {
-       stats->enabled = 0;
-    }
-@@ -77,5 +85,15 @@ void openzfs_sysctl_updateArcStats(ZfsArcStats *stats) {
-       len = sizeof(stats->other);
-       sysctl(MIB_kstat_zfs_misc_arcstats_other_size, 5, &(stats->other), &len , NULL, 0);
-       stats->other /= 1024;
-+
-+      if (stats->isCompressed) {
-+         len = sizeof(stats->compressed);
-+         sysctl(MIB_kstat_zfs_misc_arcstats_compressed_size, 5, &(stats->compressed), &len , NULL, 0);
-+         stats->compressed /= 1024;
-+
-+         len = sizeof(stats->uncompressed);
-+         sysctl(MIB_kstat_zfs_misc_arcstats_uncompressed_size, 5, &(stats->uncompressed), &len , NULL, 0);
-+         stats->uncompressed /= 1024;
-+      }
-    }
- }
--- 
-2.20.1
-