net: do not inline netif_tx_lock()/netif_tx_unlock()
authorEric Dumazet <edumazet@google.com>
Wed, 17 Nov 2021 03:29:23 +0000 (19:29 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Nov 2021 14:56:16 +0000 (14:56 +0000)
These are not fast path, there is no point in inlining them.

Also provide netif_freeze_queues()/netif_unfreeze_queues()
so that we can use them from dev_watchdog() in the following patch.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/sched/sch_generic.c

index 279409e..4f4a299 100644 (file)
@@ -4126,27 +4126,7 @@ static inline void netif_trans_update(struct net_device *dev)
  *
  * Get network device transmit lock
  */
-static inline void netif_tx_lock(struct net_device *dev)
-{
-       unsigned int i;
-       int cpu;
-
-       spin_lock(&dev->tx_global_lock);
-       cpu = smp_processor_id();
-       for (i = 0; i < dev->num_tx_queues; i++) {
-               struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
-
-               /* We are the only thread of execution doing a
-                * freeze, but we have to grab the _xmit_lock in
-                * order to synchronize with threads which are in
-                * the ->hard_start_xmit() handler and already
-                * checked the frozen bit.
-                */
-               __netif_tx_lock(txq, cpu);
-               set_bit(__QUEUE_STATE_FROZEN, &txq->state);
-               __netif_tx_unlock(txq);
-       }
-}
+void netif_tx_lock(struct net_device *dev);
 
 static inline void netif_tx_lock_bh(struct net_device *dev)
 {
@@ -4154,22 +4134,7 @@ static inline void netif_tx_lock_bh(struct net_device *dev)
        netif_tx_lock(dev);
 }
 
-static inline void netif_tx_unlock(struct net_device *dev)
-{
-       unsigned int i;
-
-       for (i = 0; i < dev->num_tx_queues; i++) {
-               struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
-
-               /* No need to grab the _xmit_lock here.  If the
-                * queue is not stopped for another reason, we
-                * force a schedule.
-                */
-               clear_bit(__QUEUE_STATE_FROZEN, &txq->state);
-               netif_schedule_queue(txq);
-       }
-       spin_unlock(&dev->tx_global_lock);
-}
+void netif_tx_unlock(struct net_device *dev);
 
 static inline void netif_tx_unlock_bh(struct net_device *dev)
 {
index 02c4604..389e0d8 100644 (file)
@@ -445,6 +445,57 @@ unsigned long dev_trans_start(struct net_device *dev)
 }
 EXPORT_SYMBOL(dev_trans_start);
 
+static void netif_freeze_queues(struct net_device *dev)
+{
+       unsigned int i;
+       int cpu;
+
+       cpu = smp_processor_id();
+       for (i = 0; i < dev->num_tx_queues; i++) {
+               struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
+
+               /* We are the only thread of execution doing a
+                * freeze, but we have to grab the _xmit_lock in
+                * order to synchronize with threads which are in
+                * the ->hard_start_xmit() handler and already
+                * checked the frozen bit.
+                */
+               __netif_tx_lock(txq, cpu);
+               set_bit(__QUEUE_STATE_FROZEN, &txq->state);
+               __netif_tx_unlock(txq);
+       }
+}
+
+void netif_tx_lock(struct net_device *dev)
+{
+       spin_lock(&dev->tx_global_lock);
+       netif_freeze_queues(dev);
+}
+EXPORT_SYMBOL(netif_tx_lock);
+
+static void netif_unfreeze_queues(struct net_device *dev)
+{
+       unsigned int i;
+
+       for (i = 0; i < dev->num_tx_queues; i++) {
+               struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
+
+               /* No need to grab the _xmit_lock here.  If the
+                * queue is not stopped for another reason, we
+                * force a schedule.
+                */
+               clear_bit(__QUEUE_STATE_FROZEN, &txq->state);
+               netif_schedule_queue(txq);
+       }
+}
+
+void netif_tx_unlock(struct net_device *dev)
+{
+       netif_unfreeze_queues(dev);
+       spin_unlock(&dev->tx_global_lock);
+}
+EXPORT_SYMBOL(netif_tx_unlock);
+
 static void dev_watchdog(struct timer_list *t)
 {
        struct net_device *dev = from_timer(dev, t, watchdog_timer);