Date: Tue, 02 Apr 2019 18:09:10 +0200 From: Michael <mike@reifenberger.com> To: rgrimes@freebsd.org, "Rodney W. Grimes" <freebsd@gndrsh.dnsmgr.net>, Michael Reifenberger <mr@freebsd.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r345804 - head/usr.bin/systat Message-ID: <CE944E7A-6D12-4283-93CC-8B69F4BC2BC5@reifenberger.com> In-Reply-To: <201904021408.x32E8Ho9021667@gndrsh.dnsmgr.net> References: <201904021408.x32E8Ho9021667@gndrsh.dnsmgr.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, Am 2=2E April 2019 16:08:17 MESZ schrieb "Rodney W=2E Grimes" <freebsd@gnd= rsh=2Ednsmgr=2Enet>: >> Author: mr >> Date: Tue Apr 2 14:01:03 2019 >> New Revision: 345804 >> URL: https://svnweb=2Efreebsd=2Eorg/changeset/base/345804 >>=20 >> Log: >> systat -zarc to display disk activities like -vm >> =20 >> PR: 213310 >> Submitted by: ota >> MFH: 4 weeks > >? MFC: Yes, indeed=2E > >> Differential Revision: https://reviews=2Efreebsd=2Eorg/D18726 >>=20 >> Modified: >> head/usr=2Ebin/systat/devs=2Ec >> head/usr=2Ebin/systat/devs=2Eh >> head/usr=2Ebin/systat/iostat=2Ec >> head/usr=2Ebin/systat/swap=2Ec >> head/usr=2Ebin/systat/systat=2Eh >> head/usr=2Ebin/systat/vmstat=2Ec >> head/usr=2Ebin/systat/zarc=2Ec >>=20 >> Modified: head/usr=2Ebin/systat/devs=2Ec >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/devs=2Ec Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/devs=2Ec Tue Apr 2 14:01:03 2019 (r345804) >> @@ -2,6 +2,7 @@ >> * SPDX-License-Identifier: BSD-3-Clause >> * >> * Copyright (c) 1998 Kenneth D=2E Merry=2E >> + * 2015 Yoshihiro Ota >> * All rights reserved=2E > > >Can we get in contact with Yoshihiro Ota about his >copyright statements, and correcting this to make >it clear that it is Kenneth D=2E Merry that is asserting >"All rights reserved" and if Ota does nor does not wish to assert >"All rights reserved"=2E > >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=2E > >I am only commenting once, this issue appears several times=2E >We can go back out to D18726 to discuss it if need be=2E > You could add a comment in the PR too, I intended to keep it open until MF= C >> * >> * Redistribution and use in source and binary forms, with or >without >> @@ -69,7 +70,6 @@ static const char sccsid[] =3D "@(#)disks=2Ec 8=2E1 >(Berkele >> #include <sys/resource=2Eh> >> =20 >> #include <ctype=2Eh> >> -#include <devstat=2Eh> >> #include <err=2Eh> >> #include <stdlib=2Eh> >> #include <string=2Eh> >> @@ -84,6 +84,8 @@ typedef enum { >> DS_MATCHTYPE_PATTERN >> } last_match_type; >> =20 >> +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); >> =20 >> 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=2E 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); >> =20 >> + if( cur_dev=2Edinfo ) // init was alreay ran >> + return(1); >> + >> + if ((num_devices =3D devstat_getnumdevs(NULL)) < 0) { >> + warnx("%s", devstat_errbuf); >> + return(0); >> + } >> + >> + cur_dev=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> + last_dev=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> + run_dev=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> + >> generation =3D 0; >> num_devices =3D 0; >> num_selected =3D 0; >> @@ -120,11 +132,11 @@ dsinit(int maxshowdevs, struct statinfo *s1, >struct st >> select_generation =3D 0; >> last_type =3D DS_MATCHTYPE_NONE; >> =20 >> - if (devstat_getdevs(NULL, s1) =3D=3D -1) >> + if (devstat_getdevs(NULL, &cur_dev) =3D=3D -1) >> errx(1, "%s", devstat_errbuf); >> =20 >> - num_devices =3D s1->dinfo->numdevs; >> - generation =3D s1->dinfo->generation; >> + num_devices =3D cur_dev=2Edinfo->numdevs; >> + generation =3D cur_dev=2Edinfo->generation; >> =20 >> dev_select =3D NULL; >> =20 >> @@ -134,13 +146,31 @@ dsinit(int maxshowdevs, struct statinfo *s1, >struct st >> * or 1=2E If we get back -1, though, there is an error=2E >> */ >> if (devstat_selectdevs(&dev_select, &num_selected, &num_selections, >> - &select_generation, generation, s1->dinfo->devices, >num_devices, >> + &select_generation, generation, cur_dev=2Edinfo->devices, >num_devices, >> NULL, 0, NULL, 0, DS_SELECT_ADD, maxshowdevs, 0) =3D=3D -1) >> errx(1, "%d %s", __LINE__, devstat_errbuf); >> =20 >> return(1); >> } >> =20 >> + >> +void >> +dsgetinfo(struct statinfo* dev) >> +{ >> + switch (devstat_getdevs(NULL, dev)) { >> + case -1: >> + errx(1, "%s", devstat_errbuf); >> + break; >> + case 1: >> + num_devices =3D dev->dinfo->numdevs; >> + generation =3D 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=2E So there's >> + * no point in providing a label for it=2E If someone can think of a >> + * fourth useful disk statistic, there is room to add it=2E >> + */ >> + /* mvprintw(diskrow + 4, diskcol, " msps"); */ >> + j =3D 0; >> + for (i =3D 0; i < num_devices && j < maxdrives; i++) >> + if (dev_select[i]=2Eselected) { >> + char tmpstr[80]; >> + sprintf(tmpstr, "%s%d", dev_select[i]=2Edevice_name, >> + dev_select[i]=2Eunit_number); >> + mvprintw(diskrow, diskcol + 5 + 6 * j, >> + " %5=2E5s", 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 =3D dev_select[dn]=2Eposition; >> + >> + if (then !=3D NULL) { >> + /* Calculate relative to previous sample */ >> + elapsed_time =3D now->snap_time - then->snap_time; >> + } else { >> + /* Calculate relative to device creation */ >> + elapsed_time =3D now->snap_time - devstat_compute_etime( >> + &now->dinfo->devices[di]=2Ecreation_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) !=3D 0) >> + errx(1, "%s", devstat_errbuf); >> + >> + lc =3D 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 =3D 0, lc =3D 0; i < num_devices && lc < maxdrives; i++) >> + if (dev_select[i]=2Eselected) >> + dsshow3(diskcol, diskrow, i, ++lc, now, then); >> } >>=20 >> Modified: head/usr=2Ebin/systat/devs=2Eh >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/devs=2Eh Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/devs=2Eh Tue Apr 2 14:01:03 2019 (r345804) >> @@ -2,6 +2,7 @@ >> * SPDX-License-Identifier: BSD-2-Clause-FreeBSD >> * >> * Copyright (c) 1998 David E=2E O'Brien >> + * 2015 Yoshihiro Ota >> * All rights reserved=2E >> * >> * Redistribution and use in source and binary forms, with or >without >> @@ -28,5 +29,18 @@ >> * $FreeBSD$ >> */ >> =20 >> -int dsinit(int, struct statinfo *, struct statinfo *, struct >statinfo *); >> +#ifndef DEVS_H >> +#define DEVS_H >> + >> +#include <devstat=2Eh> >> + >> +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 >>=20 >> Modified: head/usr=2Ebin/systat/iostat=2Ec >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/iostat=2Ec Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/iostat=2Ec Tue Apr 2 14:01:03 2019 (r345804) >> @@ -79,8 +79,6 @@ static const char sccsid[] =3D "@(#)iostat=2Ec 8=2E1 >(Berkel >> #include "extern=2Eh" >> #include "devs=2Eh" >> =20 >> -struct statinfo cur, last; >> - >> static int linesperregion; >> static double etime; >> static int numbers =3D 0; /* default display bar graphs */ >> @@ -111,17 +109,11 @@ closeiostat(WINDOW *w) >> int >> initiostat(void) >> { >> - if ((num_devices =3D devstat_getnumdevs(NULL)) < 0) >> - return(0); >> - >> - cur=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> - last=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> - >> /* >> * This value for maxshowdevs (100) is bogus=2E I'm not sure exactly >> * how to calculate it, though=2E >> */ >> - if (dsinit(100, &cur, &last, NULL) !=3D 1) >> + if (dsinit(7) !=3D 1) >> return(0); >> =20 >> return(1); >> @@ -133,17 +125,17 @@ fetchiostat(void) >> struct devinfo *tmp_dinfo; >> size_t len; >> =20 >> - len =3D sizeof(cur=2Ecp_time); >> - if (sysctlbyname("kern=2Ecp_time", &cur=2Ecp_time, &len, NULL, 0) >> - || len !=3D sizeof(cur=2Ecp_time)) { >> + len =3D sizeof(cur_dev=2Ecp_time); >> + if (sysctlbyname("kern=2Ecp_time", &cur_dev=2Ecp_time, &len, NULL, 0) >> + || len !=3D sizeof(cur_dev=2Ecp_time)) { >> perror("kern=2Ecp_time"); >> exit (1); >> } >> - tmp_dinfo =3D last=2Edinfo; >> - last=2Edinfo =3D cur=2Edinfo; >> - cur=2Edinfo =3D tmp_dinfo; >> + tmp_dinfo =3D last_dev=2Edinfo; >> + last_dev=2Edinfo =3D cur_dev=2Edinfo; >> + cur_dev=2Edinfo =3D tmp_dinfo; >> =20 >> - last=2Esnap_time =3D cur=2Esnap_time; >> + last_dev=2Esnap_time =3D cur_dev=2Esnap_time; >> =20 >> /* >> * Here what we want to do is refresh our device stats=2E >> @@ -152,7 +144,7 @@ fetchiostat(void) >> * the selection process again, in case a device that we >> * were previously displaying has gone away=2E >> */ >> - 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 =3D cur=2Edinfo->numdevs; >> - generation =3D cur=2Edinfo->generation; >> + num_devices =3D cur_dev=2Edinfo->numdevs; >> + generation =3D cur_dev=2Edinfo->generation; >> =20 >> } >> =20 >> @@ -260,11 +252,11 @@ showiostat(void) >> long t; >> int i, row, _col; >> =20 >> -#define X(fld) t =3D cur=2Efld[i]; cur=2Efld[i] -=3D last=2Efld[i]; >last=2Efld[i] =3D t >> +#define X(fld) t =3D cur_dev=2Efld[i]; cur_dev=2Efld[i] -=3D >last_dev=2Efld[i]; last_dev=2Efld[i] =3D t >> etime =3D 0; >> for(i =3D 0; i < CPUSTATES; i++) { >> X(cp_time); >> - etime +=3D cur=2Ecp_time[i]; >> + etime +=3D cur_dev=2Ecp_time[i]; >> } >> if (etime =3D=3D 0=2E0) >> etime =3D 1=2E0; >> @@ -313,10 +305,10 @@ devstats(int row, int _col, int dn) >> =20 >> di =3D dev_select[dn]=2Eposition; >> =20 >> - busy_seconds =3D cur=2Esnap_time - last=2Esnap_time; >> + busy_seconds =3D cur_dev=2Esnap_time - last_dev=2Esnap_time; >> =20 >> - if (devstat_compute_statistics(&cur=2Edinfo->devices[di], >> - &last=2Edinfo->devices[di], busy_seconds, >> + if (devstat_compute_statistics(&cur_dev=2Edinfo->devices[di], >> + &last_dev=2Edinfo->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) !=3D 0) >> @@ -349,12 +341,12 @@ stat1(int row, int o) >> =20 >> dtime =3D 0=2E0; >> for (i =3D 0; i < CPUSTATES; i++) >> - dtime +=3D cur=2Ecp_time[i]; >> + dtime +=3D cur_dev=2Ecp_time[i]; >> if (dtime =3D=3D 0=2E0) >> dtime =3D 1=2E0; >> wmove(wnd, row, INSET); >> #define CPUSCALE 0=2E5 >> - histogram(100=2E0 * cur=2Ecp_time[o] / dtime, 50, CPUSCALE); >> + histogram(100=2E0 * cur_dev=2Ecp_time[o] / dtime, 50, CPUSCALE); >> } >> =20 >> static void >> @@ -388,7 +380,7 @@ cmdiostat(const char *cmd, const char *args) >> numbers =3D 1; >> else if (prefix(cmd, "bars")) >> numbers =3D 0; >> - else if (!dscmd(cmd, args, 100, &cur)) >> + else if (!dscmd(cmd, args, 100, &cur_dev)) >> return (0); >> wclear(wnd); >> labeliostat(); >>=20 >> Modified: head/usr=2Ebin/systat/swap=2Ec >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/swap=2Ec Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/swap=2Ec Tue Apr 2 14:01:03 2019 (r345804) >> @@ -3,6 +3,7 @@ >> * >> * Copyright (c) 1980, 1992, 1993 >> * The Regents of the University of California=2E All rights >reserved=2E >> + * 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[] =3D "@(#)swap=2Ec 8=2E3 >(Berkeley >> =20 >> #include "systat=2Eh" >> #include "extern=2Eh" >> +#include "devs=2Eh" >> =20 >> kvm_t *kd; >> =20 >> @@ -137,13 +139,15 @@ initswap(void) >> oulen =3D ulen; >> =20 >> once =3D 1; >> + >> + dsinit(12); >> + >> return (1); >> } >> =20 >> void >> fetchswap(void) >> { >> - >> okvnsw =3D kvnsw; >> if ((kvnsw =3D kvm_getswapinfo(kd, kvmsw, NSWAP, 0)) < 0) { >> error("systat: kvm_getswapinfo failed"); >> @@ -153,6 +157,15 @@ fetchswap(void) >> odlen =3D dlen; >> oulen =3D ulen; >> calclens(); >> + >> + struct devinfo *tmp_dinfo; >> + >> + tmp_dinfo =3D last_dev=2Edinfo; >> + last_dev=2Edinfo =3D cur_dev=2Edinfo; >> + cur_dev=2Edinfo =3D tmp_dinfo; >> + >> + last_dev=2Esnap_time =3D cur_dev=2Esnap_time; >> + dsgetinfo( &cur_dev ); >> } >> =20 >> void >> @@ -178,6 +191,7 @@ labelswap(void) >> name =3D kvmsw[i]=2Eksw_devname; >> mvwprintw(wnd, i + 1, 0, "%*s", -dlen, name); >> } >> + dslabel(12, 0, 18); >> } >> =20 >> void >> @@ -217,4 +231,5 @@ showswap(void) >> waddch(wnd, 'X'); >> wclrtoeol(wnd); >> } >> + dsshow(12, 0, 18, &cur_dev, &last_dev); >> } >>=20 >> Modified: head/usr=2Ebin/systat/systat=2Eh >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/systat=2Eh Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/systat=2Eh Tue Apr 2 14:01:03 2019 (r345804) >> @@ -68,3 +68,7 @@ extern int use_kvm; >> #define NVAL(indx) namelist[(indx)]=2En_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); >>=20 >> Modified: head/usr=2Ebin/systat/vmstat=2Ec >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/vmstat=2Ec Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/vmstat=2Ec Tue Apr 2 14:01:03 2019 (r345804) >> @@ -66,7 +66,6 @@ static const char sccsid[] =3D "@(#)vmstat=2Ec 8=2E2 >(Berkel >> #include <time=2Eh> >> #include <unistd=2Eh> >> #include <utmpx=2Eh> >> -#include <devstat=2Eh> >> #include "systat=2Eh" >> #include "extern=2Eh" >> #include "devs=2Eh" >> @@ -125,7 +124,6 @@ static struct Info { >> static u_long kmem_size; >> static u_int v_page_count; >> =20 >> -struct statinfo cur, last, run; >> =20 >> #define total s=2ETotal >> #define nchtotal s=2Enchstats >> @@ -137,13 +135,9 @@ enum divisor { IEC =3D 0, SI =3D 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); >> =20 >> static int ncpu; >> @@ -209,18 +203,9 @@ initkre(void) >> int i; >> size_t sz; >> =20 >> - if ((num_devices =3D devstat_getnumdevs(NULL)) < 0) { >> - warnx("%s", devstat_errbuf); >> + if (dsinit(MAXDRIVES) !=3D 1) >> return(0); >> - } >> =20 >> - cur=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> - last=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> - run=2Edinfo =3D calloc(1, sizeof(struct devinfo)); >> - >> - if (dsinit(MAXDRIVES, &cur, &last, &run) !=3D 1) >> - return(0); >> - >> if (nintr =3D=3D 0) { >> if (sysctlbyname("hw=2Eintrcnt", NULL, &sz, NULL, 0) =3D=3D -1) { >> error("sysctl(hw=2Eintrcnt=2E=2E=2E) 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=2E So there's >> - * no point in providing a label for it=2E If someone can think of a >> - * fourth useful disk statistic, there is room to add it=2E >> - */ >> - /* mvprintw(DISKROW + 4, DISKCOL, " msps"); */ >> - j =3D 0; >> - for (i =3D 0; i < num_devices && j < MAXDRIVES; i++) >> - if (dev_select[i]=2Eselected) { >> - char tmpstr[80]; >> - sprintf(tmpstr, "%s%d", dev_select[i]=2Edevice_name, >> - dev_select[i]=2Eunit_number); >> - mvprintw(DISKROW, DISKCOL + 5 + 6 * j, >> - " %5=2E5s", tmpstr); >> - j++; >> - } >> + dslabel(MAXDRIVES, DISKCOL, DISKROW); >> =20 >> for (i =3D 0; i < nintr; i++) { >> if (intrloc[i] =3D=3D 0) >> @@ -401,7 +366,7 @@ labelkre(void) >> } >> =20 >> #define X(fld) {t=3Ds=2Efld[i]; s=2Efld[i]-=3Ds1=2Efld[i]; if(state=3D= =3DTIME) >s1=2Efld[i]=3Dt;} >> -#define Q(fld) {t=3Dcur=2Efld[i]; cur=2Efld[i]-=3Dlast=2Efld[i]; >if(state=3D=3DTIME) last=2Efld[i]=3Dt;} >> +#define Q(fld) {t=3Dcur_dev=2Efld[i]; cur_dev=2Efld[i]-=3Dlast_dev=2Ef= ld[i]; >if(state=3D=3DTIME) last_dev=2Efld[i]=3Dt;} >> #define Y(fld) {t =3D s=2Efld; s=2Efld -=3D s1=2Efld; if(state =3D=3D = TIME) s1=2Efld >=3D t;} >> #define Z(fld) {t =3D s=2Enchstats=2Efld; s=2Enchstats=2Efld -=3D >s1=2Enchstats=2Efld; \ >> if(state =3D=3D TIME) s1=2Enchstats=2Efld =3D 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 =3D 0, lc =3D 0; i < num_devices && lc < MAXDRIVES; i++) >> - if (dev_select[i]=2Eselected) { >> - 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=2Enumdirtybuffers, VNSTATROW, VNSTATCOL, 7); >> putint(s=2Edesiredvnodes, VNSTATROW + 1, VNSTATCOL, 7); >> putint(s=2Enumvnodes, VNSTATROW + 2, VNSTATCOL, 7); >> @@ -582,14 +544,14 @@ cmdkre(const char *cmd, const char *args) >> if (prefix(cmd, "run")) { >> retval =3D 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 =3D run=2Edinfo->numdevs; >> - generation =3D run=2Edinfo->generation; >> - retval =3D dscmd("refresh", NULL, MAXDRIVES, &cur); >> + num_devices =3D run_dev=2Edinfo->numdevs; >> + generation =3D run_dev=2Edinfo->generation; >> + retval =3D dscmd("refresh", NULL, MAXDRIVES, &cur_dev); >> if (retval =3D=3D 2) >> labelkre(); >> break; >> @@ -612,14 +574,14 @@ cmdkre(const char *cmd, const char *args) >> retval =3D 1; >> if (state =3D=3D 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 =3D run=2Edinfo->numdevs; >> - generation =3D run=2Edinfo->generation; >> - retval =3D dscmd("refresh",NULL, MAXDRIVES, &cur); >> + num_devices =3D run_dev=2Edinfo->numdevs; >> + generation =3D run_dev=2Edinfo->generation; >> + retval =3D dscmd("refresh",NULL, MAXDRIVES, &cur_dev); >> if (retval =3D=3D 2) >> labelkre(); >> break; >> @@ -629,7 +591,7 @@ cmdkre(const char *cmd, const char *args) >> } >> return (retval); >> } >> - retval =3D dscmd(cmd, args, MAXDRIVES, &cur); >> + retval =3D dscmd(cmd, args, MAXDRIVES, &cur_dev); >> =20 >> if (retval =3D=3D 2) >> labelkre(); >> @@ -667,7 +629,7 @@ cputime(int indx) >> return (s=2Etime[indx] * 100=2E0 / lt); >> } >> =20 >> -static void >> +void >> putint(int n, int l, int lc, int w) >> { >> =20 >> @@ -713,7 +675,7 @@ do_putuint64(uint64_t n, int l, int lc, int w, >int div >> addstr(b); >> } >> =20 >> -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); >> } >> =20 >> -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]; >> =20 >> GETSYSCTL("kern=2Ecp_time", ls->time); >> - GETSYSCTL("kern=2Ecp_time", cur=2Ecp_time); >> + GETSYSCTL("kern=2Ecp_time", cur_dev=2Ecp_time); >> GETSYSCTL("vm=2Estats=2Esys=2Ev_swtch", ls->v_swtch); >> GETSYSCTL("vm=2Estats=2Esys=2Ev_trap", ls->v_trap); >> GETSYSCTL("vm=2Estats=2Esys=2Ev_syscall", ls->v_syscall); >> @@ -838,23 +800,12 @@ getinfo(struct Info *ls) >> size !=3D sizeof(ncpu)) >> ncpu =3D 1; >> =20 >> - tmp_dinfo =3D last=2Edinfo; >> - last=2Edinfo =3D cur=2Edinfo; >> - cur=2Edinfo =3D tmp_dinfo; >> + tmp_dinfo =3D last_dev=2Edinfo; >> + last_dev=2Edinfo =3D cur_dev=2Edinfo; >> + cur_dev=2Edinfo =3D tmp_dinfo; >> =20 >> - last=2Esnap_time =3D cur=2Esnap_time; >> - switch (devstat_getdevs(NULL, &cur)) { >> - case -1: >> - errx(1, "%s", devstat_errbuf); >> - break; >> - case 1: >> - num_devices =3D cur=2Edinfo->numdevs; >> - generation =3D cur=2Edinfo->generation; >> - cmdkre("refresh", NULL); >> - break; >> - default: >> - break; >> - } >> + last_dev=2Esnap_time =3D cur_dev=2Esnap_time; >> + dsgetinfo(&cur_dev); >> } >> =20 >> static void >> @@ -880,39 +831,4 @@ copyinfo(struct Info *from, struct Info *to) >> *to =3D *from; >> =20 >> bcopy(from->intrcnt, to->intrcnt =3D 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 =3D dev_select[dn]=2Eposition; >> - >> - if (then !=3D NULL) { >> - /* Calculate relative to previous sample */ >> - elapsed_time =3D now->snap_time - then->snap_time; >> - } else { >> - /* Calculate relative to device creation */ >> - elapsed_time =3D now->snap_time - devstat_compute_etime( >> - &now->dinfo->devices[di]=2Ecreation_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) !=3D 0) >> - errx(1, "%s", devstat_errbuf); >> - >> - lc =3D 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); >> } >>=20 >> Modified: head/usr=2Ebin/systat/zarc=2Ec >> >=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >> --- head/usr=2Ebin/systat/zarc=2Ec Tue Apr 2 13:59:04 2019 (r345803) >> +++ head/usr=2Ebin/systat/zarc=2Ec Tue Apr 2 14:01:03 2019 (r345804) >> @@ -1,6 +1,5 @@ >> /*- >> - * Copyright (c) 2014 >> - * The Regents of the University of California=2E All rights >reserved=2E >> + * 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=2Eh> >> #include <sys/sysctl=2Eh> >> =20 >> +/* #include <stdlib=2Eh> */ >> #include <inttypes=2Eh> >> #include <string=2Eh> >> +#include <err=2Eh> >> =20 >> #include "systat=2Eh" >> #include "extern=2Eh" >> +#include "devs=2Eh" >> =20 >> struct zfield{ >> uint64_t arcstats; >> @@ -77,21 +79,23 @@ closezarc(WINDOW *w) >> void >> labelzarc(void) >> { >> + int row =3D 1; >> wmove(wnd, 0, 0); wclrtoeol(wnd); >> mvwprintw(wnd, 0, 31+1, "%4=2E4s %7=2E7s %7=2E7s %12=2E12s %12=2E12s"= , >> "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=2Edemand_data"); >> - L(3, "arcstats=2Edemand_metadata"); >> - L(4, "arcstats=2Eprefetch_data"); >> - L(5, "arcstats=2Eprefetch_metadata"); >> - L(6, "zfetchstats"); >> - L(7, "arcstats=2El2"); >> - L(8, "vdev_cache_stats"); >> + mvwprintw(wnd, row, 31+4, "%%"); ++row >> + L(arcstats); >> + L(arcstats=2Edemand_data); >> + L(arcstats=2Edemand_metadata); >> + L(arcstats=2Eprefetch_data); >> + L(arcstats=2Eprefetch_metadata); >> + L(zfetchstats); >> + L(arcstats=2El2); >> + L(vdev_cache_stats); >> #undef L >> + dslabel(12, 0, 18); >> } >> =20 >> 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 =3D 1; >> struct zarcstats delta, rate; >> =20 >> memset(&delta, 0, sizeof delta); >> @@ -138,34 +143,37 @@ showzarc(void) >> =20 >> domode(&delta, &rate); >> =20 >> -#define DO(stat, row, col, fmt) \ >> +#define DO(stat, col, fmt) \ >> mvwprintw(wnd, row, col, fmt, stat) >> -#define R(row, stat) DO(rate=2Ehits=2Estat, row, 31+1, "%3"PRIu64) >> -#define H(row, stat) DO(delta=2Ehits=2Estat, row, 31+1+5, "%7"PRIu64);= \ >> - DO(curstat=2Ehits=2Estat, row, 31+1+5+8+8, "%12"PRIu64) >> -#define M(row, stat) DO(delta=2Emisses=2Estat, row, 31+1+5+8, >"%7"PRIu64); \ >> - DO(curstat=2Emisses=2Estat, row, 31+1+5+8+8+13, "%12"PRIu64) >> -#define E(row, stat) R(row, stat); H(row, stat); M(row, stat);=20 >> - 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=2Ehits=2Estat, 31+1, "%3"PRIu64) >> +#define H(stat) DO(delta=2Ehits=2Estat, 31+1+5, "%7"PRIu64); \ >> + DO(curstat=2Ehits=2Estat, 31+1+5+8+8, "%12"PRIu64) >> +#define M(stat) DO(delta=2Emisses=2Estat, 31+1+5+8, "%7"PRIu64); \ >> + DO(curstat=2Emisses=2Estat, 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); >> } >> =20 >> int >> initzarc(void) >> { >> + dsinit(12); >> getinfo(&initstat); >> curstat =3D oldstat =3D initstat; >> + >> return 1; >> } >> =20 >> @@ -178,6 +186,15 @@ resetzarc(void) >> static void >> getinfo(struct zarcstats *ls) >> { >> + struct devinfo *tmp_dinfo; >> + >> + tmp_dinfo =3D last_dev=2Edinfo; >> + last_dev=2Edinfo =3D cur_dev=2Edinfo; >> + cur_dev=2Edinfo =3D tmp_dinfo; >> + >> + last_dev=2Esnap_time =3D cur_dev=2Esnap_time; >> + dsgetinfo( &cur_dev ); >> + >> size_t size =3D sizeof( ls->hits=2Earcstats ); >> if ( sysctlbyname("kstat=2Ezfs=2Emisc=2Earcstats=2Ehits", >> &ls->hits=2Earcstats, &size, NULL, 0 ) !=3D 0 ) >>=20 >>=20 Gru=C3=9F ---=20 Michael
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CE944E7A-6D12-4283-93CC-8B69F4BC2BC5>