Browse Source

usb-serial: possible irq lock inversion (PPP vs. usb/serial)

=========================================================
[ INFO: possible irq lock inversion dependency detected ]
Peter Zijlstra 19 years ago
parent
commit
e81ee637e4

+ 3 - 3
drivers/usb/serial/cyberjack.c

@@ -214,14 +214,14 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
 		return (0);
 		return (0);
 	}
 	}
 
 
-	spin_lock(&port->lock);
+	spin_lock_bh(&port->lock);
 	if (port->write_urb_busy) {
 	if (port->write_urb_busy) {
-		spin_unlock(&port->lock);
+		spin_unlock_bh(&port->lock);
 		dbg("%s - already writing", __FUNCTION__);
 		dbg("%s - already writing", __FUNCTION__);
 		return 0;
 		return 0;
 	}
 	}
 	port->write_urb_busy = 1;
 	port->write_urb_busy = 1;
-	spin_unlock(&port->lock);
+	spin_unlock_bh(&port->lock);
 
 
 	spin_lock_irqsave(&priv->lock, flags);
 	spin_lock_irqsave(&priv->lock, flags);
 
 

+ 3 - 3
drivers/usb/serial/generic.c

@@ -175,14 +175,14 @@ int usb_serial_generic_write(struct usb_serial_port *port, const unsigned char *
 
 
 	/* only do something if we have a bulk out endpoint */
 	/* only do something if we have a bulk out endpoint */
 	if (serial->num_bulk_out) {
 	if (serial->num_bulk_out) {
-		spin_lock(&port->lock);
+		spin_lock_bh(&port->lock);
 		if (port->write_urb_busy) {
 		if (port->write_urb_busy) {
-			spin_unlock(&port->lock);
+			spin_unlock_bh(&port->lock);
 			dbg("%s - already writing", __FUNCTION__);
 			dbg("%s - already writing", __FUNCTION__);
 			return 0;
 			return 0;
 		}
 		}
 		port->write_urb_busy = 1;
 		port->write_urb_busy = 1;
-		spin_unlock(&port->lock);
+		spin_unlock_bh(&port->lock);
 
 
 		count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
 		count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
 
 

+ 3 - 3
drivers/usb/serial/ipw.c

@@ -394,14 +394,14 @@ static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int
 		return 0;
 		return 0;
 	}
 	}
 
 
-	spin_lock(&port->lock);
+	spin_lock_bh(&port->lock);
 	if (port->write_urb_busy) {
 	if (port->write_urb_busy) {
-		spin_unlock(&port->lock);
+		spin_unlock_bh(&port->lock);
 		dbg("%s - already writing", __FUNCTION__);
 		dbg("%s - already writing", __FUNCTION__);
 		return 0;
 		return 0;
 	}
 	}
 	port->write_urb_busy = 1;
 	port->write_urb_busy = 1;
-	spin_unlock(&port->lock);
+	spin_unlock_bh(&port->lock);
 
 
 	count = min(count, port->bulk_out_size);
 	count = min(count, port->bulk_out_size);
 	memcpy(port->bulk_out_buffer, buf, count);
 	memcpy(port->bulk_out_buffer, buf, count);

+ 3 - 3
drivers/usb/serial/ir-usb.c

@@ -342,14 +342,14 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int
 	if (count == 0)
 	if (count == 0)
 		return 0;
 		return 0;
 
 
-	spin_lock(&port->lock);
+	spin_lock_bh(&port->lock);
 	if (port->write_urb_busy) {
 	if (port->write_urb_busy) {
-		spin_unlock(&port->lock);
+		spin_unlock_bh(&port->lock);
 		dbg("%s - already writing", __FUNCTION__);
 		dbg("%s - already writing", __FUNCTION__);
 		return 0;
 		return 0;
 	}
 	}
 	port->write_urb_busy = 1;
 	port->write_urb_busy = 1;
-	spin_unlock(&port->lock);
+	spin_unlock_bh(&port->lock);
 
 
 	transfer_buffer = port->write_urb->transfer_buffer;
 	transfer_buffer = port->write_urb->transfer_buffer;
 	transfer_size = min(count, port->bulk_out_size - 1);
 	transfer_size = min(count, port->bulk_out_size - 1);

+ 3 - 3
drivers/usb/serial/keyspan_pda.c

@@ -518,13 +518,13 @@ static int keyspan_pda_write(struct usb_serial_port *port,
 	   the TX urb is in-flight (wait until it completes)
 	   the TX urb is in-flight (wait until it completes)
 	   the device is full (wait until it says there is room)
 	   the device is full (wait until it says there is room)
 	*/
 	*/
-	spin_lock(&port->lock);
+	spin_lock_bh(&port->lock);
 	if (port->write_urb_busy || priv->tx_throttled) {
 	if (port->write_urb_busy || priv->tx_throttled) {
-		spin_unlock(&port->lock);
+		spin_unlock_bh(&port->lock);
 		return 0;
 		return 0;
 	}
 	}
 	port->write_urb_busy = 1;
 	port->write_urb_busy = 1;
-	spin_unlock(&port->lock);
+	spin_unlock_bh(&port->lock);
 
 
 	/* At this point the URB is in our control, nobody else can submit it
 	/* At this point the URB is in our control, nobody else can submit it
 	   again (the only sudden transition was the one from EINPROGRESS to
 	   again (the only sudden transition was the one from EINPROGRESS to

+ 3 - 3
drivers/usb/serial/omninet.c

@@ -256,14 +256,14 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf
 		return (0);
 		return (0);
 	}
 	}
 
 
-	spin_lock(&wport->lock);
+	spin_lock_bh(&wport->lock);
 	if (wport->write_urb_busy) {
 	if (wport->write_urb_busy) {
-		spin_unlock(&wport->lock);
+		spin_unlock_bh(&wport->lock);
 		dbg("%s - already writing", __FUNCTION__);
 		dbg("%s - already writing", __FUNCTION__);
 		return 0;
 		return 0;
 	}
 	}
 	wport->write_urb_busy = 1;
 	wport->write_urb_busy = 1;
-	spin_unlock(&wport->lock);
+	spin_unlock_bh(&wport->lock);
 
 
 	count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count;
 	count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count;
 
 

+ 3 - 3
drivers/usb/serial/safe_serial.c

@@ -298,14 +298,14 @@ static int safe_write (struct usb_serial_port *port, const unsigned char *buf, i
 		dbg ("%s - write request of 0 bytes", __FUNCTION__);
 		dbg ("%s - write request of 0 bytes", __FUNCTION__);
 		return (0);
 		return (0);
 	}
 	}
-	spin_lock(&port->lock);
+	spin_lock_bh(&port->lock);
 	if (port->write_urb_busy) {
 	if (port->write_urb_busy) {
-		spin_unlock(&port->lock);
+		spin_unlock_bh(&port->lock);
 		dbg("%s - already writing", __FUNCTION__);
 		dbg("%s - already writing", __FUNCTION__);
 		return 0;
 		return 0;
 	}
 	}
 	port->write_urb_busy = 1;
 	port->write_urb_busy = 1;
-	spin_unlock(&port->lock);
+	spin_unlock_bh(&port->lock);
 
 
 	packet_length = port->bulk_out_size;	// get max packetsize
 	packet_length = port->bulk_out_size;	// get max packetsize