Annotation of src/usr.bin/systat/pool.c, Revision 1.1
1.1 ! canacar 1: /* $OpenBSD$ */
! 2: /*
! 3: * Copyright (c) 2008 Can Erkin Acar <canacar@openbsd.org>
! 4: *
! 5: * Permission to use, copy, modify, and distribute this software for any
! 6: * purpose with or without fee is hereby granted, provided that the above
! 7: * copyright notice and this permission notice appear in all copies.
! 8: *
! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 16: */
! 17:
! 18: #include <sys/types.h>
! 19: #include <sys/param.h>
! 20: #include <sys/sysctl.h>
! 21: #include <sys/pool.h>
! 22: #include <errno.h>
! 23: #include <stdlib.h>
! 24:
! 25: #include "systat.h"
! 26:
! 27: void print_pool(void);
! 28: int read_pool(void);
! 29: void sort_pool(void);
! 30: int select_pool(void);
! 31: void showpool(int k);
! 32:
! 33: /* qsort callbacks */
! 34: int sort_name_callback(const void *s1, const void *s2);
! 35:
! 36: struct pool_info {
! 37: char name[32];
! 38: struct pool pool;
! 39: };
! 40:
! 41:
! 42: int num_pools = 0;
! 43: struct pool_info *pools = NULL;
! 44:
! 45:
! 46: field_def fields_pool[] = {
! 47: {"NAME", 11, 32, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
! 48: {"SIZE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 49: {"REQUESTS", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 50: {"FAIL", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 51: {"INUSE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 52: {"PGREQ", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 53: {"PGREL", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 54: {"NPAGE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 55: {"HIWAT", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 56: {"MINPG", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 57: {"MAXPG", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 58: {"IDLE", 8, 24, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}
! 59: };
! 60:
! 61:
! 62: #define FIELD_ADDR(x) (&fields_pool[x])
! 63:
! 64: #define FLD_POOL_NAME FIELD_ADDR(0)
! 65: #define FLD_POOL_SIZE FIELD_ADDR(1)
! 66: #define FLD_POOL_REQS FIELD_ADDR(2)
! 67: #define FLD_POOL_FAIL FIELD_ADDR(3)
! 68: #define FLD_POOL_INUSE FIELD_ADDR(4)
! 69: #define FLD_POOL_PGREQ FIELD_ADDR(5)
! 70: #define FLD_POOL_PGREL FIELD_ADDR(6)
! 71: #define FLD_POOL_NPAGE FIELD_ADDR(7)
! 72: #define FLD_POOL_HIWAT FIELD_ADDR(8)
! 73: #define FLD_POOL_MINPG FIELD_ADDR(9)
! 74: #define FLD_POOL_MAXPG FIELD_ADDR(10)
! 75: #define FLD_POOL_IDLE FIELD_ADDR(11)
! 76:
! 77: /* Define views */
! 78: field_def *view_pool_0[] = {
! 79: FLD_POOL_NAME, FLD_POOL_SIZE, FLD_POOL_REQS, FLD_POOL_FAIL,
! 80: FLD_POOL_INUSE, FLD_POOL_PGREQ, FLD_POOL_PGREL, FLD_POOL_NPAGE,
! 81: FLD_POOL_HIWAT, FLD_POOL_MINPG, FLD_POOL_MAXPG, FLD_POOL_IDLE, NULL
! 82: };
! 83:
! 84: order_type pool_order_list[] = {
! 85: {"name", "name", 0, sort_name_callback},
! 86: {NULL, NULL, 0, NULL}
! 87: };
! 88:
! 89: /* Define view managers */
! 90: struct view_manager pool_mgr = {
! 91: "Pool", select_pool, read_pool, sort_pool, print_header,
! 92: print_pool, keyboard_callback, pool_order_list, pool_order_list
! 93: };
! 94:
! 95: field_view views_pool[] = {
! 96: {view_pool_0, "pool", '5', &pool_mgr},
! 97: {NULL, NULL, 0, NULL}
! 98: };
! 99:
! 100:
! 101: int
! 102: sort_name_callback(const void *s1, const void *s2)
! 103: {
! 104: struct pool_info *p1, *p2;
! 105: p1 = (struct pool_info *)s1;
! 106: p2 = (struct pool_info *)s2;
! 107:
! 108: return strcmp(p1->name, p2->name);
! 109: }
! 110:
! 111: void
! 112: sort_pool(void)
! 113: {
! 114: order_type *ordering;
! 115:
! 116: if (curr_mgr == NULL)
! 117: return;
! 118:
! 119: ordering = curr_mgr->order_curr;
! 120:
! 121: if (ordering == NULL)
! 122: return;
! 123: if (ordering->func == NULL)
! 124: return;
! 125: if (pools == NULL)
! 126: return;
! 127: if (num_pools <= 0)
! 128: return;
! 129:
! 130: qsort(pools, num_pools, sizeof(struct pool_info), ordering->func);
! 131: }
! 132:
! 133: int
! 134: select_pool(void)
! 135: {
! 136: num_disp = num_pools;
! 137: return (0);
! 138: }
! 139:
! 140: int
! 141: read_pool(void)
! 142: {
! 143: int mib[4], np, i;
! 144: size_t size;
! 145:
! 146: mib[0] = CTL_KERN;
! 147: mib[1] = KERN_POOL;
! 148: mib[2] = KERN_POOL_NPOOLS;
! 149: size = sizeof(np);
! 150:
! 151: if (sysctl(mib, 3, &np, &size, NULL, 0) < 0) {
! 152: error("sysctl(npools): %s", strerror(errno));
! 153: return (-1);
! 154: }
! 155:
! 156: if (np <= 0) {
! 157: num_pools = 0;
! 158: return (0);
! 159: }
! 160:
! 161: if (np > num_pools || pools == NULL) {
! 162: struct pool_info *p = realloc(pools, sizeof(*pools) * np);
! 163: if (p == NULL) {
! 164: error("realloc: %s", strerror(errno));
! 165: return (-1);
! 166: }
! 167: pools = p;
! 168: num_pools = np;
! 169: }
! 170:
! 171: for (i = 0; i < num_pools; i++) {
! 172: mib[0] = CTL_KERN;
! 173: mib[1] = KERN_POOL;
! 174: mib[2] = KERN_POOL_POOL;
! 175: mib[3] = i + 1;
! 176: size = sizeof(struct pool);
! 177: if (sysctl(mib, 4, &pools[i].pool, &size, NULL, 0) < 0) {
! 178: error("sysctl(pool): %s", strerror(errno));
! 179: break;
! 180: }
! 181: mib[2] = KERN_POOL_NAME;
! 182: size = sizeof(pools[i].name);
! 183: if (sysctl(mib, 4, &pools[i].name, &size, NULL, 0) < 0) {
! 184: error("sysctl(pool_name): %s", strerror(errno));
! 185: break;
! 186: }
! 187: }
! 188:
! 189: if (i != num_pools) {
! 190: memset(pools, 0, sizeof(*pools) * num_pools);
! 191: return (-1);
! 192: }
! 193:
! 194: return 0;
! 195: }
! 196:
! 197:
! 198: void
! 199: print_pool(void)
! 200: {
! 201: int n, count = 0;
! 202:
! 203: if (pools == NULL)
! 204: return;
! 205:
! 206: for (n = dispstart; n < num_disp; n++) {
! 207: showpool(n);
! 208: count++;
! 209: if (maxprint > 0 && count >= maxprint)
! 210: break;
! 211: }
! 212: }
! 213:
! 214: int
! 215: initpool(void)
! 216: {
! 217: field_view *v;
! 218:
! 219: for (v = views_pool; v->name != NULL; v++)
! 220: add_view(v);
! 221:
! 222: read_pool();
! 223:
! 224: return(0);
! 225: }
! 226:
! 227: void
! 228: showpool(int k)
! 229: {
! 230: struct pool_info *p = pools + k;
! 231:
! 232: if (k < 0 || k >= num_pools)
! 233: return;
! 234:
! 235: print_fld_str(FLD_POOL_NAME, p->name);
! 236: print_fld_uint(FLD_POOL_SIZE, p->pool.pr_size);
! 237:
! 238: print_fld_size(FLD_POOL_REQS, p->pool.pr_nget);
! 239: print_fld_size(FLD_POOL_FAIL, p->pool.pr_nfail);
! 240: print_fld_ssize(FLD_POOL_INUSE, p->pool.pr_nget - p->pool.pr_nput);
! 241: print_fld_size(FLD_POOL_PGREQ, p->pool.pr_npagealloc);
! 242: print_fld_size(FLD_POOL_PGREL, p->pool.pr_npagefree);
! 243:
! 244: print_fld_size(FLD_POOL_NPAGE, p->pool.pr_npages);
! 245: print_fld_size(FLD_POOL_HIWAT, p->pool.pr_hiwat);
! 246: print_fld_size(FLD_POOL_MINPG, p->pool.pr_minpages);
! 247:
! 248: if (p->pool.pr_maxpages == UINT_MAX)
! 249: print_fld_str(FLD_POOL_MAXPG, "inf");
! 250: else
! 251: print_fld_size(FLD_POOL_MAXPG, p->pool.pr_maxpages);
! 252:
! 253: print_fld_size(FLD_POOL_IDLE, p->pool.pr_nidle);
! 254:
! 255: end_line();
! 256: }