Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Feb 2006 15:42:35 +0000
From:      Ian Dowse <iedowse@iedowse.com>
To:        Scott Long <scottl@samsco.org>
Cc:        freebsd-hackers@freebsd.org, nielsen@memberwebs.com
Subject:   Re: Panic Kernel Dump to umass device? 
Message-ID:  <200602111542.aa07502@nowhere.iedowse.com>
In-Reply-To: Your message of "Sat, 11 Feb 2006 00:13:05 MST." <43ED8E81.2060907@samsco.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
In message <43ED8E81.2060907@samsco.org>, Scott Long writes:
>You're correct that dumping is meant to be done with interrupts and task
>switching disabled.  The first thing that the umass driver is missing is
>a working CAM poll handler.  Without this, there is no way for command
>completions to be seen when interrupts are disabled.  Beyond that, I
>somewhat suspect that the USB stack expects to be able to push command
>completion work off to worker threads, at least for some situations, and
>that also will not work in the kernel dump environment.  So, there is a
>lot of work needed to make this happen.

The USB stack supports polled operations, so it's actually not to
hard to make this work. Below is a patch I had in one of my local
trees that adds a CAM poll handler to the umass driver. I've just
tested this and it does seem to make kernel dumping work, but I
guess it might not be as reliable as dumping to other devices.

Ian

Index: umass.c
===================================================================
RCS file: /dump/FreeBSD-CVS/src/sys/dev/usb/umass.c,v
retrieving revision 1.128
diff -u -r1.128 umass.c
--- umass.c	9 Jan 2006 01:33:53 -0000	1.128
+++ umass.c	11 Feb 2006 12:57:43 -0000
@@ -2627,21 +2627,17 @@
 	}
 }
 
-/* umass_cam_poll
- *	all requests are handled through umass_cam_action, requests
- *	are never pending. So, nothing to do here.
- */
 Static void
 umass_cam_poll(struct cam_sim *sim)
 {
-#ifdef USB_DEBUG
 	struct umass_softc *sc = (struct umass_softc *) sim->softc;
 
 	DPRINTF(UDMASS_SCSI, ("%s: CAM poll\n",
 		USBDEVNAME(sc->sc_dev)));
-#endif
 
-	/* nop */
+	usbd_set_polling(sc->sc_udev, 1);
+	usbd_dopoll(sc->iface);
+	usbd_set_polling(sc->sc_udev, 0);
 }
 
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200602111542.aa07502>