diff options
author | Oliver Neukum <oliver@neukum.org> | 2009-10-07 04:50:23 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-10-09 16:52:09 -0400 |
commit | 638325154572ba2113a18669fe3b299caa2dabd9 (patch) | |
tree | c562a8460be432facbbba11288edaceba5ecbf1c /drivers/usb/serial/garmin_gps.c | |
parent | b2a5cf1bdc011f5474c72543f9d8116c0f07f452 (diff) |
USB: serial: fix assumption that throttle/unthrottle cannot sleep
many serial subdrivers are clearly written as if throttle/unthrottle
cannot sleep. This leads to unneeded atomic submissions. This
patch converts affected drivers in a way to makes very clear that
throttle/unthrottle can sleep. Thus future misdesigns can be avoided
and efficiency and reliability improved.
This removes any such assumption using GFP_KERNEL and spin_lock_irq()
Signed-off-by: Oliver Neukum <oliver@neukum.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/serial/garmin_gps.c')
-rw-r--r-- | drivers/usb/serial/garmin_gps.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 20432d345529..5ac900e5a50e 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -1390,14 +1390,13 @@ static void garmin_throttle(struct tty_struct *tty) | |||
1390 | { | 1390 | { |
1391 | struct usb_serial_port *port = tty->driver_data; | 1391 | struct usb_serial_port *port = tty->driver_data; |
1392 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); | 1392 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); |
1393 | unsigned long flags; | ||
1394 | 1393 | ||
1395 | dbg("%s - port %d", __func__, port->number); | 1394 | dbg("%s - port %d", __func__, port->number); |
1396 | /* set flag, data received will be put into a queue | 1395 | /* set flag, data received will be put into a queue |
1397 | for later processing */ | 1396 | for later processing */ |
1398 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 1397 | spin_lock_irq(&garmin_data_p->lock); |
1399 | garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED; | 1398 | garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED; |
1400 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | 1399 | spin_unlock_irq(&garmin_data_p->lock); |
1401 | } | 1400 | } |
1402 | 1401 | ||
1403 | 1402 | ||
@@ -1405,13 +1404,12 @@ static void garmin_unthrottle(struct tty_struct *tty) | |||
1405 | { | 1404 | { |
1406 | struct usb_serial_port *port = tty->driver_data; | 1405 | struct usb_serial_port *port = tty->driver_data; |
1407 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); | 1406 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); |
1408 | unsigned long flags; | ||
1409 | int status; | 1407 | int status; |
1410 | 1408 | ||
1411 | dbg("%s - port %d", __func__, port->number); | 1409 | dbg("%s - port %d", __func__, port->number); |
1412 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 1410 | spin_lock_irq(&garmin_data_p->lock); |
1413 | garmin_data_p->flags &= ~FLAGS_THROTTLED; | 1411 | garmin_data_p->flags &= ~FLAGS_THROTTLED; |
1414 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | 1412 | spin_unlock_irq(&garmin_data_p->lock); |
1415 | 1413 | ||
1416 | /* in native mode send queued data to tty, in | 1414 | /* in native mode send queued data to tty, in |
1417 | serial mode nothing needs to be done here */ | 1415 | serial mode nothing needs to be done here */ |
@@ -1419,7 +1417,7 @@ static void garmin_unthrottle(struct tty_struct *tty) | |||
1419 | garmin_flush_queue(garmin_data_p); | 1417 | garmin_flush_queue(garmin_data_p); |
1420 | 1418 | ||
1421 | if (0 != (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) { | 1419 | if (0 != (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) { |
1422 | status = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 1420 | status = usb_submit_urb(port->read_urb, GFP_KERNEL); |
1423 | if (status) | 1421 | if (status) |
1424 | dev_err(&port->dev, | 1422 | dev_err(&port->dev, |
1425 | "%s - failed resubmitting read urb, error %d\n", | 1423 | "%s - failed resubmitting read urb, error %d\n", |