[issue747] Kernel Core dumps whrn loading snd_ich
Simon 'corecode' Schubert
corecode at fs.ei.tum.de
Sun Jul 29 03:09:30 PDT 2007
Wesley Hearn wrote:
#12 0xc02fc04e in devclass_get_maxunit (dc=0x0)
at /usr/src/sys/kern/subr_bus.c:363
#13 0xc6e8c16b in dsp_get_info (dev=0x0)
at /usr/src/sys/dev/sound/pcm/dsp.c:71
#14 0xc6e92311 in vchanvolume(i_dev=0x0, write=0, volume=0xc6e7990c, ret=0xc6e798dc, td=0xc6594e00)
at /usr/src/sys/dev/sound/pcm/mixer.c:587
. ..
#27 0xc02fcf73 in device_probe_and_attach (dev=0xc622bbb8)
at /usr/src/sys/kern/subr_bus.c:1114
#28 0xc02fe8ef in bus_generic_driver_added (dev=0xc622b858, driver=0xc6e7e210)
at /usr/src/sys/kern/subr_bus.c:2095
#29 0xc02fbde1 in devclass_add_driver (dc=0xc0ad9020, driver=0xc6e7e210) at bus_if.h:71
#30 0xc02ffdad in driver_module_handler (mod=0xc6224d20,
what=-957881840, arg=0xc6e7e228) at /usr/src/sys/kern/subr_bus.c:2621
#31 0xc02cd6f8 in module_register_init (arg=0xc6e7e23c)
at /usr/src/sys/kern/kern_module.c:110
So the problem is:
module_register_init calls devclass_add_driver first, before setting up the devclass pointer. This one however gets used lateron in the driver attachment.
I believe the correct sequence is this, but I'd appreciate if somebody could double check. The patch fixes the panic, of course.
cheers
simon
--
Serve - BSD +++ RENT this banner advert +++ ASCII Ribbon /"\
Work - Mac +++ space for low â¬â¬â¬ NOW!1 +++ Campaign \ /
Party Enjoy Relax | http://dragonflybsd.org Against HTML \
Dude 2c 2 the max ! http://golden-apple.biz Mail + News / \
Index: kern/subr_bus.c
===================================================================
RCS file: /home/dcvs/src/sys/kern/subr_bus.c,v
retrieving revision 1.38
diff -u -p -r1.38 subr_bus.c
--- kern/subr_bus.c 5 May 2007 16:52:55 -0000 1.38
+++ kern/subr_bus.c 29 Jul 2007 09:23:09 -0000
@@ -2618,9 +2618,6 @@
driver = dmd->dmd_driver;
PDEBUG(("Loading module: driver %s on bus %s",
DRIVERNAME(driver), dmd->dmd_busname));
- error = devclass_add_driver(bus_devclass, driver);
- if (error)
- break;
/*
* If the driver has any base classes, make the
@@ -2633,8 +2630,12 @@ if (driver->baseclasses)
parentname = driver->baseclasses[0]->name;
else
parentname = NULL;
- *dmd->dmd_devclass = devclass_find_internal(driver->name,
+ *dmd->dmd_devclass = devclass_find_internal(driver->name,
parentname, TRUE);
+
+ error = devclass_add_driver(bus_devclass, driver);
+ if (error)
+ break;
break;
case MOD_UNLOAD:
More information about the Bugs
mailing list