static void stat_print(const char *title_string, kstat_t *req, kstat_t *req_old, int field_width, int zflag) { int i, j, nreq, ncolumns; char fixlen[128]; kstat_named_t *knp; kstat_named_t *knp_old; if (req == NULL) return; if (field_width == 0) return; printf("%s\n", title_string); ncolumns = (MAX_COLUMNS -1)/field_width; /* MEANS knp = (kstat_named_t *)req->ks_data */ knp = KSTAT_NAMED_PTR(req); nreq = req->ks_ndata; knp_old = KSTAT_NAMED_PTR(req_old); for (i = 0; i < nreq; i += ncolumns) { /* prints out the titles of the columns */ for (j = i; j < MIN(i + ncolumns, nreq); j++) { printf("%-*s", field_width, knp[j].name); } printf("\n"); /* prints out the stat numbers */ for (j = i; j < MIN(i + ncolumns, nreq); j++) { (void) sprintf(fixlen, "%" PRIu64 " ", (interval && knp_old != NULL) ? (knp[j].value.ui64 - knp_old[j].value.ui64) : knp[j].value.ui64); printf("%-*s", field_width, fixlen); } printf("\n"); } if (zflag) { for (i = 0; i < req->ks_ndata; i++) knp[i].value.ui64 = 0; } if (knp_old != NULL) kstat_copy(req, req_old, 1); else kstat_copy(req, req_old, 0); }
static int acquire_cpus(struct snapshot *ss, kstat_ctl_t *kc) { size_t i; ss->s_nr_cpus = sysconf(_SC_CPUID_MAX) + 1; ss->s_cpus = calloc(ss->s_nr_cpus, sizeof (struct cpu_snapshot)); if (ss->s_cpus == NULL) goto out; for (i = 0; i < ss->s_nr_cpus; i++) { kstat_t *ksp; ss->s_cpus[i].cs_id = ID_NO_CPU; ss->s_cpus[i].cs_state = p_online(i, P_STATUS); /* If no valid CPU is present, move on to the next one */ if (ss->s_cpus[i].cs_state == -1) continue; ss->s_cpus[i].cs_id = i; if ((ksp = kstat_lookup_read(kc, "cpu_info", i, NULL)) == NULL) goto out; (void) pset_assign(PS_QUERY, i, &ss->s_cpus[i].cs_pset_id); if (ss->s_cpus[i].cs_pset_id == PS_NONE) ss->s_cpus[i].cs_pset_id = ID_NO_PSET; if (!CPU_ACTIVE(&ss->s_cpus[i])) continue; if ((ksp = kstat_lookup_read(kc, "cpu", i, "vm")) == NULL) goto out; if (kstat_copy(ksp, &ss->s_cpus[i].cs_vm)) goto out; if ((ksp = kstat_lookup_read(kc, "cpu", i, "sys")) == NULL) goto out; if (kstat_copy(ksp, &ss->s_cpus[i].cs_sys)) goto out; } errno = 0; out: return (errno); }
static void kstat_sum(kstat_t *kstat1, kstat_t *kstat2, kstat_t *sum) { int i; kstat_named_t *knp1, *knp2, *knpsum; if (kstat1 == NULL || kstat2 == NULL) return; knp1 = KSTAT_NAMED_PTR(kstat1); knp2 = KSTAT_NAMED_PTR(kstat2); if (sum->ks_data == NULL) kstat_copy(kstat1, sum, 0); knpsum = KSTAT_NAMED_PTR(sum); for (i = 0; i < (kstat1->ks_ndata); i++) knpsum[i].value.ui64 = knp1[i].value.ui64 + knp2[i].value.ui64; }
static void req_print_v4(kstat_t *req, kstat_t *req_old, int field_width, int zflag) { int i, j, nreq, per, ncolumns; uint64_t tot, tot_ops, old_tot, old_tot_ops; char fixlen[128]; kstat_named_t *kptr; kstat_named_t *knp; kstat_named_t *kptr_old; if (req == NULL) return; if (field_width == 0) return; ncolumns = (MAX_COLUMNS)/field_width; kptr = KSTAT_NAMED_PTR(req); kptr_old = KSTAT_NAMED_PTR(req_old); if (kptr_old == NULL) { old_tot_ops = 0; old_tot = 0; } else { old_tot = kptr_old[0].value.ui64 + kptr_old[1].value.ui64; for (i = 2, old_tot_ops = 0; i < req_old->ks_ndata; i++) old_tot_ops += kptr_old[i].value.ui64; } /* Count the number of operations sent */ for (i = 2, tot_ops = 0; i < req->ks_ndata; i++) tot_ops += kptr[i].value.ui64; /* For v4 NULL/COMPOUND are the only procedures */ tot = kptr[0].value.ui64 + kptr[1].value.ui64; if (interval) { tot -= old_tot; tot_ops -= old_tot_ops; } printf("Version 4: (%" PRIu64 " calls)\n", tot); knp = kstat_data_lookup(req, "null"); nreq = req->ks_ndata - (knp - KSTAT_NAMED_PTR(req)); for (i = 0; i < COUNT; i += ncolumns) { for (j = i; j < MIN(i + ncolumns, 2); j++) { printf("%-*s", field_width, knp[j].name); } printf("\n"); for (j = i; j < MIN(i + ncolumns, 2); j++) { if (tot && interval && kptr_old != NULL) per = (int)((knp[j].value.ui64 - kptr_old[j].value.ui64) * 100 / tot); else if (tot) per = (int)(knp[j].value.ui64 * 100 / tot); else per = 0; (void) sprintf(fixlen, "%" PRIu64 " %d%% ", ((interval && kptr_old != NULL) ? (knp[j].value.ui64 - kptr_old[j].value.ui64) : knp[j].value.ui64), per); printf("%-*s", field_width, fixlen); } printf("\n"); } printf("Version 4: (%" PRIu64 " operations)\n", tot_ops); for (i = 2; i < nreq; i += ncolumns) { for (j = i; j < MIN(i + ncolumns, nreq); j++) { printf("%-*s", field_width, knp[j].name); } printf("\n"); for (j = i; j < MIN(i + ncolumns, nreq); j++) { if (tot_ops && interval && kptr_old != NULL) per = (int)((knp[j].value.ui64 - kptr_old[j].value.ui64) * 100 / tot_ops); else if (tot_ops) per = (int)(knp[j].value.ui64 * 100 / tot_ops); else per = 0; (void) sprintf(fixlen, "%" PRIu64 " %d%% ", ((interval && kptr_old != NULL) ? (knp[j].value.ui64 - kptr_old[j].value.ui64) : knp[j].value.ui64), per); printf("%-*s", field_width, fixlen); } printf("\n"); } if (zflag) { for (i = 0; i < req->ks_ndata; i++) kptr[i].value.ui64 = 0; } if (kptr_old != NULL) kstat_copy(req, req_old, 1); else kstat_copy(req, req_old, 0); }
static void req_print(kstat_t *req, kstat_t *req_old, int ver, int field_width, int zflag) { int i, j, nreq, per, ncolumns; uint64_t tot, old_tot; char fixlen[128]; kstat_named_t *knp; kstat_named_t *kptr; kstat_named_t *knp_old; if (req == NULL) return; if (field_width == 0) return; ncolumns = (MAX_COLUMNS -1)/field_width; knp = kstat_data_lookup(req, "null"); knp_old = KSTAT_NAMED_PTR(req_old); kptr = KSTAT_NAMED_PTR(req); nreq = req->ks_ndata - (knp - KSTAT_NAMED_PTR(req)); tot = 0; old_tot = 0; if (knp_old == NULL) { old_tot = 0; } for (i = 0; i < req->ks_ndata; i++) tot += kptr[i].value.ui64; if (interval && knp_old != NULL) { for (i = 0; i < req_old->ks_ndata; i++) old_tot += knp_old[i].value.ui64; tot -= old_tot; } printf("Version %d: (%" PRIu64 " calls)\n", ver, tot); for (i = 0; i < nreq; i += ncolumns) { for (j = i; j < MIN(i + ncolumns, nreq); j++) { printf("%-*s", field_width, knp[j].name); } printf("\n"); for (j = i; j < MIN(i + ncolumns, nreq); j++) { if (tot && interval && knp_old != NULL) per = (int)((knp[j].value.ui64 - knp_old[j].value.ui64) * 100 / tot); else if (tot) per = (int)(knp[j].value.ui64 * 100 / tot); else per = 0; (void) sprintf(fixlen, "%" PRIu64 " %d%% ", ((interval && knp_old != NULL) ? (knp[j].value.ui64 - knp_old[j].value.ui64) : knp[j].value.ui64), per); printf("%-*s", field_width, fixlen); } printf("\n"); } if (zflag) { for (i = 0; i < req->ks_ndata; i++) knp[i].value.ui64 = 0; } if (knp_old != NULL) kstat_copy(req, req_old, 1); else kstat_copy(req, req_old, 0); }