summaryrefslogtreecommitdiffstats
path: root/solaris
diff options
context:
space:
mode:
authorsenjan <senjan@atlas.cz>2020-09-18 21:37:00 +0200
committercgzones <cgzones@googlemail.com>2020-09-21 13:54:45 +0200
commit2c933f210b8ce50a9d5b18915a8ea7699b948afe (patch)
tree914cd5c9dca533e8a3aa0144c52d4db64d836b8f /solaris
parent543286256ef35eb2a41531bc894c7ded53ae9de4 (diff)
htop shows no used memory in Solaris zone
Diffstat (limited to 'solaris')
-rw-r--r--solaris/SolarisProcessList.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/solaris/SolarisProcessList.c b/solaris/SolarisProcessList.c
index 45b7d902..d09fc0bb 100644
--- a/solaris/SolarisProcessList.c
+++ b/solaris/SolarisProcessList.c
@@ -133,10 +133,10 @@ static inline void SolarisProcessList_scanCPUTime(ProcessList* pl) {
static inline void SolarisProcessList_scanMemoryInfo(ProcessList* pl) {
SolarisProcessList* spl = (SolarisProcessList*) pl;
- kstat_t *meminfo = NULL;
+ static kstat_t *meminfo = NULL;
int ksrphyserr = -1;
kstat_named_t *totalmem_pgs = NULL;
- kstat_named_t *lockedmem_pgs = NULL;
+ kstat_named_t *freemem_pgs = NULL;
kstat_named_t *pages = NULL;
struct swaptable *sl = NULL;
struct swapent *swapdev = NULL;
@@ -147,15 +147,21 @@ static inline void SolarisProcessList_scanMemoryInfo(ProcessList* pl) {
char *spathbase = NULL;
// Part 1 - physical memory
- if (spl->kd != NULL) { meminfo = kstat_lookup(spl->kd,"unix",0,"system_pages"); }
+ if (spl->kd != NULL && meminfo == NULL) {
+ // Look up the kstat chain just one, it never changes
+ meminfo = kstat_lookup(spl->kd,"unix",0,"system_pages");
+ }
if (meminfo != NULL) { ksrphyserr = kstat_read(spl->kd,meminfo,NULL); }
if (ksrphyserr != -1) {
- totalmem_pgs = kstat_data_lookup( meminfo, "physmem" );
- lockedmem_pgs = kstat_data_lookup( meminfo, "pageslocked" );
- pages = kstat_data_lookup( meminfo, "pagestotal" );
+ totalmem_pgs = kstat_data_lookup(meminfo, "physmem");
+ freemem_pgs = kstat_data_lookup(meminfo, "freemem");
+ pages = kstat_data_lookup(meminfo, "pagestotal");
pl->totalMem = totalmem_pgs->value.ui64 * PAGE_SIZE_KB;
- pl->usedMem = lockedmem_pgs->value.ui64 * PAGE_SIZE_KB;
+ if (pl->totalMem > freemem_pgs->value.ui64 * PAGE_SIZE_KB)
+ pl->usedMem = pl->totalMem - freemem_pgs->value.ui64 * PAGE_SIZE_KB;
+ else
+ pl->usedMem = 0; // This can happen in non-global zone (in theory)
// Not sure how to implement this on Solaris - suggestions welcome!
pl->cachedMem = 0;
// Not really "buffers" but the best Solaris analogue that I can find to

© 2014-2024 Faster IT GmbH | imprint | privacy policy