Re: 2.6.16-rc5 pppd oops on disconnects

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

 



On Sat, 2006-03-11 at 10:09 -0500, Bob Copeland wrote:
> Well, back to at least 2.6.15-rc7 I get a similar oops so this looks old 
> and unrelated to the mutex changes.  I don't believe it triggers without 
> CONFIG_DEBUG_SLAB.  Also won't oops without something (ppp) using the 
> device at the time of disconnect.

OK, try this patch with CONFIG_DEBUG_SLAB on and post the
debug output with the oops.

I do see one problem with the cdc-acm driver (not setting
acm->tty to NULL on the last close, where tty is released).

Thanks,
Paul

-- 
Paul Fulghum
Microgate Systems, Ltd

--- linux-2.6.16-rc5/drivers/usb/class/cdc-acm.c	2006-02-27 09:24:29.000000000 -0600
+++ b/drivers/usb/class/cdc-acm.c	2006-03-11 11:50:40.000000000 -0600
@@ -258,6 +258,7 @@ static void acm_ctrl_irq(struct urb *urb
 
 			if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) {
 				dbg("calling hangup");
+				printk("acm_ctrl_irq tty_hangup(%p)\n", acm->tty);
 				tty_hangup(acm->tty);
 			}
 
@@ -443,6 +444,8 @@ static int acm_tty_open(struct tty_struc
 	tty->driver_data = acm;
 	acm->tty = tty;
 
+	printk("acm_tty_open tty=%p acm=%p acm->used=%p\n", tty, acm, acm->used);
+
 	/* force low_latency on so that our tty_push actually forces the data through,
 	   otherwise it is scheduled, and with high data rates data can get lost. */
 	tty->low_latency = 1;
@@ -504,6 +507,10 @@ static void acm_tty_close(struct tty_str
 	struct acm *acm = tty->driver_data;
 	int i;
 
+	printk("acm_tty_close tty=%p filp=%p acm=%p\n", tty, filp, acm);
+	if (acm)
+		printk("acm_tty_close acm->used=%d acm->dev=%p\n", acm->used, acm->dev);
+
 	if (!acm || !acm->used)
 		return;
 
@@ -517,6 +524,7 @@ static void acm_tty_close(struct tty_str
 				usb_kill_urb(acm->ru[i].urb);
 		} else
 			acm_tty_unregister(acm);
+		/* need to set acm->tty = NULL here */
 	}
 	up(&open_sem);
 }
@@ -1008,6 +1016,10 @@ static void acm_disconnect(struct usb_in
 	struct usb_device *usb_dev = interface_to_usbdev(intf);
 	int i;
 
+	printk("acm_disconnect intf=%p acm=%p usb_dev=%p\n", intf, acm, usb_dev);
+	if (acm)
+		printk("acm_disconnect acm->used=%d acm->dev=%p acm->tty=%p\n", acm->used, acm->dev, acm->tty);
+
 	if (!acm || !acm->dev) {
 		dbg("disconnect on nonexisting interface");
 		return;


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux