library: normalize/standardize interface, <VMSTAT> api

This interface represented a 2nd generation attempt at
the opaque newlib approach. In other words, it did not
involve the 1st generation 'chains'. Instead, 'stacks'
were employed. But the interface wasn't user friendly.

Users were required to create their own stacks, before
calling 'getstack' to retrieve multiple results with a
single call. Even worse, sometimes 'read' was required
before calling 'get' when working with single results.

So this commit represents the 3rd generation approach.
We eliminate the burden of 'read' and creating stacks.
Rather, beyond those standard 'new', 'ref' and 'unref'
functions, we'll offer just 'get' (single result) plus
a 'select' function (for multiple results in 1 stack).

And along the way, this commit vastly expands the data
extracted from /proc/vmstat. All values that currently
exist (and their delta equivalents) are now available.
Deltas were included for everything because there's no
real runtime costs beyond using a little extra memory.

The only problem is a lack of documentation for all of
those fields, as is reflected in the references below.
Oh well, maybe someday someone will dig through kernel
sources & finally plug that rather large document gap.

[ as an aside, rather than using a 'strcmp' approach ]
[ when parsing the /proc/vmstat file, as is found in ]
[ the <meminfo> module, we exploit those hash search ]
[ provisions that are found in the <search.h> header ]

Reference(s):
http://www.spinics.net/lists/linux-man/msg09096.html
http://www.linuxinsight.com/proc_vmstat.html

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2016-06-04 00:00:00 -05:00 committed by Craig Small
parent fa0d983a7d
commit d69a2b6899
3 changed files with 1624 additions and 112 deletions

View File

@ -57,11 +57,10 @@ global:
procps_uptime_sprint;
procps_uptime_sprint_short;
procps_vmstat_new;
procps_vmstat_read;
procps_vmstat_ref;
procps_vmstat_unref;
procps_vmstat_get;
procps_vmstat_getstack;
procps_vmstat_select;
local:
*;
};

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@
* Copyright (C) 1996 Charles Blake <cblake@bbn.com>
* Copyright (C) 2003 Albert Cahalan
* Copyright (C) 2015 Craig Small <csmall@enc.com.au>
* Copyright (C) 2016 Jim Warner <james.warner@comcast.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -28,36 +29,280 @@
__BEGIN_DECLS
enum vmstat_item {
PROCPS_VMSTAT_noop, // n/a
PROCPS_VMSTAT_extra, // n/a
PROCPS_VMSTAT_ALLOCSTALL, // ul_int
PROCPS_VMSTAT_BALLOON_DEFLATE, // ul_int
PROCPS_VMSTAT_BALLOON_INFLATE, // ul_int
PROCPS_VMSTAT_BALLOON_MIGRATE, // ul_int
PROCPS_VMSTAT_COMPACT_FAIL, // ul_int
PROCPS_VMSTAT_COMPACT_FREE_SCANNED, // ul_int
PROCPS_VMSTAT_COMPACT_ISOLATED, // ul_int
PROCPS_VMSTAT_COMPACT_MIGRATE_SCANNED, // ul_int
PROCPS_VMSTAT_COMPACT_STALL, // ul_int
PROCPS_VMSTAT_COMPACT_SUCCESS, // ul_int
PROCPS_VMSTAT_DROP_PAGECACHE, // ul_int
PROCPS_VMSTAT_DROP_SLAB, // ul_int
PROCPS_VMSTAT_HTLB_BUDDY_ALLOC_FAIL, // ul_int
PROCPS_VMSTAT_HTLB_BUDDY_ALLOC_SUCCESS, // ul_int
PROCPS_VMSTAT_KSWAPD_HIGH_WMARK_HIT_QUICKLY, // ul_int
PROCPS_VMSTAT_KSWAPD_INODESTEAL, // ul_int
PROCPS_VMSTAT_KSWAPD_LOW_WMARK_HIT_QUICKLY, // ul_int
PROCPS_VMSTAT_NR_ACTIVE_ANON, // ul_int
PROCPS_VMSTAT_NR_ACTIVE_FILE, // ul_int
PROCPS_VMSTAT_NR_ALLOC_BATCH, // ul_int
PROCPS_VMSTAT_NR_ANON_PAGES, // ul_int
PROCPS_VMSTAT_NR_ANON_TRANSPARENT_HUGEPAGES, // ul_int
PROCPS_VMSTAT_NR_BOUNCE, // ul_int
PROCPS_VMSTAT_NR_DIRTIED, // ul_int
PROCPS_VMSTAT_NR_DIRTY, // ul_int
PROCPS_VMSTAT_NR_DIRTY_BACKGROUND_THRESHOLD, // ul_int
PROCPS_VMSTAT_NR_DIRTY_THRESHOLD, // ul_int
PROCPS_VMSTAT_NR_FILE_PAGES, // ul_int
PROCPS_VMSTAT_NR_FREE_CMA, // ul_int
PROCPS_VMSTAT_NR_FREE_PAGES, // ul_int
PROCPS_VMSTAT_NR_INACTIVE_ANON, // ul_int
PROCPS_VMSTAT_NR_INACTIVE_FILE, // ul_int
PROCPS_VMSTAT_NR_ISOLATED_ANON, // ul_int
PROCPS_VMSTAT_NR_ISOLATED_FILE, // ul_int
PROCPS_VMSTAT_NR_KERNEL_STACK, // ul_int
PROCPS_VMSTAT_NR_MAPPED, // ul_int
PROCPS_VMSTAT_NR_MLOCK, // ul_int
PROCPS_VMSTAT_NR_PAGES_SCANNED, // ul_int
PROCPS_VMSTAT_NR_PAGE_TABLE_PAGES, // ul_int
PROCPS_VMSTAT_NR_SHMEM, // ul_int
PROCPS_VMSTAT_NR_SLAB_RECLAIMABLE, // ul_int
PROCPS_VMSTAT_NR_SLAB_UNRECLAIMABLE, // ul_int
PROCPS_VMSTAT_NR_UNEVICTABLE, // ul_int
PROCPS_VMSTAT_NR_UNSTABLE, // ul_int
PROCPS_VMSTAT_NR_VMSCAN_IMMEDIATE_RECLAIM, // ul_int
PROCPS_VMSTAT_NR_VMSCAN_WRITE, // ul_int
PROCPS_VMSTAT_NR_WRITEBACK, // ul_int
PROCPS_VMSTAT_NR_WRITEBACK_TEMP, // ul_int
PROCPS_VMSTAT_NR_WRITTEN, // ul_int
PROCPS_VMSTAT_NUMA_FOREIGN, // ul_int
PROCPS_VMSTAT_NUMA_HINT_FAULTS, // ul_int
PROCPS_VMSTAT_NUMA_HINT_FAULTS_LOCAL, // ul_int
PROCPS_VMSTAT_NUMA_HIT, // ul_int
PROCPS_VMSTAT_NUMA_HUGE_PTE_UPDATES, // ul_int
PROCPS_VMSTAT_NUMA_INTERLEAVE, // ul_int
PROCPS_VMSTAT_NUMA_LOCAL, // ul_int
PROCPS_VMSTAT_NUMA_MISS, // ul_int
PROCPS_VMSTAT_NUMA_OTHER, // ul_int
PROCPS_VMSTAT_NUMA_PAGES_MIGRATED, // ul_int
PROCPS_VMSTAT_NUMA_PTE_UPDATES, // ul_int
PROCPS_VMSTAT_PAGEOUTRUN, // ul_int
PROCPS_VMSTAT_PGACTIVATE, // ul_int
PROCPS_VMSTAT_PGALLOC_DMA, // ul_int
PROCPS_VMSTAT_PGALLOC_DMA32, // ul_int
PROCPS_VMSTAT_PGALLOC_MOVABLE, // ul_int
PROCPS_VMSTAT_PGALLOC_NORMAL, // ul_int
PROCPS_VMSTAT_PGDEACTIVATE, // ul_int
PROCPS_VMSTAT_PGFAULT, // ul_int
PROCPS_VMSTAT_PGFREE, // ul_int
PROCPS_VMSTAT_PGINODESTEAL, // ul_int
PROCPS_VMSTAT_PGMAJFAULT, // ul_int
PROCPS_VMSTAT_PGMIGRATE_FAIL, // ul_int
PROCPS_VMSTAT_PGMIGRATE_SUCCESS, // ul_int
PROCPS_VMSTAT_PGPGIN, // ul_int
PROCPS_VMSTAT_PGPGOUT, // ul_int
PROCPS_VMSTAT_PGREFILL_DMA, // ul_int
PROCPS_VMSTAT_PGREFILL_DMA32, // ul_int
PROCPS_VMSTAT_PGREFILL_MOVABLE, // ul_int
PROCPS_VMSTAT_PGREFILL_NORMAL, // ul_int
PROCPS_VMSTAT_PGROTATED, // ul_int
PROCPS_VMSTAT_PGSCAN_DIRECT_DMA, // ul_int
PROCPS_VMSTAT_PGSCAN_DIRECT_DMA32, // ul_int
PROCPS_VMSTAT_PGSCAN_DIRECT_MOVABLE, // ul_int
PROCPS_VMSTAT_PGSCAN_DIRECT_NORMAL, // ul_int
PROCPS_VMSTAT_PGSCAN_DIRECT_THROTTLE, // ul_int
PROCPS_VMSTAT_PGSCAN_KSWAPD_DMA, // ul_int
PROCPS_VMSTAT_PGSCAN_KSWAPD_DMA32, // ul_int
PROCPS_VMSTAT_PGSCAN_KSWAPD_MOVEABLE, // ul_int
PROCPS_VMSTAT_PGSCAN_KSWAPD_NORMAL, // ul_int
PROCPS_VMSTAT_PGSTEAL_DIRECT_DMA, // ul_int
PROCPS_VMSTAT_PGSTEAL_DIRECT_DMA32, // ul_int
PROCPS_VMSTAT_PGSTEAL_DIRECT_MOVABLE, // ul_int
PROCPS_VMSTAT_PGSTEAL_DIRECT_NORMAL, // ul_int
PROCPS_VMSTAT_PGSTEAL_KSWAPD_DMA, // ul_int
PROCPS_VMSTAT_PGSTEAL_KSWAPD_DMA32, // ul_int
PROCPS_VMSTAT_PGSTEAL_KSWAPD_MOVABLE, // ul_int
PROCPS_VMSTAT_PGSTEAL_KSWAPD_NORMAL, // ul_int
PROCPS_VMSTAT_PSWPIN, // ul_int
PROCPS_VMSTAT_PSWPOUT, // ul_int
PROCPS_VMSTAT_noop, // n/a
PROCPS_VMSTAT_stack_end // n/a
PROCPS_VMSTAT_SLABS_SCANNED, // ul_int
PROCPS_VMSTAT_THP_COLLAPSE_ALLOC, // ul_int
PROCPS_VMSTAT_THP_COLLAPSE_ALLOC_FAILED, // ul_int
PROCPS_VMSTAT_THP_FAULT_ALLOC, // ul_int
PROCPS_VMSTAT_THP_FAULT_FALLBACK, // ul_int
PROCPS_VMSTAT_THP_SPLIT, // ul_int
PROCPS_VMSTAT_THP_ZERO_PAGE_ALLOC, // ul_int
PROCPS_VMSTAT_THP_ZERO_PAGE_ALLOC_FAILED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_CLEARED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_CULLED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_MLOCKED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_MUNLOCKED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_RESCUED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_SCANNED, // ul_int
PROCPS_VMSTAT_UNEVICTABLE_PGS_STRANDED, // ul_int
PROCPS_VMSTAT_WORKINGSET_ACTIVATE, // ul_int
PROCPS_VMSTAT_WORKINGSET_NODERECLAIM, // ul_int
PROCPS_VMSTAT_WORKINGSET_REFAULT, // ul_int
PROCPS_VMSTAT_ZONE_RECLAIM_FAILED, // ul_int
PROCPS_VMSTAT_DELTA_ALLOCSTALL, // sl_int
PROCPS_VMSTAT_DELTA_BALLOON_DEFLATE, // sl_int
PROCPS_VMSTAT_DELTA_BALLOON_INFLATE, // sl_int
PROCPS_VMSTAT_DELTA_BALLOON_MIGRATE, // sl_int
PROCPS_VMSTAT_DELTA_COMPACT_FAIL, // sl_int
PROCPS_VMSTAT_DELTA_COMPACT_FREE_SCANNED, // sl_int
PROCPS_VMSTAT_DELTA_COMPACT_ISOLATED, // sl_int
PROCPS_VMSTAT_DELTA_COMPACT_MIGRATE_SCANNED, // sl_int
PROCPS_VMSTAT_DELTA_COMPACT_STALL, // sl_int
PROCPS_VMSTAT_DELTA_COMPACT_SUCCESS, // sl_int
PROCPS_VMSTAT_DELTA_DROP_PAGECACHE, // sl_int
PROCPS_VMSTAT_DELTA_DROP_SLAB, // sl_int
PROCPS_VMSTAT_DELTA_HTLB_BUDDY_ALLOC_FAIL, // sl_int
PROCPS_VMSTAT_DELTA_HTLB_BUDDY_ALLOC_SUCCESS, // sl_int
PROCPS_VMSTAT_DELTA_KSWAPD_HIGH_WMARK_HIT_QUICKLY, // sl_int
PROCPS_VMSTAT_DELTA_KSWAPD_INODESTEAL, // sl_int
PROCPS_VMSTAT_DELTA_KSWAPD_LOW_WMARK_HIT_QUICKLY, // sl_int
PROCPS_VMSTAT_DELTA_NR_ACTIVE_ANON, // sl_int
PROCPS_VMSTAT_DELTA_NR_ACTIVE_FILE, // sl_int
PROCPS_VMSTAT_DELTA_NR_ALLOC_BATCH, // sl_int
PROCPS_VMSTAT_DELTA_NR_ANON_PAGES, // sl_int
PROCPS_VMSTAT_DELTA_NR_ANON_TRANSPARENT_HUGEPAGES, // sl_int
PROCPS_VMSTAT_DELTA_NR_BOUNCE, // sl_int
PROCPS_VMSTAT_DELTA_NR_DIRTIED, // sl_int
PROCPS_VMSTAT_DELTA_NR_DIRTY, // sl_int
PROCPS_VMSTAT_DELTA_NR_DIRTY_BACKGROUND_THRESHOLD, // sl_int
PROCPS_VMSTAT_DELTA_NR_DIRTY_THRESHOLD, // sl_int
PROCPS_VMSTAT_DELTA_NR_FILE_PAGES, // sl_int
PROCPS_VMSTAT_DELTA_NR_FREE_CMA, // sl_int
PROCPS_VMSTAT_DELTA_NR_FREE_PAGES, // sl_int
PROCPS_VMSTAT_DELTA_NR_INACTIVE_ANON, // sl_int
PROCPS_VMSTAT_DELTA_NR_INACTIVE_FILE, // sl_int
PROCPS_VMSTAT_DELTA_NR_ISOLATED_ANON, // sl_int
PROCPS_VMSTAT_DELTA_NR_ISOLATED_FILE, // sl_int
PROCPS_VMSTAT_DELTA_NR_KERNEL_STACK, // sl_int
PROCPS_VMSTAT_DELTA_NR_MAPPED, // sl_int
PROCPS_VMSTAT_DELTA_NR_MLOCK, // sl_int
PROCPS_VMSTAT_DELTA_NR_PAGES_SCANNED, // sl_int
PROCPS_VMSTAT_DELTA_NR_PAGE_TABLE_PAGES, // sl_int
PROCPS_VMSTAT_DELTA_NR_SHMEM, // sl_int
PROCPS_VMSTAT_DELTA_NR_SLAB_RECLAIMABLE, // sl_int
PROCPS_VMSTAT_DELTA_NR_SLAB_UNRECLAIMABLE, // sl_int
PROCPS_VMSTAT_DELTA_NR_UNEVICTABLE, // sl_int
PROCPS_VMSTAT_DELTA_NR_UNSTABLE, // sl_int
PROCPS_VMSTAT_DELTA_NR_VMSCAN_IMMEDIATE_RECLAIM, // sl_int
PROCPS_VMSTAT_DELTA_NR_VMSCAN_WRITE, // sl_int
PROCPS_VMSTAT_DELTA_NR_WRITEBACK, // sl_int
PROCPS_VMSTAT_DELTA_NR_WRITEBACK_TEMP, // sl_int
PROCPS_VMSTAT_DELTA_NR_WRITTEN, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_FOREIGN, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_HINT_FAULTS, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_HINT_FAULTS_LOCAL, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_HIT, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_HUGE_PTE_UPDATES, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_INTERLEAVE, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_LOCAL, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_MISS, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_OTHER, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_PAGES_MIGRATED, // sl_int
PROCPS_VMSTAT_DELTA_NUMA_PTE_UPDATES, // sl_int
PROCPS_VMSTAT_DELTA_PAGEOUTRUN, // sl_int
PROCPS_VMSTAT_DELTA_PGACTIVATE, // sl_int
PROCPS_VMSTAT_DELTA_PGALLOC_DMA, // sl_int
PROCPS_VMSTAT_DELTA_PGALLOC_DMA32, // sl_int
PROCPS_VMSTAT_DELTA_PGALLOC_MOVABLE, // sl_int
PROCPS_VMSTAT_DELTA_PGALLOC_NORMAL, // sl_int
PROCPS_VMSTAT_DELTA_PGDEACTIVATE, // sl_int
PROCPS_VMSTAT_DELTA_PGFAULT, // sl_int
PROCPS_VMSTAT_DELTA_PGFREE, // sl_int
PROCPS_VMSTAT_DELTA_PGINODESTEAL, // sl_int
PROCPS_VMSTAT_DELTA_PGMAJFAULT, // sl_int
PROCPS_VMSTAT_DELTA_PGMIGRATE_FAIL, // sl_int
PROCPS_VMSTAT_DELTA_PGMIGRATE_SUCCESS, // sl_int
PROCPS_VMSTAT_DELTA_PGPGIN, // sl_int
PROCPS_VMSTAT_DELTA_PGPGOUT, // sl_int
PROCPS_VMSTAT_DELTA_PGREFILL_DMA, // sl_int
PROCPS_VMSTAT_DELTA_PGREFILL_DMA32, // sl_int
PROCPS_VMSTAT_DELTA_PGREFILL_MOVABLE, // sl_int
PROCPS_VMSTAT_DELTA_PGREFILL_NORMAL, // sl_int
PROCPS_VMSTAT_DELTA_PGROTATED, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_DIRECT_DMA, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_DIRECT_DMA32, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_DIRECT_MOVABLE, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_DIRECT_NORMAL, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_DIRECT_THROTTLE, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_KSWAPD_DMA, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_KSWAPD_DMA32, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_KSWAPD_MOVEABLE, // sl_int
PROCPS_VMSTAT_DELTA_PGSCAN_KSWAPD_NORMAL, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_DIRECT_DMA, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_DIRECT_DMA32, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_DIRECT_MOVABLE, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_DIRECT_NORMAL, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_KSWAPD_DMA, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_KSWAPD_DMA32, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_KSWAPD_MOVABLE, // sl_int
PROCPS_VMSTAT_DELTA_PGSTEAL_KSWAPD_NORMAL, // sl_int
PROCPS_VMSTAT_DELTA_PSWPIN, // sl_int
PROCPS_VMSTAT_DELTA_PSWPOUT, // sl_int
PROCPS_VMSTAT_DELTA_SLABS_SCANNED, // sl_int
PROCPS_VMSTAT_DELTA_THP_COLLAPSE_ALLOC, // sl_int
PROCPS_VMSTAT_DELTA_THP_COLLAPSE_ALLOC_FAILED, // sl_int
PROCPS_VMSTAT_DELTA_THP_FAULT_ALLOC, // sl_int
PROCPS_VMSTAT_DELTA_THP_FAULT_FALLBACK, // sl_int
PROCPS_VMSTAT_DELTA_THP_SPLIT, // sl_int
PROCPS_VMSTAT_DELTA_THP_ZERO_PAGE_ALLOC, // sl_int
PROCPS_VMSTAT_DELTA_THP_ZERO_PAGE_ALLOC_FAILED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_CLEARED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_CULLED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_MLOCKED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_MUNLOCKED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_RESCUED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_SCANNED, // sl_int
PROCPS_VMSTAT_DELTA_UNEVICTABLE_PGS_STRANDED, // sl_int
PROCPS_VMSTAT_DELTA_WORKINGSET_ACTIVATE, // sl_int
PROCPS_VMSTAT_DELTA_WORKINGSET_NODERECLAIM, // sl_int
PROCPS_VMSTAT_DELTA_WORKINGSET_REFAULT, // sl_int
PROCPS_VMSTAT_DELTA_ZONE_RECLAIM_FAILED // sl_int
};
struct vmstat_result {
enum vmstat_item item;
union {
signed long sl_int;
unsigned long ul_int;
} result;
};
struct vmstat_stack {
struct vmstat_result *head;
};
#define PROCPS_VMSTAT_VAL(rel_enum,type,stack) \
stack -> head [ rel_enum ] . result . type
struct procps_vmstat;
int procps_vmstat_new (struct procps_vmstat **info);
int procps_vmstat_read (struct procps_vmstat *info);
int procps_vmstat_ref (struct procps_vmstat *info);
int procps_vmstat_unref (struct procps_vmstat **info);
unsigned long procps_vmstat_get (
signed long procps_vmstat_get (
struct procps_vmstat *info,
enum vmstat_item item);
int procps_vmstat_getstack (
struct vmstat_stack *procps_vmstat_select (
struct procps_vmstat *info,
struct vmstat_result *these);
enum vmstat_item *items,
int numitems);
__END_DECLS
#endif