USB/coredump hangs in 8 and 9
Hans Petter Selasky
hselasky at c2i.net
Thu Aug 18 21:27:28 UTC 2011
On Thursday 18 August 2011 19:04:10 Andriy Gapon wrote:
> If you can help Hans to figure out what you is wrong with USB subsystem in
> this respect that would help us all.
Hi,
usb_busdma.c: /* we use "mtx_owned()" instead of this function */
usb_busdma.c: owned = mtx_owned(uptag->mtx);
usb_compat_linux.c: do_unlock = mtx_owned(&Giant) ? 0 : 1;
usb_compat_linux.c: do_unlock = mtx_owned(&Giant) ? 0 : 1;
usb_compat_linux.c: do_unlock = mtx_owned(&Giant) ? 0 : 1;
usb_hub.c: if (mtx_owned(&bus->bus_mtx)) {
usb_transfer.c: if (!mtx_owned(info->xfer_mtx)) {
usb_transfer.c: if (mtx_owned(xfer->xroot->xfer_mtx)) {
usb_transfer.c: while (mtx_owned(&xroot->udev->bus->bus_mtx)) {
usb_transfer.c: while (mtx_owned(xroot->xfer_mtx)) {
One fix you will need to do, if mtx_owned is not giving correct value is:
static void
usbd_callback_wrapper(struct usb_xfer_queue *pq)
{
struct usb_xfer *xfer = pq->curr;
struct usb_xfer_root *info = xfer->xroot;
USB_BUS_LOCK_ASSERT(info->bus, MA_OWNED);
if (!mtx_owned(info->xfer_mtx)) {
The above "if" should be anded with && !paniced && !dumping ... or maybe the
new not scheduling variable is good for this purpose?
/*
* Cases that end up here:
*
#if USB_HAVE_BUSDMA
if (mtx_owned(xfer->xroot->xfer_mtx)) {
struct usb_xfer_queue *pq;
This case is more like a BUS-DMA error case, and is not so important to
execute.
--HPS
More information about the freebsd-stable
mailing list