Re: 2.6.16-rc5 pppd oops on disconnects

From: Paul Fulghum
Date: Sat Mar 11 2006 - 12:58:31 EST


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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/