From owner-svn-src-head@freebsd.org Tue Sep 3 14:06:11 2019 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 5EBA1DC312; Tue, 3 Sep 2019 14:06:05 +0000 (UTC) (envelope-from yuripv@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2610:1c1:1:6074::16:84]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "freefall.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46N7z02TZDz4P9c; Tue, 3 Sep 2019 14:06:03 +0000 (UTC) (envelope-from yuripv@freebsd.org) Received: by freefall.freebsd.org (Postfix, from userid 1452) id 0D0A11A0A3; Tue, 3 Sep 2019 14:05:57 +0000 (UTC) X-Original-To: yuripv@localmail.freebsd.org Delivered-To: yuripv@localmail.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client CN "mx1.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by freefall.freebsd.org (Postfix) with ESMTPS id DBB4F26D4; Tue, 2 Apr 2019 14:08:24 +0000 (UTC) (envelope-from owner-src-committers@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [96.47.72.132]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "freefall.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 434438E4FB; Tue, 2 Apr 2019 14:08:24 +0000 (UTC) (envelope-from owner-src-committers@freebsd.org) Received: by freefall.freebsd.org (Postfix, from userid 538) id 15D5A26AC; Tue, 2 Apr 2019 14:08:24 +0000 (UTC) Delivered-To: src-committers@localmail.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [96.47.72.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client CN "mx1.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by freefall.freebsd.org (Postfix) with ESMTPS id 3483326A8; Tue, 2 Apr 2019 14:08:21 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (br1.CN84in.dnsmgr.net [69.59.192.140]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4A5918E4F6; Tue, 2 Apr 2019 14:08:20 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (localhost [127.0.0.1]) by gndrsh.dnsmgr.net (8.13.3/8.13.3) with ESMTP id x32E8IYu021668; Tue, 2 Apr 2019 07:08:18 -0700 (PDT) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: (from freebsd@localhost) by gndrsh.dnsmgr.net (8.13.3/8.13.3/Submit) id x32E8Ho9021667; Tue, 2 Apr 2019 07:08:17 -0700 (PDT) (envelope-from freebsd) From: "Rodney W. Grimes" Message-Id: <201904021408.x32E8Ho9021667@gndrsh.dnsmgr.net> Subject: Re: svn commit: r345804 - head/usr.bin/systat In-Reply-To: <201904021401.x32E13Fi092699@repo.freebsd.org> To: Michael Reifenberger CC: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Reply-To: rgrimes@freebsd.org X-Mailer: ELM [version 2.4ME+ PL121h (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII Precedence: bulk X-Loop: FreeBSD.org Sender: owner-src-committers@freebsd.org X-Rspamd-Queue-Id: 434438E4FB X-Spamd-Bar: ------ Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-6.96 / 15.00]; NEURAL_HAM_MEDIUM(-1.00)[-1.000,0]; NEURAL_HAM_SHORT(-0.96)[-0.964,0]; REPLY(-4.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000,0] Status: O X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Date: Tue, 03 Sep 2019 14:06:11 -0000 X-Original-Date: Tue, 2 Apr 2019 07:08:17 -0700 (PDT) X-List-Received-Date: Tue, 03 Sep 2019 14:06:11 -0000 > 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: > 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. > * > * 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 > > #include > -#include > #include > #include > #include > @@ -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 > + > +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 > #include > #include > -#include > #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 > #include > > +/* #include */ > #include > #include > +#include > > #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 ) > > -- Rod Grimes rgrimes@freebsd.org