DragonFly kernel List (threaded) for 2007-07
DragonFly BSD
DragonFly kernel List (threaded) for 2007-07
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: Branching CVS for 1.10 on wednesday


From: Matthew Dillon <dillon@xxxxxxxxxxxxxxxxxxxx>
Date: Tue, 17 Jul 2007 15:51:47 -0700 (PDT)

:okay, then this is specific to hda:
:
:http://leaf.dragonflybsd.org/mailarchive/commits/2007-06/msg00231.html
:
:in any case, this panics the box on driver unload.
:
:cheers
:  simon

    I think I recall saying that the design of the sound driver subsystem
    is a huge mess.

    This is the sound subsystem assuming that it a driver unload is
    serialized against the dispatch of a pending sound interrupt when it
    isn't because the interrupt may ALREADY be dispatched but stuck INSIDE
    the sound driver on a lock.  It doesn't matter what kind of lock it is.

    For that matter, any attempt to unload the driver while simultaniously
    doing some other sound operation would result in the same problem.

    If you want a hack to fix HDA then just add an unconditional tsleep
    for a few ticks in hdac_release_resources().  Try this patch.

    After the release we can come up with a more involved fix by
    forcing the interrupt teardown code to wait for any pending interrupts
    to clear before returning.

					-Matt
					Matthew Dillon 
					<dillon@backplane.com>

Index: pci/hda/hdac.c
===================================================================
RCS file: /cvs/src/sys/dev/sound/pci/hda/hdac.c,v
retrieving revision 1.7
diff -u -p -r1.7 hdac.c
--- pci/hda/hdac.c	26 Jun 2007 14:56:50 -0000	1.7
+++ pci/hda/hdac.c	17 Jul 2007 22:50:05 -0000
@@ -5649,6 +5649,10 @@ 	hdac_unlock(sc);
 
 	hdac_irq_free(sc);
 
+	/* give pending interrupts stuck on the lock a chance to clear */
+	/* bad hack */
+	tsleep(&sc->irq, 0, "hdaslp", hz / 10);
+
 	device_get_children(sc->dev, &devlist, &devcount);
 	for (i = 0; devlist != NULL && i < devcount; i++) {
 		devinfo = (struct hdac_devinfo *)device_get_ivars(devlist[i]);



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]