Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jan 2005 23:30:22 +0900
From:      Shunsuke Akiyama <akiyama@jp.FreeBSD.org>
To:        Sean McNeil <sean@mcneil.com>
Cc:        current@freebsd.org
Subject:   Re: panic 01/25/04 kernel in uhci uplcom
Message-ID:  <20050126233022O.akiyama@jp.FreeBSD.org>
In-Reply-To: <1106727949.8449.3.camel@server.mcneil.com>
References:  <1106727949.8449.3.camel@server.mcneil.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--Multipart_Wed_Jan_26_23:30:22_2005-1
Content-Type: text/plain; charset=US-ASCII

At Wed, 26 Jan 2005 00:25:49 -0800,
Sean McNeil wrote:

> I got a panic on a recent kernel:
> 
> FreeBSD server.mcneil.com 6.0-CURRENT FreeBSD 6.0-CURRENT #2: Fri Jan  7
> 18:21:53 PST 2005     root@server.mcneil.com:/usr/obj/usr/src/sys/AMD64
> amd64
> 
> Jan 25 23:50:39 server syslogd: kernel boot file
> is /boot/kernel.old/kernel
> Jan 25 23:50:39 server kernel: panic: uhci_abort_xfer: not in process
> context
> Jan 25 23:50:39 server kernel: Uptime: 1m39s
> Jan 25 23:50:39 server kernel: interrupt                   total
> Jan 25 23:50:39 server kernel: irq1: atkbd0                           2
> Jan 25 23:50:39 server kernel: irq0: clk                         323813
> Jan 25 23:50:39 server kernel: irq4: sio0                             5
> Jan 25 23:50:39 server kernel: irq8: rtc                          20738
> Jan 25 23:50:39 server kernel: irq14: ata0                          722
> Jan 25 23:50:39 server kernel: irq15: ata1                          186
> Jan 25 23:50:39 server kernel: irq16: re0                            62
> Jan 25 23:50:39 server kernel: irq17: fwohci0                         1
> Jan 25 23:50:39 server kernel: irq19: dc0                             2
> Jan 25 23:50:39 server kernel: irq20: atapci0                      6006
> Jan 25 23:50:39 server kernel: irq21: uhci0 uhci1+                  136
> Jan 25 23:50:39 server kernel: Total                      351673
> Jan 25 23:50:39 server kernel: KDB: stack backtrace:
> Jan 25 23:50:39 server kernel: hardclock() at hardclock+0x1eb
> Jan 25 23:50:39 server kernel: intr_execute_handlers() at
> intr_execute_handlers+0x102
> Jan 25 23:50:39 server kernel: lapic_handle_intr() at lapic_handle_intr
> +0x21
> Jan 25 23:50:39 server kernel: Xapic_isr1() at Xapic_isr1+0x7d
> Jan 25 23:50:39 server kernel: --- interrupt, rip = 0xffffffff802eb1e1,
> rsp = 0xffffffffb19187e0, rbp = 0xffffffffb1918810 ---
> Jan 25 23:50:39 server kernel: cv_wait() at cv_wait+0x1
> Jan 25 23:50:39 server kernel: ata_queue_request() at ata_queue_request
> +0x1e8
> Jan 25 23:50:39 server kernel: ata_controlcmd() at ata_controlcmd+0x8b
> Jan 25 23:50:39 server kernel: ata_shutdown() at ata_shutdown+0xb8
> Jan 25 23:50:39 server kernel: boot() at boot+0x25c
> Jan 25 23:50:39 server kernel: panic() at panic+0x167
> Jan 25 23:50:39 server kernel: uhci_abort_xfer() at uhci_abort_xfer+0x68
> Jan 25 23:50:39 server kernel: usbd_abort_pipe() at usbd_abort_pipe+0x27
> Jan 25 23:50:39 server kernel: ucomstopread() at ucomstopread+0x27
> Jan 25 23:50:39 server kernel: ucomstop() at ucomstop+0x2f
> Jan 25 23:50:39 server kernel: ttyflush() at ttyflush+0x34
> Jan 25 23:50:39 server kernel: ttymodem() at ttymodem+0x9e
> Jan 25 23:50:39 server kernel: ucom_status_change() at
> ucom_status_change+0x93
> Jan 25 23:50:39 server kernel: uplcom_intr() at uplcom_intr+0x94
> Jan 25 23:50:39 server kernel: usb_transfer_complete() at
> usb_transfer_complete+0x201
> Jan 25 23:50:39 server kernel: uhci_softintr() at uhci_softintr+0x100
> Jan 25 23:50:39 server kernel: uhci_intr1() at uhci_intr1+0xd5
> Jan 25 23:50:39 server kernel: ithread_loop() at ithread_loop+0xd3
> Jan 25 23:50:39 server kernel: fork_exit() at fork_exit+0x8f
> Jan 25 23:50:39 server kernel: fork_trampoline() at fork_trampoline+0xe
> Jan 25 23:50:39 server kernel: --- trap 0, rip = 0, rsp =
> 0xffffffffb1918d00, rbp = 0 ---

Oh, usbd_abort_pipe() and underlaying uhci_abort_xfer() should be
called from non interrupt context only.  uhci_abort_xfer() checks this
condition and make a panic.

This is not a problem only for uplcom(4).  Both umodem(4) and
uvscom(4) potentially have a same problem.

Please try attached patch and let me know the result.

Regards,
-- 
Shunsuke Akiyama
akiyama@jp.FreeBSD.org
akiyama@FreeBSD.org


--Multipart_Wed_Jan_26_23:30:22_2005-1
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="uplcom.c-diff"
Content-Transfer-Encoding: 7bit

Index: uplcom.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/usb/uplcom.c,v
retrieving revision 1.26
diff -u -r1.26 uplcom.c
--- uplcom.c	25 Jan 2005 14:38:21 -0000	1.26
+++ uplcom.c	26 Jan 2005 13:24:07 -0000
@@ -107,6 +107,7 @@
 #include <sys/poll.h>
 #include <sys/sysctl.h>
 #include <sys/uio.h>
+#include <sys/taskqueue.h>
 
 #include <machine/bus.h>
 
@@ -176,6 +177,8 @@
 	u_char			sc_msr;		/* uplcom status register */
 
 	int			sc_chiptype;	/* Type of chip */
+
+	struct task		sc_task;
 };
 
 /*
@@ -203,6 +206,7 @@
 Static	int  uplcom_param(void *, int, struct termios *);
 Static	int  uplcom_open(void *, int);
 Static	void uplcom_close(void *, int);
+Static	void uplcom_notify(void *, int);
 
 struct ucom_callback uplcom_callback = {
 	uplcom_get_status,
@@ -530,6 +534,7 @@
 	DPRINTF(("uplcom: in = 0x%x, out = 0x%x, intr = 0x%x\n",
 		 ucom->sc_bulkin_no, ucom->sc_bulkout_no, sc->sc_intr_number));
 
+	TASK_INIT(&sc->sc_task, 0, uplcom_notify, sc);
 	ucom_attach(&sc->sc_ucom);
 
 	free(devinfo, M_USBDEV);
@@ -950,6 +955,19 @@
 		sc->sc_msr |= SER_DCD;
 	else
 		sc->sc_msr &= ~SER_DCD;
+
+	/* Deferred notifying to the ucom layer */
+	taskqueue_enqueue(taskqueue_swi_giant, &sc->sc_task);
+}
+
+Static void
+uplcom_notify(void *arg, int count)
+{
+	struct uplcom_softc *sc;
+
+	sc = (struct uplcom_softc *)arg;
+	if (sc->sc_ucom.sc_dying)
+		return;
 	ucom_status_change(&sc->sc_ucom);
 }
 

--Multipart_Wed_Jan_26_23:30:22_2005-1--



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