- /* Most of the additions here were taken as-is from the k9toolkit from
- * Brendan Gregg and are subject to change I guess */
- long long mem_used;
- long long mem_free;
- long long mem_lock;
- long long mem_kern;
- long long mem_unus;
-
- long long pp_kernel;
- long long physmem;
- long long availrmem;
-
- if (ksp == NULL)
- return (-1);
-
- mem_used = get_kstat_value (ksp, "pagestotal");
- mem_free = get_kstat_value (ksp, "pagesfree");
- mem_lock = get_kstat_value (ksp, "pageslocked");
- mem_kern = 0;
- mem_unus = 0;
-
- pp_kernel = get_kstat_value (ksp, "pp_kernel");
- physmem = get_kstat_value (ksp, "physmem");
- availrmem = get_kstat_value (ksp, "availrmem");
-
- if ((mem_used < 0LL) || (mem_free < 0LL) || (mem_lock < 0LL))
- {
- WARNING ("memory plugin: one of used, free or locked is negative.");
- return (-1);
- }
-
- mem_unus = physmem - mem_used;
-
- if (mem_used < (mem_free + mem_lock))
- {
- /* source: http://wesunsolve.net/bugid/id/4909199
- * this seems to happen when swap space is small, e.g. 2G on a 32G system
- * we will make some assumptions here
- * educated solaris internals help welcome here */
- DEBUG ("memory plugin: pages total is smaller than \"free\" "
- "+ \"locked\". This is probably due to small "
- "swap space");
- mem_free = availrmem;
- mem_used = 0;
- }
- else
- {
- mem_used -= mem_free + mem_lock;
- }
-
- /* mem_kern is accounted for in mem_lock */
- if (pp_kernel < mem_lock)
- {
- mem_kern = pp_kernel;
- mem_lock -= pp_kernel;
- }
- else
- {
- mem_kern = mem_lock;
- mem_lock = 0;
- }
-
- mem_used *= pagesize; /* If this overflows you have some serious */
- mem_free *= pagesize; /* memory.. Why not call me up and give me */
- mem_lock *= pagesize; /* some? ;) */
- mem_kern *= pagesize; /* it's 2011 RAM is cheap */
- mem_unus *= pagesize;
-
- MEMORY_SUBMIT ("used", (gauge_t) mem_used,
- "free", (gauge_t) mem_free,
- "locked", (gauge_t) mem_lock,
- "kernel", (gauge_t) mem_kern,
- "unusable", (gauge_t) mem_unus);
-/* #endif HAVE_LIBKSTAT */
-
-#elif HAVE_SYSCTL
- int mib[] = {CTL_VM, VM_METER};
- struct vmtotal vmtotal;
- gauge_t mem_active;
- gauge_t mem_inactive;
- gauge_t mem_free;
- size_t size;
-
- memset (&vmtotal, 0, sizeof (vmtotal));
- size = sizeof (vmtotal);
-
- if (sysctl (mib, 2, &vmtotal, &size, NULL, 0) < 0) {
- char errbuf[1024];
- WARNING ("memory plugin: sysctl failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- return (-1);
- }
-
- assert (pagesize > 0);
- mem_active = (gauge_t) (vmtotal.t_arm * pagesize);
- mem_inactive = (gauge_t) ((vmtotal.t_rm - vmtotal.t_arm) * pagesize);
- mem_free = (gauge_t) (vmtotal.t_free * pagesize);
-
- MEMORY_SUBMIT ("active", mem_active,
- "inactive", mem_inactive,
- "free", mem_free);
-/* #endif HAVE_SYSCTL */
+ /* Most of the additions here were taken as-is from the k9toolkit from
+ * Brendan Gregg and are subject to change I guess */
+ long long mem_used;
+ long long mem_free;
+ long long mem_lock;
+ long long mem_kern;
+ long long mem_unus;
+ long long arcsize;
+
+ long long pp_kernel;
+ long long physmem;
+ long long availrmem;
+
+ if (ksp == NULL)
+ return -1;
+ if (ksz == NULL)
+ return -1;
+
+ mem_used = get_kstat_value(ksp, "pagestotal");
+ mem_free = get_kstat_value(ksp, "pagesfree");
+ mem_lock = get_kstat_value(ksp, "pageslocked");
+ arcsize = get_kstat_value(ksz, "size");
+ pp_kernel = get_kstat_value(ksp, "pp_kernel");
+ physmem = get_kstat_value(ksp, "physmem");
+ availrmem = get_kstat_value(ksp, "availrmem");
+
+ mem_kern = 0;
+ mem_unus = 0;
+
+ if ((mem_used < 0LL) || (mem_free < 0LL) || (mem_lock < 0LL)) {
+ WARNING("memory plugin: one of used, free or locked is negative.");
+ return -1;
+ }
+
+ mem_unus = physmem - mem_used;
+
+ if (mem_used < (mem_free + mem_lock)) {
+ /* source: http://wesunsolve.net/bugid/id/4909199
+ * this seems to happen when swap space is small, e.g. 2G on a 32G system
+ * we will make some assumptions here
+ * educated solaris internals help welcome here */
+ DEBUG("memory plugin: pages total is smaller than \"free\" "
+ "+ \"locked\". This is probably due to small "
+ "swap space");
+ mem_free = availrmem;
+ mem_used = 0;
+ } else {
+ mem_used -= mem_free + mem_lock;
+ }
+
+ /* mem_kern is accounted for in mem_lock */
+ if (pp_kernel < mem_lock) {
+ mem_kern = pp_kernel;
+ mem_lock -= pp_kernel;
+ } else {
+ mem_kern = mem_lock;
+ mem_lock = 0;
+ }
+
+ mem_used *= pagesize; /* If this overflows you have some serious */
+ mem_free *= pagesize; /* memory.. Why not call me up and give me */
+ mem_lock *= pagesize; /* some? ;) */
+ mem_kern *= pagesize; /* it's 2011 RAM is cheap */
+ mem_unus *= pagesize;
+ mem_kern -= arcsize;
+
+ MEMORY_SUBMIT("used", (gauge_t)mem_used, "free", (gauge_t)mem_free, "locked",
+ (gauge_t)mem_lock, "kernel", (gauge_t)mem_kern, "arc",
+ (gauge_t)arcsize, "unusable", (gauge_t)mem_unus);
+ /* #endif HAVE_LIBKSTAT */
+
+#elif HAVE_SYSCTL && __OpenBSD__
+/* OpenBSD variant does not have HAVE_SYSCTLBYNAME */
+ int mib[] = {CTL_VM, VM_METER};
+ struct vmtotal vmtotal = {0};
+ gauge_t mem_active;
+ gauge_t mem_inactive;
+ gauge_t mem_free;
+ size_t size;
+
+ size = sizeof(vmtotal);
+
+ if (sysctl(mib, 2, &vmtotal, &size, NULL, 0) < 0) {
+ WARNING("memory plugin: sysctl failed: %s", STRERRNO);
+ return -1;
+ }
+
+ assert(pagesize > 0);
+ mem_active = (gauge_t)(vmtotal.t_arm * pagesize);
+ mem_inactive = (gauge_t)((vmtotal.t_rm - vmtotal.t_arm) * pagesize);
+ mem_free = (gauge_t)(vmtotal.t_free * pagesize);
+
+ MEMORY_SUBMIT("active", mem_active, "inactive", mem_inactive, "free",
+ mem_free);
+ /* #endif HAVE_SYSCTL && __OpenBSD__ */