NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/38636: ld(4) is now totally broken with ataraid(4) (ld.c 1.57 botch?)
The following reply was made to PR kern/38636; it has been noted by GNATS.
From: "Greg A. Woods" <woods%planix.com@localhost>
To: NetBSD GNATS <gnats-bugs%NetBSD.org@localhost>
Cc: kern-bug-people%netbsd.org@localhost, NetBSD-current Users's Discussion
List <current-users%netbsd.org@localhost>
Subject: Re: kern/38636: ld(4) is now totally broken with ataraid(4) (ld.c 1.57
botch?)
Date: Mon, 26 May 2008 18:19:22 -0400
OK, this is getting really annoying! :-) So I'm trying to debug it on
my own.... :-(
First I added a wee bit of extra debug to config_devalloc() to be sure
that dv_xname was really being set properly (as well as fixing up some
panic() messages along the way):
Index: sys/kern/subr_autoconf.c
===================================================================
RCS file: /cvs/master/m-NetBSD/main/src/sys/kern/subr_autoconf.c,v
retrieving revision 1.150
diff -u -r1.150 subr_autoconf.c
--- sys/kern/subr_autoconf.c 25 May 2008 15:03:01 -0000 1.150
+++ sys/kern/subr_autoconf.c 26 May 2008 21:23:50 -0000
@@ -1214,7 +1214,8 @@
xunit = number(&num[sizeof(num)], myunit);
lunit = &num[sizeof(num)] - xunit;
if (lname + lunit > sizeof(dev->dv_xname))
- panic("config_devalloc: device name too long");
+ panic("config_devalloc: device name '%s' too long for dv_xname
with unit number '%s'",
+ cd->cd_name, xunit);
/* get memory for all device vars */
KASSERT((ca->ca_flags & DVF_PRIV_ALLOC) || ca->ca_devsize >=
sizeof(struct device));
@@ -1222,7 +1223,8 @@
dev_private = malloc(ca->ca_devsize, M_DEVBUF,
M_ZERO | (cold ? M_NOWAIT : M_WAITOK));
if (dev_private == NULL)
- panic("config_devalloc: memory allocation for device
softc failed");
+ panic("config_devalloc: memory allocation for device
softc for %s%s failed",
+ cd->cd_name, xunit);
} else {
KASSERT(ca->ca_flags & DVF_PRIV_ALLOC);
dev_private = NULL;
@@ -1235,7 +1237,8 @@
dev = dev_private;
}
if (dev == NULL)
- panic("config_devalloc: memory allocation for device_t failed");
+ panic("config_devalloc: memory allocation for device_t for %s%s
failed",
+ cd->cd_name, xunit);
dev->dv_class = cd->cd_class;
dev->dv_cfdata = cf;
@@ -1270,6 +1273,13 @@
prop_dictionary_set_uint16(dev->dv_properties,
"device-unit", dev->dv_unit);
+#ifdef DEBUG
+ aprint_debug_dev(dev, "config_devalloc: setup completed for %s unit %d
as %s\n",
+ dev->dv_cfdriver->cd_name,
+ dev->dv_unit,
+ dev->dv_xname);
+#endif
+
return (dev);
}
as well as the following two lines in ld.c:
Index: sys/dev/ld.c
===================================================================
RCS file: /cvs/master/m-NetBSD/main/src/sys/dev/ld.c,v
retrieving revision 1.58
diff -u -r1.58 ld.c
--- sys/dev/ld.c 28 Apr 2008 20:23:46 -0000 1.58
+++ sys/dev/ld.c 26 May 2008 22:00:35 -0000
@@ -110,6 +110,11 @@
disk_init(&sc->sc_dk, device_xname(&sc->sc_dv), &lddkdriver);
disk_attach(&sc->sc_dk);
+#ifdef DIAGNOSTIC
+ aprint_normal_dev(&sc->sc_dv, "unit %d\n", sc->sc_dv.dv_unit);
+ aprint_normal_dev(&sc->sc_dv, "cd_name %s\n",
sc->sc_dv.dv_cfdriver->cd_name);
+#endif
+
if (sc->sc_maxxfer > MAXPHYS)
sc->sc_maxxfer = MAXPHYS;
Now booting with "-svx" I get a uvm_fault on the second line, as
follows. As you can also see dv_xname is not set by this point even
though it was set A-OK back in config_devalloc().
ataraid0: config_devalloc: setup completed for ataraid unit 0 as ataraid0
ataraid0: found 1 RAID volume
ld0: config_devalloc: setup completed for ld unit 0 as ld0
ld0 at ataraid0 vendtype 1 unit 0: Adaptec ATA RAID-1 array
: unit 0
uvm_fault(0xc0bc7cc0, 0, 1) -> 0xe
kernel: supervisor trap page fault, code=0
Stopped in pid 0.1 (system) at netbsd:ldattach+0x9b: movl 0x10(%eax),%eax
db{1}>
I'm beginning to suspect it must be either one of disk_init() or
disk_attach(). What else could it be!?!?!?
--
Greg A. Woods
Planix, Inc.
<woods%planix.com@localhost> +1 416 489-5852 x122
http://www.planix.com/
Home |
Main Index |
Thread Index |
Old Index