slip: fix spinlock variant [Linux 3.15]

This Linux kernel change "slip: fix spinlock variant" is included in the Linux 3.15 release. This change is authored by Oliver Hartkopp <socketcan [at] hartkopp.net> on Sat Apr 26 21:18:32 2014 +0200. The commit for this change in Linux stable tree is ddcde14 (patch).

slip: fix spinlock variant

With commit cc9fa74e2a ("slip/slcan: added locking in wakeup function") a
formerly missing locking was added to slip.c and slcan.c by Andre Naujoks.

Alexander Stein contributed the fix 367525c8c2 ("can: slcan: Fix spinlock
variant") as the kernel lock debugging advised to use spin_lock_bh() instead
of just using spin_lock().

This fix has to be applied to the same code section in slip.c for the same
reason too.

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

There are 6 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/slip/slip.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c
index cc70ecf..ad4a94e 100644
--- a/drivers/net/slip/slip.c
+++ b/drivers/net/slip/slip.c
@@ -429,13 +429,13 @@ static void slip_write_wakeup(struct tty_struct *tty)
    if (!sl || sl->magic != SLIP_MAGIC || !netif_running(sl->dev))
        return;

-   spin_lock(&sl->lock);
+   spin_lock_bh(&sl->lock);
    if (sl->xleft <= 0)  {
        /* Now serial buffer is almost free & we can start
         * transmission of another packet */
        sl->dev->stats.tx_packets++;
        clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
-       spin_unlock(&sl->lock);
+       spin_unlock_bh(&sl->lock);
        sl_unlock(sl);
        return;
    }
@@ -443,7 +443,7 @@ static void slip_write_wakeup(struct tty_struct *tty)
    actual = tty->ops->write(tty, sl->xhead, sl->xleft);
    sl->xleft -= actual;
    sl->xhead += actual;
-   spin_unlock(&sl->lock);
+   spin_unlock_bh(&sl->lock);
 }

 static void sl_tx_timeout(struct net_device *dev)

Leave a Reply

Your email address will not be published. Required fields are marked *