netdevice: fix sparse warning for HARD_TX_LOCK
authorMichael S. Tsirkin <mst@redhat.com>
Thu, 24 Nov 2016 05:04:08 +0000 (07:04 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Nov 2016 20:28:35 +0000 (15:28 -0500)
sparse warns about context imbalance in any code
that uses HARD_TX_LOCK/UNLOCK - this is because it's
unable to determine that flags don't change so
lock and unlock are paired.

Seems easy enough to fix by adding __acquire/__release
calls.

With this patch af_packet.c is now sparse-clean,

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h

index ff57cd2eba3bacdc8c37c9e1ac22aa5b8f594557..4ffcd874cc20daa822e9c43fa823e49acee35f80 100644 (file)
@@ -3462,6 +3462,17 @@ static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu)
        txq->xmit_lock_owner = cpu;
 }
 
+static inline bool __netif_tx_acquire(struct netdev_queue *txq)
+{
+       __acquire(&txq->_xmit_lock);
+       return true;
+}
+
+static inline void __netif_tx_release(struct netdev_queue *txq)
+{
+       __release(&txq->_xmit_lock);
+}
+
 static inline void __netif_tx_lock_bh(struct netdev_queue *txq)
 {
        spin_lock_bh(&txq->_xmit_lock);
@@ -3563,17 +3574,21 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
 #define HARD_TX_LOCK(dev, txq, cpu) {                  \
        if ((dev->features & NETIF_F_LLTX) == 0) {      \
                __netif_tx_lock(txq, cpu);              \
+       } else {                                        \
+               __netif_tx_acquire(txq);                \
        }                                               \
 }
 
 #define HARD_TX_TRYLOCK(dev, txq)                      \
        (((dev->features & NETIF_F_LLTX) == 0) ?        \
                __netif_tx_trylock(txq) :               \
-               true )
+               __netif_tx_acquire(txq))
 
 #define HARD_TX_UNLOCK(dev, txq) {                     \
        if ((dev->features & NETIF_F_LLTX) == 0) {      \
                __netif_tx_unlock(txq);                 \
+       } else {                                        \
+               __netif_tx_release(txq);                \
        }                                               \
 }