Decision time.... should NATA become the default for this release?

YONETANI Tomokazu qhwt+dfly at les.ath.cx
Fri Jun 1 02:11:22 PDT 2007


On Thu, May 31, 2007 at 05:35:49PM -0700, Matthew Dillon wrote:
>     We need to make a decision on the next release as to whether NATA
>     should become the default.  I would really like to make it the default,
>     but to do so we need some assurance that it won't break things that
>     currently work.
> 
>     So I'm asking all developers running HEAD who have not already started
>     using the NATA driver to start using it instead of the ATA driver. 
>     Lets give it a good whack!

I gave NATA a try on my notebook PC, and now it boots into single-user mode!
This is a progress, as it used to just get stuck somewhere in init(8) (BTW
I tried to add debug print's in init, but somehow it didn't work), and
all I could do then was to drop in to DDB or reboot.

However, core dumping of random processes still remains, so it's still not
usable in multi-user mode.  Sometimes, it panics on umount, after some
read-only disk activities:
  # mount -r /home
  # find /home >/dev/null
  # umount /home
  panic: unmount: dangling vnode

Another weird thing with NATA is that I'm seeing odd interrupt counts
from `vmstat -i'; with old-ATA, it looks like this:
  # vmstat -iv
  interrupt                   total       rate
  irq0: clk                  402493        277
  irq1: atkbd0                    4          0
  irq9: acpi0                    54          0
  irq11: fxp0                  2649          1
  irq12: psm0                     0          0
  irq14: ata0                  1634          1
  irq15: ata1                     0          0
  irq68: swi_vm                   0          0
  irq69: swi_taskq                0          0
  Total                      406834        280

with NATA, it looks like this(in single-user mode):
  # vmstat -iv
  interrupt                   total       rate
  irq0: clk                    1236        176
  irq1: atkbd0                   24          3
  irq9: acpi0                     1          0
  irq11: fxp0                     0          1
  irq12: psm0                     0          0
  irq14: ata0                    99         14
  irq15: ata1                     0          0
  irq21                          98         14
  irq68: swi_vm                   0          0
  irq69: swi_taskq                0          0
  Total                        1458        208

irq21 has almost the same number as ata0 does and the number raises
as the disk activity occurs.

Cheers.
Index: vmstat.c
===================================================================
RCS file: /home/source/dragonfly/cvs/src/usr.bin/vmstat/vmstat.c,v
retrieving revision 1.20
diff -u -p -r1.20 vmstat.c
--- vmstat.c	28 Jan 2006 17:18:48 -0000	1.20
+++ vmstat.c	1 Jun 2007 08:53:50 -0000
@@ -112,6 +112,7 @@ struct	vmstats vms, ovms;
 
 int	winlines = 20;
 int	nflag = 0;
+int	verbose = 0;
 
 kvm_t *kd;
 
@@ -157,7 +158,7 @@ main(int argc, char **argv)
 	memf = nlistf = NULL;
 	interval = reps = todo = 0;
 	maxshowdevs = 2;
-	while ((c = getopt(argc, argv, "c:fiM:mN:n:p:stw:z")) != -1) {
+	while ((c = getopt(argc, argv, "c:fiM:mN:n:p:stvw:z")) != -1) {
 		switch (c) {
 		case 'c':
 			reps = atoi(optarg);
@@ -202,6 +203,9 @@ main(int argc, char **argv)
 			errx(EX_USAGE, "sorry, -t is not (re)implemented yet");
 #endif
 			break;
+		case 'v':
+			++verbose;
+			break;
 		case 'w':
 			interval = atoi(optarg);
 			break;
@@ -744,7 +748,7 @@ dointr(void)
 		err(1, "malloc");
 	sysctlbyname("hw.intrcnt", intrcnt, &size, NULL, 0);
 
-	nwidth = 8;
+	nwidth = 21;
 	for (i = 0; i < nintr; ++i) {
 		if (nwidth < (int)strlen(intrname[i]))
 			nwidth = (int)strlen(intrname[i]);
@@ -753,10 +757,26 @@ dointr(void)
 	printf("interrupt                   total       rate\n");
 	inttotal = 0;
 	for (i = 0; i < nintr; ++i) {
-		if (intrcnt[i] || strncmp(intrname[i], "irq", 3) != 0) {
-			printf("%-*.*s %11lu %10lu\n", 
-				nwidth, nwidth, intrname[i],
-				intrcnt[i], intrcnt[i] / uptime);
+		int named = 0;
+		char irqinfo[32], *infop;
+
+		if ((named = strncmp(intrname[i], "irq", 3)) != 0 ||
+		    verbose > 1 || intrcnt[i]) {
+			if (verbose) {
+				if (named) {
+					snprintf(irqinfo, sizeof(irqinfo),
+						 "irq%d: %s", i, intrname[i]);
+					infop = irqinfo;
+				} else
+					infop = intrname[i];
+				printf("%-*.*s %11lu %10lu\n", 
+					nwidth, nwidth, infop,
+					intrcnt[i], intrcnt[i] / uptime);
+			} else {
+				printf("%-*.*s %11lu %10lu\n", 
+					nwidth, nwidth, intrname[i],
+					intrcnt[i], intrcnt[i] / uptime);
+			}
 		}
 		inttotal += intrcnt[i];
 	}




More information about the Kernel mailing list