Module Name:    src
Committed By:   jdolecek
Date:           Sat Oct 15 12:06:27 UTC 2016

Modified Files:
        src/usr.sbin/intrctl: intrctl.8 intrctl.c

Log Message:
add -c option to list command for compact list, it displays totals rather then
per-CPU stats


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/intrctl/intrctl.8 \
    src/usr.sbin/intrctl/intrctl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/intrctl/intrctl.8
diff -u src/usr.sbin/intrctl/intrctl.8:1.3 src/usr.sbin/intrctl/intrctl.8:1.4
--- src/usr.sbin/intrctl/intrctl.8:1.3	Wed Oct 12 21:47:37 2016
+++ src/usr.sbin/intrctl/intrctl.8	Sat Oct 15 12:06:27 2016
@@ -1,4 +1,4 @@
-.\" $NetBSD: intrctl.8,v 1.3 2016/10/12 21:47:37 jdolecek Exp $
+.\" $NetBSD: intrctl.8,v 1.4 2016/10/15 12:06:27 jdolecek Exp $
 .\"
 .\" Copyright (c) 2015 Internet Initiative Japan Inc.
 .\" All rights reserved.
@@ -24,7 +24,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 12, 2016
+.Dd October 15, 2016
 .Dt INTRCTL 8
 .Os
 .Sh NAME
@@ -56,9 +56,14 @@ enable to set an interrupt's affinity to
 If
 .Ar cpu_index
 is already enabled, this command has no effect.
-.It list
+.It list Op Fl c
 for each intrid in the system, display interrupt counts per CPU.
 The intrid is an interrupt name such as "ioapic0 pin 22" for x86.
+.Pp
+If
+.Fl c
+is specified, display compact list with total counts per interrupt,
+and CPU affinity as comma separated list of CPU indexes.
 .It nointr Fl c Ar cpu_index
 disable to set an interrupt's affinity to
 .Ar cpu_index .
Index: src/usr.sbin/intrctl/intrctl.c
diff -u src/usr.sbin/intrctl/intrctl.c:1.3 src/usr.sbin/intrctl/intrctl.c:1.4
--- src/usr.sbin/intrctl/intrctl.c:1.3	Mon Sep 19 18:46:39 2016
+++ src/usr.sbin/intrctl/intrctl.c	Sat Oct 15 12:06:27 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: intrctl.c,v 1.3 2016/09/19 18:46:39 ryo Exp $	*/
+/*	$NetBSD: intrctl.c,v 1.4 2016/10/15 12:06:27 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 2015 Internet Initiative Japan Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: intrctl.c,v 1.3 2016/09/19 18:46:39 ryo Exp $");
+__RCSID("$NetBSD: intrctl.c,v 1.4 2016/10/15 12:06:27 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/sysctl.h>
@@ -99,7 +99,7 @@ usage(void)
 {
 	const char *progname = getprogname();
 
-	fprintf(stderr, "usage: %s list\n", progname);
+	fprintf(stderr, "usage: %s list [-c]\n", progname);
 	fprintf(stderr, "       %s affinity -i interrupt_name -c cpu_index\n", progname);
 	fprintf(stderr, "       %s intr -c cpu_index\n", progname);
 	fprintf(stderr, "       %s nointr -c cpu_index\n", progname);
@@ -117,6 +117,18 @@ intrctl_list(int argc, char **argv)
 	int i, ncpus, *cpucol;
 	void *handle;
 	size_t intridlen;
+	int compact = 0;
+	char ch;
+
+	while ((ch = getopt(argc, argv, "c")) != -1) {
+		switch (ch) {
+		case 'c':
+			compact = 1;
+			break;
+		default:
+			usage();
+		}
+	}
 
 	handle = intrctl_io_alloc(intrctl_io_alloc_retry_count);
 	if (handle == NULL)
@@ -152,21 +164,49 @@ intrctl_list(int argc, char **argv)
 	}
 
 	/* header */
-	printf("%-*s  ", (int)intridlen, "interrupt id");
-	for (i = 0; i < ncpus; i++) {
-		snprintf(buf, sizeof(buf), "CPU%u", i);
-		printf("%*s  ", cpucol[i], buf);
+	printf("%-*s", (int)intridlen, "interrupt id");
+	if (compact) {
+		printf(" %20s ", "total");
+		printf(" %20s ", "affinity");
+	} else {
+		for (i = 0; i < ncpus; i++) {
+			snprintf(buf, sizeof(buf), "CPU%u", i);
+			printf("%*s  ", cpucol[i], buf);
+		}
 	}
 	printf("device name(s)\n");
 
 	/* body */
 	for (illine = intrctl_io_firstline(handle); illine != NULL;
 	    illine = intrctl_io_nextline(handle, illine)) {
-		printf("%-*s  ", (int)intridlen, illine->ill_intrid);
-		for (i = 0; i < ncpus; i++) {
-			struct intrio_list_line_cpu *illc = &illine->ill_cpu[i];
-			printf("%*" PRIu64 "%c ", cpucol[i], illc->illc_count,
-			    illc->illc_assigned ? '*' : ' ');
+		struct intrio_list_line_cpu *illc;
+
+		printf("%-*s ", (int)intridlen, illine->ill_intrid);
+		if (compact) {
+			uint64_t total = 0;
+			char *affinity, *oaffinity = NULL;
+			for (i = 0; i < ncpus; i++) {
+				illc = &illine->ill_cpu[i];
+				total += illc->illc_count;
+				if (illc->illc_assigned) {
+					asprintf(&affinity, "%s%s%d",
+					    oaffinity ? oaffinity : "",
+					    oaffinity ? ", " : "",
+					    i);
+					if (oaffinity)
+						free(oaffinity);
+					oaffinity = affinity;
+				}
+			}
+			printf("%20" PRIu64 " ", total);
+			printf("%20s ", affinity ? affinity : "none");
+			free(affinity);
+		} else {
+			for (i = 0; i < ncpus; i++) {
+				illc = &illine->ill_cpu[i];
+				printf("%*" PRIu64 "%c ", cpucol[i], illc->illc_count,
+				    illc->illc_assigned ? '*' : ' ');
+			}
 		}
 		printf("%s\n", illine->ill_xname);
 	}

Reply via email to