Patch "xtensa: ISS: fix locking in TAP network adapter" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
xtensa: ISS: fix locking in TAP network adapter
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
xtensa-iss-fix-locking-in-tap-network-adapter.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
24e94454c8cb6a13634f5a2f5a01da53a546a58dMon Sep 17 00:00:00 2001
From: Max Filippov <[email protected]>
Date: Fri, 3 Apr 2015 09:56:21 +0300
Subject: xtensa: ISS: fix locking in TAP network adapter
From: Max Filippov <[email protected]>
commit 24e94454c8cb6a13634f5a2f5a01da53a546a58d upstream.
- don't lock lp->lock in the iss_net_timer for the call of iss_net_poll, it will lock it itself;
- invert order of lp->lock and opened_lock acquisition in the iss_net_open to make it consistent with iss_net_poll;
- replace spin_lock with spin_lock_bh when acquiring locks used in iss_net_timer from non-atomic context;
- replace spin_lock_irqsave with spin_lock_bh in the iss_net_start_xmit as the driver doesn't use lp->lock in the hard IRQ context;
- replace __SPIN_LOCK_UNLOCKED(lp.lock) with spin_lock_init, otherwise lockdep is unhappy about using non-static key.
--- arch/xtensa/platforms/iss/network.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-)
arch/xtensa/platforms/iss/network.c +15 -14
@@ -349,8 +349,8 @@ static void iss_net_timer(unsigned long {struct iss_net_private *lp = (struct iss_net_private *)priv; -spin_lock (&lp->lock);iss_net_poll (); +spin_lock (&lp->lock);mod_timer (&lp->timer, jiffies + lp->timer_val);spin_unlock (&lp->lock); }
@@ -361,7 +361,7 @@ static int iss_net_open(struct net_devicstruct iss_net_private *lp =netdev_priv (dev);int err; -spin_lock (&lp->lock); +spin_lock_bh (&lp->lock); err = lp->tp.open (lp);if (err <0 )
@@ -376,9 +376,11 @@ static int iss_net_open(struct net_devicwhile ((err =iss_net_rx (dev)) >0 ) ; -spin_lock (&opened_lock); +spin_unlock_bh (&lp->lock); +spin_lock_bh (&opened_lock);list_add (&lp->opened_list, &opened); -spin_unlock (&opened_lock); +spin_unlock_bh (&opened_lock); +spin_lock_bh (&lp->lock);init_timer (&lp->timer); lp->timer_val =ISS_NET_TIMER_VALUE ;
@@ -387,7 +389,7 @@ static int iss_net_open(struct net_devicmod_timer (&lp->timer, jiffies + lp->timer_val); out: -spin_unlock (&lp->lock); +spin_unlock_bh (&lp->lock);return err; }
@@ -395,7 +397,7 @@ static int iss_net_close(struct net_devi {struct iss_net_private *lp =netdev_priv (dev);netif_stop_queue (dev); -spin_lock (&lp->lock); +spin_lock_bh (&lp->lock);spin_lock (&opened_lock);list_del (&opened);
@@ -405,18 +407,17 @@ static int iss_net_close(struct net_devi lp->tp.close (lp); -spin_unlock (&lp->lock); +spin_unlock_bh (&lp->lock);return 0 ; }static int iss_net_start_xmit (struct sk_buff *skb,struct net_device *dev) {struct iss_net_private *lp =netdev_priv (dev); -unsigned long flags;int len;netif_stop_queue (dev); -spin_lock_irqsave (&lp->lock, flags); +spin_lock_bh (&lp->lock); len = lp->tp.write (lp, &skb);
@@ -438,7 +439,7 @@ static int iss_net_start_xmit(struct sk_pr_err ("%s: %s failed(%d)\n" , dev->name, __func__, len); } -spin_unlock_irqrestore (&lp->lock, flags); +spin_unlock_bh (&lp->lock);dev_kfree_skb (skb);return NETDEV_TX_OK ;
@@ -466,9 +467,9 @@ static int iss_net_set_mac(struct net_deif (!is_valid_ether_addr (hwaddr->sa_data))return -EADDRNOTAVAIL ; -spin_lock (&lp->lock); +spin_lock_bh (&lp->lock);memcpy (dev->dev_addr, hwaddr->sa_data,ETH_ALEN ); -spin_unlock (&lp->lock); +spin_unlock_bh (&lp->lock);return 0 ; }
@@ -520,11 +521,11 @@ static int iss_net_configure(int index, *lp = (struct iss_net_private ) { .device_list =LIST_HEAD_INIT (lp->device_list), .opened_list =LIST_HEAD_INIT (lp->opened_list), - .lock =__SPIN_LOCK_UNLOCKED (lp.lock), .dev = dev, .index = index, - }; + }; +spin_lock_init (&lp->lock);/* * If this name ends up conflicting with an existing registered * netdevice, that is OK, register_netdev{,ice}() will notice this
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/xtensa-iss-fix-locking-in-tap-network-adapter.patch queue-3.14/xtensa-xtfpga-fix-hardware-lockup-caused-by-lcd-driver.patch queue-3.14/xtensa-provide-__nr_sync_file_range2-instead-of-__nr_sync_file_range.patch