Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Jan 2015 16:21:32 +0000 (UTC)
From:      Will Andrews <will@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r277571 - head/usr.bin/vmstat
Message-ID:  <201501231621.t0NGLWtE061335@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: will
Date: Fri Jan 23 16:21:31 2015
New Revision: 277571
URL: https://svnweb.freebsd.org/changeset/base/277571

Log:
  Use clock_gettime to measure the time that we spent asleep during
  "vmstat -i" instead of assuming it's what we asked for.
  
  Submitted by:	asomers
  MFC after:	1 week
  Sponsored by:	Spectra Logic
  MFSpectraBSD:	1066751 on 2014/06/04

Modified:
  head/usr.bin/vmstat/vmstat.c

Modified: head/usr.bin/vmstat/vmstat.c
==============================================================================
--- head/usr.bin/vmstat/vmstat.c	Fri Jan 23 16:18:39 2015	(r277570)
+++ head/usr.bin/vmstat/vmstat.c	Fri Jan 23 16:21:31 2015	(r277571)
@@ -163,7 +163,7 @@ static void	printhdr(int, u_long);
 static void	usage(void);
 
 static long	pct(long, long);
-static long	getuptime(void);
+static long long	getuptime(void);
 
 static char   **getdrivedata(char **);
 
@@ -406,14 +406,15 @@ getdrivedata(char **argv)
 	return(argv);
 }
 
-static long
+/* Return system uptime in nanoseconds */
+static long long
 getuptime(void)
 {
 	struct timespec sp;
 
 	(void)clock_gettime(CLOCK_UPTIME, &sp);
 
-	return(sp.tv_sec);
+	return((long long)sp.tv_sec * 1000000000LL + sp.tv_nsec);
 }
 
 static void
@@ -654,7 +655,7 @@ dovmstat(unsigned int interval, int reps
 	u_long cpumask;
 	int rate_adj;
 
-	uptime = getuptime();
+	uptime = getuptime() / 1000000000LL;
 	halfuptime = uptime / 2;
 	rate_adj = 1;
 	ncpus = 1;
@@ -1192,7 +1193,7 @@ read_intrcnts(unsigned long **intrcnts)
 static void
 print_intrcnts(unsigned long *intrcnts, unsigned long *old_intrcnts,
 		char *intrnames, unsigned int nintr,
-		size_t istrnamlen, unsigned long long period)
+		size_t istrnamlen, long long period_ms)
 {
 	unsigned long *intrcnt, *old_intrcnt;
 	uint64_t inttotal, old_inttotal, total_count, total_rate;
@@ -1207,7 +1208,7 @@ print_intrcnts(unsigned long *intrcnts, 
 			unsigned long count, rate;
 
 			count = *intrcnt - *old_intrcnt;
-			rate = (count * 1000 + period/2) / period;
+			rate = (count * 1000 + period_ms / 2) / period_ms;
 			(void)printf("%-*s %20lu %10lu\n", (int)istrnamlen,
 			    intrname, count, rate);
 		}
@@ -1216,7 +1217,7 @@ print_intrcnts(unsigned long *intrcnts, 
 		old_inttotal += *old_intrcnt++;
 	}
 	total_count = inttotal - old_inttotal;
-	total_rate = (total_count * 1000 + period/2) / period;
+	total_rate = (total_count * 1000 + period_ms / 2) / period_ms;
 	(void)printf("%-*s %20" PRIu64 " %10" PRIu64 "\n", (int)istrnamlen,
 	    "Total", total_count, total_rate);
 }
@@ -1225,10 +1226,9 @@ static void
 dointr(unsigned int interval, int reps)
 {
 	unsigned long *intrcnts;
-	unsigned long long uptime, period;
+	long long uptime, period_ms;
 	unsigned long *old_intrcnts = NULL;
 	size_t clen, inamlen, istrnamlen;
-	unsigned int rep;
 	char *intrnames, *intrname;
 
 	uptime = getuptime();
@@ -1265,10 +1265,10 @@ dointr(unsigned int interval, int reps)
 	 * Loop reps times printing differential interrupt counts.  If reps is
 	 * zero, then run just once, printing total counts
 	 */
-	period = uptime * 1000;
+	period_ms = uptime / 1000000;
 	while(1) {
-		char *intrname;
 		unsigned int nintr;
+		long long old_uptime;
 
 		nintr = read_intrcnts(&intrcnts);
 		/* 
@@ -1282,14 +1282,16 @@ dointr(unsigned int interval, int reps)
 		}
 
 		print_intrcnts(intrcnts, old_intrcnts, intrnames, nintr,
-		    istrnamlen, period);
+		    istrnamlen, period_ms);
 
 		free(old_intrcnts);
 		old_intrcnts = intrcnts;
 		if (reps >= 0 && --reps <= 0)
 			break;
 		usleep(interval * 1000);
-		period = interval;
+		old_uptime = uptime;
+		uptime = getuptime();
+		period_ms = (uptime - old_uptime) / 1000000;
 	}
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501231621.t0NGLWtE061335>