diff options
author | senjan <senjan@atlas.cz> | 2020-09-18 21:37:00 +0200 |
---|---|---|
committer | cgzones <cgzones@googlemail.com> | 2020-09-21 13:54:45 +0200 |
commit | 2c933f210b8ce50a9d5b18915a8ea7699b948afe (patch) | |
tree | 914cd5c9dca533e8a3aa0144c52d4db64d836b8f /solaris | |
parent | 543286256ef35eb2a41531bc894c7ded53ae9de4 (diff) |
htop shows no used memory in Solaris zone
Diffstat (limited to 'solaris')
-rw-r--r-- | solaris/SolarisProcessList.c | 20 |
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 |