Re: pl2303 ttyUSB0: pl2303_open - failed submitting interrupt urb, error -28

Luiz Fernando N. Capitulino
2006-06-13T17:45:20Z

On Tue, 13 Jun 2006 13:26:55 -0300
"Luiz Fernando N. Capitulino" <lcapitulino@mandriva.com.br> wrote:

| On Tue, 13 Jun 2006 13:46:06 +0200
| Frank Gevaerts <frank.gevaerts@fks.be> wrote:
|
| | On Mon, Jun 12, 2006 at 07:21:26PM -0400, Mark Lord wrote:
| | > Mark Lord wrote:
| | > >Greg KH wrote:
| | > >>So we should have finally covered both of them now.
| | > >
| | > >Yes, agreed.
| | > >
| | > >So if modify pl2303_open() to have it simulate -ENOMEM from
| | > >usb_submit_urb(),
| | > >then this should not crash the entire USB subsystem. Right?
| | > >
| | > >Ditto if it happens due to low-memory, rather than me hacking the code
| | > >to test it?
| | >
| | > Mmmm.. looks like it's still buggy, but we manage to avoid the bug
| | > under *most* circumstances. Which is good!
| | >
| | > But the bug will still need to be fixed. A failure from usb_submit_urb()
| | > should not require a reboot to recover.
| | > Here's the results of a simulated -ENOMEM test:
| | >
| | > kernel BUG at kernel/workqueue.c:110!
| |
| | We had the exact same error here with ipaq.ko. Our problems only went
| | away once we applied the following (the first part might already be
| | applied).
|
| Interesting, I couldn't reproduce this with ftdio_sio.

Ok, managed to reproduce it (in fact it happens at disconnection
time).

Frank, the second hunk of your patch fixes it, but the right
label is bailout_mutex_unlock. Like this:

diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 9c36f0e..0b7bc20 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -230,6 +230,7 @@ bailout_module_put:
module_put(serial->type->driver.owner);
bailout_mutex_unlock:
port->open_count = 0;
+ tty->driver_data = port->tty = NULL;
mutex_unlock(&port->mutex);
bailout_kref_put:
kref_put(&serial->kref, destroy_serial);

Could you redo and submit please?

--
Luiz Fernando N. Capitulino