From c0a9e92eeaf53c53ca806f0ffa75a75c8a912e48 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Sun, 29 May 2022 21:10:26 +0200 Subject: Implement FreeBSD support for minimum ZFS ARC size --- freebsd/Platform.c | 11 +++++++++++ generic/openzfs_sysctl.c | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/freebsd/Platform.c b/freebsd/Platform.c index d21fc807..1a731b71 100644 --- a/freebsd/Platform.c +++ b/freebsd/Platform.c @@ -227,6 +227,7 @@ double Platform_setCPUValues(Meter* this, unsigned int cpu) { void Platform_setMemoryValues(Meter* this) { const ProcessList* pl = this->pl; + const FreeBSDProcessList* fpl = (const FreeBSDProcessList*) pl; this->total = pl->totalMem; this->values[0] = pl->usedMem; @@ -234,6 +235,16 @@ void Platform_setMemoryValues(Meter* this) { // this->values[2] = "shared memory, like tmpfs and shm" this->values[3] = pl->cachedMem; // this->values[4] = "available memory" + + if (fpl->zfs.enabled) { + // ZFS does not shrink below the value of zfs_arc_min. + unsigned long long int shrinkableSize = 0; + if (fpl->zfs.size > fpl->zfs.min) + shrinkableSize = fpl->zfs.size - fpl->zfs.min; + this->values[0] -= shrinkableSize; + this->values[3] += shrinkableSize; + // this->values[4] += shrinkableSize; + } } void Platform_setSwapValues(Meter* this) { diff --git a/generic/openzfs_sysctl.c b/generic/openzfs_sysctl.c index d088da78..bcd37dcb 100644 --- a/generic/openzfs_sysctl.c +++ b/generic/openzfs_sysctl.c @@ -15,6 +15,7 @@ in the source distribution for its full text. static int MIB_kstat_zfs_misc_arcstats_size[5]; +static int MIB_kstat_zfs_misc_arcstats_c_min[5]; static int MIB_kstat_zfs_misc_arcstats_c_max[5]; static int MIB_kstat_zfs_misc_arcstats_mfu_size[5]; static int MIB_kstat_zfs_misc_arcstats_mru_size[5]; @@ -35,6 +36,7 @@ void openzfs_sysctl_init(ZfsArcStats* stats) { len = 5; sysctlnametomib("kstat.zfs.misc.arcstats.size", MIB_kstat_zfs_misc_arcstats_size, &len); + sysctlnametomib("kstat.zfs.misc.arcstats.c_min", MIB_kstat_zfs_misc_arcstats_c_min, &len); sysctlnametomib("kstat.zfs.misc.arcstats.c_max", MIB_kstat_zfs_misc_arcstats_c_max, &len); sysctlnametomib("kstat.zfs.misc.arcstats.mfu_size", MIB_kstat_zfs_misc_arcstats_mfu_size, &len); sysctlnametomib("kstat.zfs.misc.arcstats.mru_size", MIB_kstat_zfs_misc_arcstats_mru_size, &len); @@ -61,6 +63,10 @@ void openzfs_sysctl_updateArcStats(ZfsArcStats* stats) { sysctl(MIB_kstat_zfs_misc_arcstats_size, 5, &(stats->size), &len, NULL, 0); stats->size /= 1024; + len = sizeof(stats->min); + sysctl(MIB_kstat_zfs_misc_arcstats_c_min, 5, &(stats->min), &len, NULL, 0); + stats->min /= 1024; + len = sizeof(stats->max); sysctl(MIB_kstat_zfs_misc_arcstats_c_max, 5, &(stats->max), &len, NULL, 0); stats->max /= 1024; -- cgit v1.2.3