Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e81ee637 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Greg Kroah-Hartman
Browse files

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

=========================================================
[ INFO: possible irq lock inversion dependency detected ]
parent 2e3a43f0
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -214,14 +214,14 @@ static int cyberjack_write (struct usb_serial_port *port, const unsigned char *b
		return (0);
	}

	spin_lock(&port->lock);
	spin_lock_bh(&port->lock);
	if (port->write_urb_busy) {
		spin_unlock(&port->lock);
		spin_unlock_bh(&port->lock);
		dbg("%s - already writing", __FUNCTION__);
		return 0;
	}
	port->write_urb_busy = 1;
	spin_unlock(&port->lock);
	spin_unlock_bh(&port->lock);

	spin_lock_irqsave(&priv->lock, flags);

+3 −3
Original line number Diff line number Diff line
@@ -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 */
	if (serial->num_bulk_out) {
		spin_lock(&port->lock);
		spin_lock_bh(&port->lock);
		if (port->write_urb_busy) {
			spin_unlock(&port->lock);
			spin_unlock_bh(&port->lock);
			dbg("%s - already writing", __FUNCTION__);
			return 0;
		}
		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;

+3 −3
Original line number Diff line number Diff line
@@ -394,14 +394,14 @@ static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int
		return 0;
	}

	spin_lock(&port->lock);
	spin_lock_bh(&port->lock);
	if (port->write_urb_busy) {
		spin_unlock(&port->lock);
		spin_unlock_bh(&port->lock);
		dbg("%s - already writing", __FUNCTION__);
		return 0;
	}
	port->write_urb_busy = 1;
	spin_unlock(&port->lock);
	spin_unlock_bh(&port->lock);

	count = min(count, port->bulk_out_size);
	memcpy(port->bulk_out_buffer, buf, count);
+3 −3
Original line number Diff line number Diff line
@@ -342,14 +342,14 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int
	if (count == 0)
		return 0;

	spin_lock(&port->lock);
	spin_lock_bh(&port->lock);
	if (port->write_urb_busy) {
		spin_unlock(&port->lock);
		spin_unlock_bh(&port->lock);
		dbg("%s - already writing", __FUNCTION__);
		return 0;
	}
	port->write_urb_busy = 1;
	spin_unlock(&port->lock);
	spin_unlock_bh(&port->lock);

	transfer_buffer = port->write_urb->transfer_buffer;
	transfer_size = min(count, port->bulk_out_size - 1);
+3 −3
Original line number Diff line number Diff line
@@ -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 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) {
		spin_unlock(&port->lock);
		spin_unlock_bh(&port->lock);
		return 0;
	}
	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
	   again (the only sudden transition was the one from EINPROGRESS to
Loading