svn commit: r345804 - head/usr.bin/systat
Michael
mike at reifenberger.com
Tue Apr 2 16:09:07 UTC 2019
Hi,
Am 2. April 2019 16:08:17 MESZ schrieb "Rodney W. Grimes" <freebsd at gndrsh.dnsmgr.net>:
>> Author: mr
>> Date: Tue Apr 2 14:01:03 2019
>> New Revision: 345804
>> URL: https://svnweb.freebsd.org/changeset/base/345804
>>
>> Log:
>> systat -zarc to display disk activities like -vm
>>
>> PR: 213310
>> Submitted by: ota
>> MFH: 4 weeks
>
>? MFC:
Yes, indeed.
>
>> Differential Revision: https://reviews.freebsd.org/D18726
>>
>> Modified:
>> head/usr.bin/systat/devs.c
>> head/usr.bin/systat/devs.h
>> head/usr.bin/systat/iostat.c
>> head/usr.bin/systat/swap.c
>> head/usr.bin/systat/systat.h
>> head/usr.bin/systat/vmstat.c
>> head/usr.bin/systat/zarc.c
>>
>> Modified: head/usr.bin/systat/devs.c
>>
>==============================================================================
>> --- head/usr.bin/systat/devs.c Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/devs.c Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -2,6 +2,7 @@
>> * SPDX-License-Identifier: BSD-3-Clause
>> *
>> * Copyright (c) 1998 Kenneth D. Merry.
>> + * 2015 Yoshihiro Ota
>> * All rights reserved.
>
>
>Can we get in contact with Yoshihiro Ota about his
>copyright statements, and correcting this to make
>it clear that it is Kenneth D. Merry that is asserting
>"All rights reserved" and if Ota does nor does not wish to assert
>"All rights reserved".
>
>As committed this makes a grey area on Kenneth's assertion,
>also leaving out the word copyright on Yoshihiro's line is a bit iffy.
>
>I am only commenting once, this issue appears several times.
>We can go back out to D18726 to discuss it if need be.
>
You could add a comment in the PR too, I intended to keep it open until MFC
>> *
>> * Redistribution and use in source and binary forms, with or
>without
>> @@ -69,7 +70,6 @@ static const char sccsid[] = "@(#)disks.c 8.1
>(Berkele
>> #include <sys/resource.h>
>>
>> #include <ctype.h>
>> -#include <devstat.h>
>> #include <err.h>
>> #include <stdlib.h>
>> #include <string.h>
>> @@ -84,6 +84,8 @@ typedef enum {
>> DS_MATCHTYPE_PATTERN
>> } last_match_type;
>>
>> +struct statinfo cur_dev, last_dev, run_dev;
>> +
>> last_match_type last_type;
>> struct device_selection *dev_select;
>> long generation;
>> @@ -101,10 +103,8 @@ static int dsselect(const char *args,
>devstat_select_m
>> int maxshowdevs, struct statinfo *s1);
>>
>> int
>> -dsinit(int maxshowdevs, struct statinfo *s1, struct statinfo *s2
>__unused,
>> - struct statinfo *s3 __unused)
>> +dsinit(int maxshowdevs)
>> {
>> -
>> /*
>> * Make sure that the userland devstat version matches the kernel
>> * devstat version. If not, exit and print a message informing
>> @@ -113,6 +113,18 @@ dsinit(int maxshowdevs, struct statinfo *s1,
>struct st
>> if (devstat_checkversion(NULL) < 0)
>> errx(1, "%s", devstat_errbuf);
>>
>> + if( cur_dev.dinfo ) // init was alreay ran
>> + return(1);
>> +
>> + if ((num_devices = devstat_getnumdevs(NULL)) < 0) {
>> + warnx("%s", devstat_errbuf);
>> + return(0);
>> + }
>> +
>> + cur_dev.dinfo = calloc(1, sizeof(struct devinfo));
>> + last_dev.dinfo = calloc(1, sizeof(struct devinfo));
>> + run_dev.dinfo = calloc(1, sizeof(struct devinfo));
>> +
>> generation = 0;
>> num_devices = 0;
>> num_selected = 0;
>> @@ -120,11 +132,11 @@ dsinit(int maxshowdevs, struct statinfo *s1,
>struct st
>> select_generation = 0;
>> last_type = DS_MATCHTYPE_NONE;
>>
>> - if (devstat_getdevs(NULL, s1) == -1)
>> + if (devstat_getdevs(NULL, &cur_dev) == -1)
>> errx(1, "%s", devstat_errbuf);
>>
>> - num_devices = s1->dinfo->numdevs;
>> - generation = s1->dinfo->generation;
>> + num_devices = cur_dev.dinfo->numdevs;
>> + generation = cur_dev.dinfo->generation;
>>
>> dev_select = NULL;
>>
>> @@ -134,13 +146,31 @@ dsinit(int maxshowdevs, struct statinfo *s1,
>struct st
>> * or 1. If we get back -1, though, there is an error.
>> */
>> if (devstat_selectdevs(&dev_select, &num_selected, &num_selections,
>> - &select_generation, generation, s1->dinfo->devices,
>num_devices,
>> + &select_generation, generation, cur_dev.dinfo->devices,
>num_devices,
>> NULL, 0, NULL, 0, DS_SELECT_ADD, maxshowdevs, 0) == -1)
>> errx(1, "%d %s", __LINE__, devstat_errbuf);
>>
>> return(1);
>> }
>>
>> +
>> +void
>> +dsgetinfo(struct statinfo* dev)
>> +{
>> + switch (devstat_getdevs(NULL, dev)) {
>> + case -1:
>> + errx(1, "%s", devstat_errbuf);
>> + break;
>> + case 1:
>> + num_devices = dev->dinfo->numdevs;
>> + generation = dev->dinfo->generation;
>> + cmdkre("refresh", NULL);
>> + break;
>> + default:
>> + break;
>> + }
>> +}
>> +
>> int
>> dscmd(const char *cmd, const char *args, int maxshowdevs, struct
>statinfo *s1)
>> {
>> @@ -330,4 +360,84 @@ dsselect(const char *args, devstat_select_mode
>select_
>> return(2);
>> }
>> return(1);
>> +}
>> +
>> +
>> +void
>> +dslabel(int maxdrives, int diskcol, int diskrow)
>> +{
>> + int i, j;
>> +
>> + mvprintw(diskrow, diskcol, "Disks");
>> + mvprintw(diskrow + 1, diskcol, "KB/t");
>> + mvprintw(diskrow + 2, diskcol, "tps");
>> + mvprintw(diskrow + 3, diskcol, "MB/s");
>> + mvprintw(diskrow + 4, diskcol, "%%busy");
>> + /*
>> + * For now, we don't support a fourth disk statistic. So there's
>> + * no point in providing a label for it. If someone can think of a
>> + * fourth useful disk statistic, there is room to add it.
>> + */
>> + /* mvprintw(diskrow + 4, diskcol, " msps"); */
>> + j = 0;
>> + for (i = 0; i < num_devices && j < maxdrives; i++)
>> + if (dev_select[i].selected) {
>> + char tmpstr[80];
>> + sprintf(tmpstr, "%s%d", dev_select[i].device_name,
>> + dev_select[i].unit_number);
>> + mvprintw(diskrow, diskcol + 5 + 6 * j,
>> + " %5.5s", tmpstr);
>> + j++;
>> + }
>> +}
>> +
>> +static void
>> +dsshow2(int diskcol, int diskrow, int dn, int lc, struct statinfo
>*now, struct statinfo *then)
>> +{
>> + long double transfers_per_second;
>> + long double kb_per_transfer, mb_per_second;
>> + long double elapsed_time, device_busy;
>> + int di;
>> +
>> + di = dev_select[dn].position;
>> +
>> + if (then != NULL) {
>> + /* Calculate relative to previous sample */
>> + elapsed_time = now->snap_time - then->snap_time;
>> + } else {
>> + /* Calculate relative to device creation */
>> + elapsed_time = now->snap_time - devstat_compute_etime(
>> + &now->dinfo->devices[di].creation_time, NULL);
>> + }
>> +
>> + if (devstat_compute_statistics(&now->dinfo->devices[di], then ?
>> + &then->dinfo->devices[di] : NULL, elapsed_time,
>> + DSM_KB_PER_TRANSFER, &kb_per_transfer,
>> + DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
>> + DSM_MB_PER_SECOND, &mb_per_second,
>> + DSM_BUSY_PCT, &device_busy,
>> + DSM_NONE) != 0)
>> + errx(1, "%s", devstat_errbuf);
>> +
>> + lc = diskcol + lc * 6;
>> + putlongdouble(kb_per_transfer, diskrow + 1, lc, 5, 2, 0);
>> + putlongdouble(transfers_per_second, diskrow + 2, lc, 5, 0, 0);
>> + putlongdouble(mb_per_second, diskrow + 3, lc, 5, 2, 0);
>> + putlongdouble(device_busy, diskrow + 4, lc, 5, 0, 0);
>> +}
>> +
>> +static void
>> +dsshow3(int diskcol, int diskrow, int dn, int lc, struct statinfo
>*now, struct statinfo *then)
>> +{
>> + dsshow2(diskcol, diskrow, dn, lc, now, then);
>> +}
>> +
>> +void
>> +dsshow(int maxdrives, int diskcol, int diskrow, struct statinfo
>*now, struct statinfo *then)
>> +{
>> + int i, lc;
>> +
>> + for (i = 0, lc = 0; i < num_devices && lc < maxdrives; i++)
>> + if (dev_select[i].selected)
>> + dsshow3(diskcol, diskrow, i, ++lc, now, then);
>> }
>>
>> Modified: head/usr.bin/systat/devs.h
>>
>==============================================================================
>> --- head/usr.bin/systat/devs.h Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/devs.h Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -2,6 +2,7 @@
>> * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
>> *
>> * Copyright (c) 1998 David E. O'Brien
>> + * 2015 Yoshihiro Ota
>> * All rights reserved.
>> *
>> * Redistribution and use in source and binary forms, with or
>without
>> @@ -28,5 +29,18 @@
>> * $FreeBSD$
>> */
>>
>> -int dsinit(int, struct statinfo *, struct statinfo *, struct
>statinfo *);
>> +#ifndef DEVS_H
>> +#define DEVS_H
>> +
>> +#include <devstat.h>
>> +
>> +int dsinit(int);
>> +void dsgetinfo(struct statinfo *);
>> int dscmd(const char *, const char *, int, struct statinfo *);
>> +
>> +void dslabel(int, int, int);
>> +void dsshow(int, int, int, struct statinfo *, struct statinfo *);
>> +
>> +extern struct statinfo cur_dev, last_dev, run_dev;
>> +
>> +#endif
>>
>> Modified: head/usr.bin/systat/iostat.c
>>
>==============================================================================
>> --- head/usr.bin/systat/iostat.c Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/iostat.c Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -79,8 +79,6 @@ static const char sccsid[] = "@(#)iostat.c 8.1
>(Berkel
>> #include "extern.h"
>> #include "devs.h"
>>
>> -struct statinfo cur, last;
>> -
>> static int linesperregion;
>> static double etime;
>> static int numbers = 0; /* default display bar graphs */
>> @@ -111,17 +109,11 @@ closeiostat(WINDOW *w)
>> int
>> initiostat(void)
>> {
>> - if ((num_devices = devstat_getnumdevs(NULL)) < 0)
>> - return(0);
>> -
>> - cur.dinfo = calloc(1, sizeof(struct devinfo));
>> - last.dinfo = calloc(1, sizeof(struct devinfo));
>> -
>> /*
>> * This value for maxshowdevs (100) is bogus. I'm not sure exactly
>> * how to calculate it, though.
>> */
>> - if (dsinit(100, &cur, &last, NULL) != 1)
>> + if (dsinit(7) != 1)
>> return(0);
>>
>> return(1);
>> @@ -133,17 +125,17 @@ fetchiostat(void)
>> struct devinfo *tmp_dinfo;
>> size_t len;
>>
>> - len = sizeof(cur.cp_time);
>> - if (sysctlbyname("kern.cp_time", &cur.cp_time, &len, NULL, 0)
>> - || len != sizeof(cur.cp_time)) {
>> + len = sizeof(cur_dev.cp_time);
>> + if (sysctlbyname("kern.cp_time", &cur_dev.cp_time, &len, NULL, 0)
>> + || len != sizeof(cur_dev.cp_time)) {
>> perror("kern.cp_time");
>> exit (1);
>> }
>> - tmp_dinfo = last.dinfo;
>> - last.dinfo = cur.dinfo;
>> - cur.dinfo = tmp_dinfo;
>> + tmp_dinfo = last_dev.dinfo;
>> + last_dev.dinfo = cur_dev.dinfo;
>> + cur_dev.dinfo = tmp_dinfo;
>>
>> - last.snap_time = cur.snap_time;
>> + last_dev.snap_time = cur_dev.snap_time;
>>
>> /*
>> * Here what we want to do is refresh our device stats.
>> @@ -152,7 +144,7 @@ fetchiostat(void)
>> * the selection process again, in case a device that we
>> * were previously displaying has gone away.
>> */
>> - switch (devstat_getdevs(NULL, &cur)) {
>> + switch (devstat_getdevs(NULL, &cur_dev)) {
>> case -1:
>> errx(1, "%s", devstat_errbuf);
>> break;
>> @@ -162,8 +154,8 @@ fetchiostat(void)
>> default:
>> break;
>> }
>> - num_devices = cur.dinfo->numdevs;
>> - generation = cur.dinfo->generation;
>> + num_devices = cur_dev.dinfo->numdevs;
>> + generation = cur_dev.dinfo->generation;
>>
>> }
>>
>> @@ -260,11 +252,11 @@ showiostat(void)
>> long t;
>> int i, row, _col;
>>
>> -#define X(fld) t = cur.fld[i]; cur.fld[i] -= last.fld[i];
>last.fld[i] = t
>> +#define X(fld) t = cur_dev.fld[i]; cur_dev.fld[i] -=
>last_dev.fld[i]; last_dev.fld[i] = t
>> etime = 0;
>> for(i = 0; i < CPUSTATES; i++) {
>> X(cp_time);
>> - etime += cur.cp_time[i];
>> + etime += cur_dev.cp_time[i];
>> }
>> if (etime == 0.0)
>> etime = 1.0;
>> @@ -313,10 +305,10 @@ devstats(int row, int _col, int dn)
>>
>> di = dev_select[dn].position;
>>
>> - busy_seconds = cur.snap_time - last.snap_time;
>> + busy_seconds = cur_dev.snap_time - last_dev.snap_time;
>>
>> - if (devstat_compute_statistics(&cur.dinfo->devices[di],
>> - &last.dinfo->devices[di], busy_seconds,
>> + if (devstat_compute_statistics(&cur_dev.dinfo->devices[di],
>> + &last_dev.dinfo->devices[di], busy_seconds,
>> DSM_KB_PER_TRANSFER, &kb_per_transfer,
>> DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
>> DSM_MB_PER_SECOND, &mb_per_second, DSM_NONE) != 0)
>> @@ -349,12 +341,12 @@ stat1(int row, int o)
>>
>> dtime = 0.0;
>> for (i = 0; i < CPUSTATES; i++)
>> - dtime += cur.cp_time[i];
>> + dtime += cur_dev.cp_time[i];
>> if (dtime == 0.0)
>> dtime = 1.0;
>> wmove(wnd, row, INSET);
>> #define CPUSCALE 0.5
>> - histogram(100.0 * cur.cp_time[o] / dtime, 50, CPUSCALE);
>> + histogram(100.0 * cur_dev.cp_time[o] / dtime, 50, CPUSCALE);
>> }
>>
>> static void
>> @@ -388,7 +380,7 @@ cmdiostat(const char *cmd, const char *args)
>> numbers = 1;
>> else if (prefix(cmd, "bars"))
>> numbers = 0;
>> - else if (!dscmd(cmd, args, 100, &cur))
>> + else if (!dscmd(cmd, args, 100, &cur_dev))
>> return (0);
>> wclear(wnd);
>> labeliostat();
>>
>> Modified: head/usr.bin/systat/swap.c
>>
>==============================================================================
>> --- head/usr.bin/systat/swap.c Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/swap.c Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -3,6 +3,7 @@
>> *
>> * Copyright (c) 1980, 1992, 1993
>> * The Regents of the University of California. All rights
>reserved.
>> + * Copyright (c) 2017 Yoshihiro Ota
>> *
>> * Redistribution and use in source and binary forms, with or
>without
>> * modification, are permitted provided that the following
>conditions
>> @@ -55,6 +56,7 @@ static const char sccsid[] = "@(#)swap.c 8.3
>(Berkeley
>>
>> #include "systat.h"
>> #include "extern.h"
>> +#include "devs.h"
>>
>> kvm_t *kd;
>>
>> @@ -137,13 +139,15 @@ initswap(void)
>> oulen = ulen;
>>
>> once = 1;
>> +
>> + dsinit(12);
>> +
>> return (1);
>> }
>>
>> void
>> fetchswap(void)
>> {
>> -
>> okvnsw = kvnsw;
>> if ((kvnsw = kvm_getswapinfo(kd, kvmsw, NSWAP, 0)) < 0) {
>> error("systat: kvm_getswapinfo failed");
>> @@ -153,6 +157,15 @@ fetchswap(void)
>> odlen = dlen;
>> oulen = ulen;
>> calclens();
>> +
>> + struct devinfo *tmp_dinfo;
>> +
>> + tmp_dinfo = last_dev.dinfo;
>> + last_dev.dinfo = cur_dev.dinfo;
>> + cur_dev.dinfo = tmp_dinfo;
>> +
>> + last_dev.snap_time = cur_dev.snap_time;
>> + dsgetinfo( &cur_dev );
>> }
>>
>> void
>> @@ -178,6 +191,7 @@ labelswap(void)
>> name = kvmsw[i].ksw_devname;
>> mvwprintw(wnd, i + 1, 0, "%*s", -dlen, name);
>> }
>> + dslabel(12, 0, 18);
>> }
>>
>> void
>> @@ -217,4 +231,5 @@ showswap(void)
>> waddch(wnd, 'X');
>> wclrtoeol(wnd);
>> }
>> + dsshow(12, 0, 18, &cur_dev, &last_dev);
>> }
>>
>> Modified: head/usr.bin/systat/systat.h
>>
>==============================================================================
>> --- head/usr.bin/systat/systat.h Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/systat.h Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -68,3 +68,7 @@ extern int use_kvm;
>> #define NVAL(indx) namelist[(indx)].n_value
>> #define NPTR(indx) (void *)NVAL((indx))
>> #define NREAD(indx, buf, len) kvm_ckread(NPTR((indx)), (buf), (len))
>> +
>> +extern void putint(int, int, int, int);
>> +extern void putfloat(double, int, int, int, int, int);
>> +extern void putlongdouble(long double, int, int, int, int, int);
>>
>> Modified: head/usr.bin/systat/vmstat.c
>>
>==============================================================================
>> --- head/usr.bin/systat/vmstat.c Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/vmstat.c Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -66,7 +66,6 @@ static const char sccsid[] = "@(#)vmstat.c 8.2
>(Berkel
>> #include <time.h>
>> #include <unistd.h>
>> #include <utmpx.h>
>> -#include <devstat.h>
>> #include "systat.h"
>> #include "extern.h"
>> #include "devs.h"
>> @@ -125,7 +124,6 @@ static struct Info {
>> static u_long kmem_size;
>> static u_int v_page_count;
>>
>> -struct statinfo cur, last, run;
>>
>> #define total s.Total
>> #define nchtotal s.nchstats
>> @@ -137,13 +135,9 @@ enum divisor { IEC = 0, SI = HN_DIVISOR_1000 };
>> static void allocinfo(struct Info *);
>> static void copyinfo(struct Info *, struct Info *);
>> static float cputime(int);
>> -static void dinfo(int, int, struct statinfo *, struct statinfo *);
>> static void do_putuint64(uint64_t, int, int, int, int);
>> static void getinfo(struct Info *);
>> -static void putint(int, int, int, int);
>> static void putuint64(uint64_t, int, int, int);
>> -static void putfloat(double, int, int, int, int, int);
>> -static void putlongdouble(long double, int, int, int, int, int);
>> static int ucount(void);
>>
>> static int ncpu;
>> @@ -209,18 +203,9 @@ initkre(void)
>> int i;
>> size_t sz;
>>
>> - if ((num_devices = devstat_getnumdevs(NULL)) < 0) {
>> - warnx("%s", devstat_errbuf);
>> + if (dsinit(MAXDRIVES) != 1)
>> return(0);
>> - }
>>
>> - cur.dinfo = calloc(1, sizeof(struct devinfo));
>> - last.dinfo = calloc(1, sizeof(struct devinfo));
>> - run.dinfo = calloc(1, sizeof(struct devinfo));
>> -
>> - if (dsinit(MAXDRIVES, &cur, &last, &run) != 1)
>> - return(0);
>> -
>> if (nintr == 0) {
>> if (sysctlbyname("hw.intrcnt", NULL, &sz, NULL, 0) == -1) {
>> error("sysctl(hw.intrcnt...) failed: %s",
>> @@ -371,27 +356,7 @@ labelkre(void)
>> mvprintw(NAMEIROW, NAMEICOL, "Namei Name-cache Dir-cache");
>> mvprintw(NAMEIROW + 1, NAMEICOL,
>> " Calls hits %% hits %%");
>> - mvprintw(DISKROW, DISKCOL, "Disks");
>> - mvprintw(DISKROW + 1, DISKCOL, "KB/t");
>> - mvprintw(DISKROW + 2, DISKCOL, "tps");
>> - mvprintw(DISKROW + 3, DISKCOL, "MB/s");
>> - mvprintw(DISKROW + 4, DISKCOL, "%%busy");
>> - /*
>> - * For now, we don't support a fourth disk statistic. So there's
>> - * no point in providing a label for it. If someone can think of a
>> - * fourth useful disk statistic, there is room to add it.
>> - */
>> - /* mvprintw(DISKROW + 4, DISKCOL, " msps"); */
>> - j = 0;
>> - for (i = 0; i < num_devices && j < MAXDRIVES; i++)
>> - if (dev_select[i].selected) {
>> - char tmpstr[80];
>> - sprintf(tmpstr, "%s%d", dev_select[i].device_name,
>> - dev_select[i].unit_number);
>> - mvprintw(DISKROW, DISKCOL + 5 + 6 * j,
>> - " %5.5s", tmpstr);
>> - j++;
>> - }
>> + dslabel(MAXDRIVES, DISKCOL, DISKROW);
>>
>> for (i = 0; i < nintr; i++) {
>> if (intrloc[i] == 0)
>> @@ -401,7 +366,7 @@ labelkre(void)
>> }
>>
>> #define X(fld) {t=s.fld[i]; s.fld[i]-=s1.fld[i]; if(state==TIME)
>s1.fld[i]=t;}
>> -#define Q(fld) {t=cur.fld[i]; cur.fld[i]-=last.fld[i];
>if(state==TIME) last.fld[i]=t;}
>> +#define Q(fld) {t=cur_dev.fld[i]; cur_dev.fld[i]-=last_dev.fld[i];
>if(state==TIME) last_dev.fld[i]=t;}
>> #define Y(fld) {t = s.fld; s.fld -= s1.fld; if(state == TIME) s1.fld
>= t;}
>> #define Z(fld) {t = s.nchstats.fld; s.nchstats.fld -=
>s1.nchstats.fld; \
>> if(state == TIME) s1.nchstats.fld = t;}
>> @@ -543,20 +508,17 @@ showkre(void)
>> PUTRATE(v_intr, GENSTATROW + 1, GENSTATCOL + 15, 4);
>> PUTRATE(v_soft, GENSTATROW + 1, GENSTATCOL + 20, 4);
>> PUTRATE(v_vm_faults, GENSTATROW + 1, GENSTATCOL + 25, 4);
>> - for (i = 0, lc = 0; i < num_devices && lc < MAXDRIVES; i++)
>> - if (dev_select[i].selected) {
>> - switch(state) {
>> - case TIME:
>> - dinfo(i, ++lc, &cur, &last);
>> - break;
>> - case RUN:
>> - dinfo(i, ++lc, &cur, &run);
>> - break;
>> - case BOOT:
>> - dinfo(i, ++lc, &cur, NULL);
>> - break;
>> - }
>> - }
>> + switch(state) {
>> + case TIME:
>> + dsshow(MAXDRIVES, DISKCOL, DISKROW, &cur_dev, &last_dev);
>> + break;
>> + case RUN:
>> + dsshow(MAXDRIVES, DISKCOL, DISKROW, &cur_dev, &run_dev);
>> + break;
>> + case BOOT:
>> + dsshow(MAXDRIVES, DISKCOL, DISKROW, &cur_dev, NULL);
>> + break;
>> + }
>> putint(s.numdirtybuffers, VNSTATROW, VNSTATCOL, 7);
>> putint(s.desiredvnodes, VNSTATROW + 1, VNSTATCOL, 7);
>> putint(s.numvnodes, VNSTATROW + 2, VNSTATCOL, 7);
>> @@ -582,14 +544,14 @@ cmdkre(const char *cmd, const char *args)
>> if (prefix(cmd, "run")) {
>> retval = 1;
>> copyinfo(&s2, &s1);
>> - switch (devstat_getdevs(NULL, &run)) {
>> + switch (devstat_getdevs(NULL, &run_dev)) {
>> case -1:
>> errx(1, "%s", devstat_errbuf);
>> break;
>> case 1:
>> - num_devices = run.dinfo->numdevs;
>> - generation = run.dinfo->generation;
>> - retval = dscmd("refresh", NULL, MAXDRIVES, &cur);
>> + num_devices = run_dev.dinfo->numdevs;
>> + generation = run_dev.dinfo->generation;
>> + retval = dscmd("refresh", NULL, MAXDRIVES, &cur_dev);
>> if (retval == 2)
>> labelkre();
>> break;
>> @@ -612,14 +574,14 @@ cmdkre(const char *cmd, const char *args)
>> retval = 1;
>> if (state == RUN) {
>> getinfo(&s1);
>> - switch (devstat_getdevs(NULL, &run)) {
>> + switch (devstat_getdevs(NULL, &run_dev)) {
>> case -1:
>> errx(1, "%s", devstat_errbuf);
>> break;
>> case 1:
>> - num_devices = run.dinfo->numdevs;
>> - generation = run.dinfo->generation;
>> - retval = dscmd("refresh",NULL, MAXDRIVES, &cur);
>> + num_devices = run_dev.dinfo->numdevs;
>> + generation = run_dev.dinfo->generation;
>> + retval = dscmd("refresh",NULL, MAXDRIVES, &cur_dev);
>> if (retval == 2)
>> labelkre();
>> break;
>> @@ -629,7 +591,7 @@ cmdkre(const char *cmd, const char *args)
>> }
>> return (retval);
>> }
>> - retval = dscmd(cmd, args, MAXDRIVES, &cur);
>> + retval = dscmd(cmd, args, MAXDRIVES, &cur_dev);
>>
>> if (retval == 2)
>> labelkre();
>> @@ -667,7 +629,7 @@ cputime(int indx)
>> return (s.time[indx] * 100.0 / lt);
>> }
>>
>> -static void
>> +void
>> putint(int n, int l, int lc, int w)
>> {
>>
>> @@ -713,7 +675,7 @@ do_putuint64(uint64_t n, int l, int lc, int w,
>int div
>> addstr(b);
>> }
>>
>> -static void
>> +void
>> putfloat(double f, int l, int lc, int w, int d, int nz)
>> {
>> int snr;
>> @@ -745,7 +707,7 @@ putfloat(double f, int l, int lc, int w, int d,
>int nz
>> addstr(b);
>> }
>>
>> -static void
>> +void
>> putlongdouble(long double f, int l, int lc, int w, int d, int nz)
>> {
>> int snr;
>> @@ -785,7 +747,7 @@ getinfo(struct Info *ls)
>> int mib[2];
>>
>> GETSYSCTL("kern.cp_time", ls->time);
>> - GETSYSCTL("kern.cp_time", cur.cp_time);
>> + GETSYSCTL("kern.cp_time", cur_dev.cp_time);
>> GETSYSCTL("vm.stats.sys.v_swtch", ls->v_swtch);
>> GETSYSCTL("vm.stats.sys.v_trap", ls->v_trap);
>> GETSYSCTL("vm.stats.sys.v_syscall", ls->v_syscall);
>> @@ -838,23 +800,12 @@ getinfo(struct Info *ls)
>> size != sizeof(ncpu))
>> ncpu = 1;
>>
>> - tmp_dinfo = last.dinfo;
>> - last.dinfo = cur.dinfo;
>> - cur.dinfo = tmp_dinfo;
>> + tmp_dinfo = last_dev.dinfo;
>> + last_dev.dinfo = cur_dev.dinfo;
>> + cur_dev.dinfo = tmp_dinfo;
>>
>> - last.snap_time = cur.snap_time;
>> - switch (devstat_getdevs(NULL, &cur)) {
>> - case -1:
>> - errx(1, "%s", devstat_errbuf);
>> - break;
>> - case 1:
>> - num_devices = cur.dinfo->numdevs;
>> - generation = cur.dinfo->generation;
>> - cmdkre("refresh", NULL);
>> - break;
>> - default:
>> - break;
>> - }
>> + last_dev.snap_time = cur_dev.snap_time;
>> + dsgetinfo(&cur_dev);
>> }
>>
>> static void
>> @@ -880,39 +831,4 @@ copyinfo(struct Info *from, struct Info *to)
>> *to = *from;
>>
>> bcopy(from->intrcnt, to->intrcnt = intrcnt, nintr * sizeof (int));
>> -}
>> -
>> -static void
>> -dinfo(int dn, int lc, struct statinfo *now, struct statinfo *then)
>> -{
>> - long double transfers_per_second;
>> - long double kb_per_transfer, mb_per_second;
>> - long double elapsed_time, device_busy;
>> - int di;
>> -
>> - di = dev_select[dn].position;
>> -
>> - if (then != NULL) {
>> - /* Calculate relative to previous sample */
>> - elapsed_time = now->snap_time - then->snap_time;
>> - } else {
>> - /* Calculate relative to device creation */
>> - elapsed_time = now->snap_time - devstat_compute_etime(
>> - &now->dinfo->devices[di].creation_time, NULL);
>> - }
>> -
>> - if (devstat_compute_statistics(&now->dinfo->devices[di], then ?
>> - &then->dinfo->devices[di] : NULL, elapsed_time,
>> - DSM_KB_PER_TRANSFER, &kb_per_transfer,
>> - DSM_TRANSFERS_PER_SECOND, &transfers_per_second,
>> - DSM_MB_PER_SECOND, &mb_per_second,
>> - DSM_BUSY_PCT, &device_busy,
>> - DSM_NONE) != 0)
>> - errx(1, "%s", devstat_errbuf);
>> -
>> - lc = DISKCOL + lc * 6;
>> - putlongdouble(kb_per_transfer, DISKROW + 1, lc, 5, 2, 0);
>> - putlongdouble(transfers_per_second, DISKROW + 2, lc, 5, 0, 0);
>> - putlongdouble(mb_per_second, DISKROW + 3, lc, 5, 2, 0);
>> - putlongdouble(device_busy, DISKROW + 4, lc, 5, 0, 0);
>> }
>>
>> Modified: head/usr.bin/systat/zarc.c
>>
>==============================================================================
>> --- head/usr.bin/systat/zarc.c Tue Apr 2 13:59:04 2019 (r345803)
>> +++ head/usr.bin/systat/zarc.c Tue Apr 2 14:01:03 2019 (r345804)
>> @@ -1,6 +1,5 @@
>> /*-
>> - * Copyright (c) 2014
>> - * The Regents of the University of California. All rights
>reserved.
>> + * Copyright (c) 2014 - 2017 Yoshihiro Ota
>> *
>> * Redistribution and use in source and binary forms, with or
>without
>> * modification, are permitted provided that the following
>conditions
>> @@ -33,11 +32,14 @@ __FBSDID("$FreeBSD$");
>> #include <sys/types.h>
>> #include <sys/sysctl.h>
>>
>> +/* #include <stdlib.h> */
>> #include <inttypes.h>
>> #include <string.h>
>> +#include <err.h>
>>
>> #include "systat.h"
>> #include "extern.h"
>> +#include "devs.h"
>>
>> struct zfield{
>> uint64_t arcstats;
>> @@ -77,21 +79,23 @@ closezarc(WINDOW *w)
>> void
>> labelzarc(void)
>> {
>> + int row = 1;
>> wmove(wnd, 0, 0); wclrtoeol(wnd);
>> mvwprintw(wnd, 0, 31+1, "%4.4s %7.7s %7.7s %12.12s %12.12s",
>> "rate", "hits", "misses", "total hits", "total misses");
>> -#define L(row, str) mvwprintw(wnd, row, 5, str); \
>> +#define L(str) mvwprintw(wnd, row, 5, #str); \
>> mvwprintw(wnd, row, 31, ":"); \
>> - mvwprintw(wnd, row, 31+4, "%%")
>> - L(1, "arcstats");
>> - L(2, "arcstats.demand_data");
>> - L(3, "arcstats.demand_metadata");
>> - L(4, "arcstats.prefetch_data");
>> - L(5, "arcstats.prefetch_metadata");
>> - L(6, "zfetchstats");
>> - L(7, "arcstats.l2");
>> - L(8, "vdev_cache_stats");
>> + mvwprintw(wnd, row, 31+4, "%%"); ++row
>> + L(arcstats);
>> + L(arcstats.demand_data);
>> + L(arcstats.demand_metadata);
>> + L(arcstats.prefetch_data);
>> + L(arcstats.prefetch_metadata);
>> + L(zfetchstats);
>> + L(arcstats.l2);
>> + L(vdev_cache_stats);
>> #undef L
>> + dslabel(12, 0, 18);
>> }
>>
>> static int calc(uint64_t hits, uint64_t misses)
>> @@ -131,6 +135,7 @@ domode(struct zarcstats *delta, struct zarcstats
>*rate
>> void
>> showzarc(void)
>> {
>> + int row = 1;
>> struct zarcstats delta, rate;
>>
>> memset(&delta, 0, sizeof delta);
>> @@ -138,34 +143,37 @@ showzarc(void)
>>
>> domode(&delta, &rate);
>>
>> -#define DO(stat, row, col, fmt) \
>> +#define DO(stat, col, fmt) \
>> mvwprintw(wnd, row, col, fmt, stat)
>> -#define R(row, stat) DO(rate.hits.stat, row, 31+1, "%3"PRIu64)
>> -#define H(row, stat) DO(delta.hits.stat, row, 31+1+5, "%7"PRIu64); \
>> - DO(curstat.hits.stat, row, 31+1+5+8+8, "%12"PRIu64)
>> -#define M(row, stat) DO(delta.misses.stat, row, 31+1+5+8,
>"%7"PRIu64); \
>> - DO(curstat.misses.stat, row, 31+1+5+8+8+13, "%12"PRIu64)
>> -#define E(row, stat) R(row, stat); H(row, stat); M(row, stat);
>> - E(1, arcstats);
>> - E(2, arcstats_demand_data);
>> - E(3, arcstats_demand_metadata);
>> - E(4, arcstats_prefetch_data);
>> - E(5, arcstats_prefetch_metadata);
>> - E(6, zfetchstats);
>> - E(7, arcstats_l2);
>> - E(8, vdev_cache_stats);
>> +#define R(stat) DO(rate.hits.stat, 31+1, "%3"PRIu64)
>> +#define H(stat) DO(delta.hits.stat, 31+1+5, "%7"PRIu64); \
>> + DO(curstat.hits.stat, 31+1+5+8+8, "%12"PRIu64)
>> +#define M(stat) DO(delta.misses.stat, 31+1+5+8, "%7"PRIu64); \
>> + DO(curstat.misses.stat, 31+1+5+8+8+13, "%12"PRIu64)
>> +#define E(stat) R(stat); H(stat); M(stat); ++row
>> + E(arcstats);
>> + E(arcstats_demand_data);
>> + E(arcstats_demand_metadata);
>> + E(arcstats_prefetch_data);
>> + E(arcstats_prefetch_metadata);
>> + E(zfetchstats);
>> + E(arcstats_l2);
>> + E(vdev_cache_stats);
>> #undef DO
>> #undef E
>> #undef M
>> #undef H
>> #undef R
>> + dsshow(12, 0, 18, &cur_dev, &last_dev);
>> }
>>
>> int
>> initzarc(void)
>> {
>> + dsinit(12);
>> getinfo(&initstat);
>> curstat = oldstat = initstat;
>> +
>> return 1;
>> }
>>
>> @@ -178,6 +186,15 @@ resetzarc(void)
>> static void
>> getinfo(struct zarcstats *ls)
>> {
>> + struct devinfo *tmp_dinfo;
>> +
>> + tmp_dinfo = last_dev.dinfo;
>> + last_dev.dinfo = cur_dev.dinfo;
>> + cur_dev.dinfo = tmp_dinfo;
>> +
>> + last_dev.snap_time = cur_dev.snap_time;
>> + dsgetinfo( &cur_dev );
>> +
>> size_t size = sizeof( ls->hits.arcstats );
>> if ( sysctlbyname("kstat.zfs.misc.arcstats.hits",
>> &ls->hits.arcstats, &size, NULL, 0 ) != 0 )
>>
>>
Gruß
---
Michael
More information about the svn-src-all
mailing list