3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner/***********************************************************************
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* and is licensed under the *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Common Public License, Version 1.0 *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* by AT&T Intellectual Property *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* A copy of the License is available at *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* http://www.opensource.org/licenses/cpl1.0.txt *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Information and Software Systems Research *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* AT&T Research *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Florham Park NJ *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Glenn Fowler <gsf@research.att.com> *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* David Korn <dgk@research.att.com> *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner***********************************************************************/
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#pragma prototyped
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#define FORMAT "region=%(region)p size=%(size)d segments=%(segments)d busy=(%(busy_size)d,%(busy_blocks)d,%(busy_max)d) free=(%(free_size)d,%(free_blocks)d,%(free_max)d)"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerstatic const char usage[] =
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner"[-?\n@(#)$Id: vmstate (AT&T Research) 2010-03-05 $\n]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. FaulknerUSAGE_LICENSE
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner"[+NAME?vmstate - list the calling process vmalloc region state]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner"[+DESCRIPTION?When invoked as a shell builtin, \bvmstate\b lists the "
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "calling process \bvmalloc\b(3) state for all regions.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner"[f:format?List the ids specified by \aformat\a. \aformat\a follows "
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "\bprintf\b(3) conventions, except that \bsfio\b(3) inline ids are used "
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "instead of arguments: "
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "%[-+]][\awidth\a[.\aprecis\a[.\abase\a]]]]]](\aid\a)\achar\a. The "
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "supported \aid\as are:]:[format:=" FORMAT "]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "{"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+size?The total region size.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+segments?The number of segments in the region.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+busy_size?The total busy block size.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+busy_blocks?The number of busy blocks.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+busy_max?The maximum busy block size.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+free_size?The total free block size.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+free_blocks?The number of free blocks.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "[+free_max?The maximum free block size.]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner "}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner"[+SEE ALSO?\bvmalloc\b(3)]"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#include <cmd.h>
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#include <vmalloc.h>
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknertypedef struct State_s
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner char* format;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner Vmalloc_t* vm;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner Vmstat_t vs;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner unsigned int regions;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner Vmalloc_t* region[256];
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner} State_t;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner/*
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * sfkeyprintf() lookup
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * handle==0 for heading
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerstatic int
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerkey(void* handle, Sffmt_t* fp, const char* arg, char** ps, Sflong_t* pn)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner register State_t* state = (State_t*)handle;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner register char* s;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (!(s = fp->t_str) || streq(s, "size"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.extent;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "region"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = integralof(state->vm);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "segments"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.n_seg;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "busy_size"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.s_busy;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "busy_blocks"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.n_busy;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "busy_max"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.m_busy;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "free_size"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.s_free;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "free_blocks"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.n_free;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "free_max"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *pn = state->vs.m_free;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (streq(s, "format"))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *ps = (char*)state->format;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner error(2, "%s: unknown format identifier", s);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return 1;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerstatic int
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknervisit(Vmalloc_t* vm, void* addr, size_t size, Vmdisc_t* disc, void* handle)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner State_t* state = (State_t*)handle;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner Vmstat_t vs;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (vm != state->vm)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner state->vm = vm;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (state->regions < elementsof(state->region))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner state->region[state->regions++] = vm;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerint
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerb_vmstate(int argc, char** argv, void* context)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner register int i;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner State_t state;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner memset(&state, 0, sizeof(state));
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner cmdinit(argc, argv, context, ERROR_CATALOG, 0);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for (;;)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner switch (optget(argv, usage))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner case 'f':
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner state.format = opt_info.arg;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner continue;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner case '?':
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner error(ERROR_USAGE|4, "%s", opt_info.arg);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner continue;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner case ':':
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner error(2, "%s", opt_info.arg);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner continue;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner break;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner argv += opt_info.index;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (error_info.errors || *argv)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner error(ERROR_USAGE|4, "%s", optusage(NiL));
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (!state.format)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner state.format = FORMAT;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner /*
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * the walk must do no allocations because it locks the regions
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner vmwalk(NiL, visit, &state);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner /*
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * now we can compute and list the state of each region
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for (i = 0; i < state.regions; i++)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner state.vm = state.region[i];
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner vmstat(state.vm, &state.vs);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner sfkeyprintf(sfstdout, &state, state.format, key, NiL);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner sfprintf(sfstdout, "\n");
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}