diff options
author | Tom Herbert <therbert@google.com> | 2011-11-28 11:32:44 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-29 12:46:19 -0500 |
commit | 7346649826382b769cfadf4a2fe8a84d060c55e9 (patch) | |
tree | 0241cce453992881f61d3fbc4f9baf7eb0578135 /include/linux | |
parent | 75957ba36c05b979701e9ec64b37819adc12f830 (diff) |
net: Add queue state xoff flag for stack
Create separate queue state flags so that either the stack or drivers
can turn on XOFF. Added a set of functions used in the stack to determine
if a queue is really stopped (either by stack or driver)
Signed-off-by: Tom Herbert <therbert@google.com>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/netdevice.h | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ac9a4b9344ca..d19f93265cac 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -517,11 +517,23 @@ static inline void napi_synchronize(const struct napi_struct *n) | |||
517 | #endif | 517 | #endif |
518 | 518 | ||
519 | enum netdev_queue_state_t { | 519 | enum netdev_queue_state_t { |
520 | __QUEUE_STATE_XOFF, | 520 | __QUEUE_STATE_DRV_XOFF, |
521 | __QUEUE_STATE_STACK_XOFF, | ||
521 | __QUEUE_STATE_FROZEN, | 522 | __QUEUE_STATE_FROZEN, |
522 | #define QUEUE_STATE_XOFF_OR_FROZEN ((1 << __QUEUE_STATE_XOFF) | \ | 523 | #define QUEUE_STATE_ANY_XOFF ((1 << __QUEUE_STATE_DRV_XOFF) | \ |
523 | (1 << __QUEUE_STATE_FROZEN)) | 524 | (1 << __QUEUE_STATE_STACK_XOFF)) |
525 | #define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF | \ | ||
526 | (1 << __QUEUE_STATE_FROZEN)) | ||
524 | }; | 527 | }; |
528 | /* | ||
529 | * __QUEUE_STATE_DRV_XOFF is used by drivers to stop the transmit queue. The | ||
530 | * netif_tx_* functions below are used to manipulate this flag. The | ||
531 | * __QUEUE_STATE_STACK_XOFF flag is used by the stack to stop the transmit | ||
532 | * queue independently. The netif_xmit_*stopped functions below are called | ||
533 | * to check if the queue has been stopped by the driver or stack (either | ||
534 | * of the XOFF bits are set in the state). Drivers should not need to call | ||
535 | * netif_xmit*stopped functions, they should only be using netif_tx_*. | ||
536 | */ | ||
525 | 537 | ||
526 | struct netdev_queue { | 538 | struct netdev_queue { |
527 | /* | 539 | /* |
@@ -1718,7 +1730,7 @@ extern void __netif_schedule(struct Qdisc *q); | |||
1718 | 1730 | ||
1719 | static inline void netif_schedule_queue(struct netdev_queue *txq) | 1731 | static inline void netif_schedule_queue(struct netdev_queue *txq) |
1720 | { | 1732 | { |
1721 | if (!test_bit(__QUEUE_STATE_XOFF, &txq->state)) | 1733 | if (!(txq->state & QUEUE_STATE_ANY_XOFF)) |
1722 | __netif_schedule(txq->qdisc); | 1734 | __netif_schedule(txq->qdisc); |
1723 | } | 1735 | } |
1724 | 1736 | ||
@@ -1732,7 +1744,7 @@ static inline void netif_tx_schedule_all(struct net_device *dev) | |||
1732 | 1744 | ||
1733 | static inline void netif_tx_start_queue(struct netdev_queue *dev_queue) | 1745 | static inline void netif_tx_start_queue(struct netdev_queue *dev_queue) |
1734 | { | 1746 | { |
1735 | clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state); | 1747 | clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state); |
1736 | } | 1748 | } |
1737 | 1749 | ||
1738 | /** | 1750 | /** |
@@ -1764,7 +1776,7 @@ static inline void netif_tx_wake_queue(struct netdev_queue *dev_queue) | |||
1764 | return; | 1776 | return; |
1765 | } | 1777 | } |
1766 | #endif | 1778 | #endif |
1767 | if (test_and_clear_bit(__QUEUE_STATE_XOFF, &dev_queue->state)) | 1779 | if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state)) |
1768 | __netif_schedule(dev_queue->qdisc); | 1780 | __netif_schedule(dev_queue->qdisc); |
1769 | } | 1781 | } |
1770 | 1782 | ||
@@ -1796,7 +1808,7 @@ static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) | |||
1796 | pr_info("netif_stop_queue() cannot be called before register_netdev()\n"); | 1808 | pr_info("netif_stop_queue() cannot be called before register_netdev()\n"); |
1797 | return; | 1809 | return; |
1798 | } | 1810 | } |
1799 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); | 1811 | set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state); |
1800 | } | 1812 | } |
1801 | 1813 | ||
1802 | /** | 1814 | /** |
@@ -1823,7 +1835,7 @@ static inline void netif_tx_stop_all_queues(struct net_device *dev) | |||
1823 | 1835 | ||
1824 | static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue) | 1836 | static inline int netif_tx_queue_stopped(const struct netdev_queue *dev_queue) |
1825 | { | 1837 | { |
1826 | return test_bit(__QUEUE_STATE_XOFF, &dev_queue->state); | 1838 | return test_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state); |
1827 | } | 1839 | } |
1828 | 1840 | ||
1829 | /** | 1841 | /** |
@@ -1837,9 +1849,16 @@ static inline int netif_queue_stopped(const struct net_device *dev) | |||
1837 | return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0)); | 1849 | return netif_tx_queue_stopped(netdev_get_tx_queue(dev, 0)); |
1838 | } | 1850 | } |
1839 | 1851 | ||
1840 | static inline int netif_tx_queue_frozen_or_stopped(const struct netdev_queue *dev_queue) | 1852 | static inline int netif_xmit_stopped(const struct netdev_queue *dev_queue) |
1841 | { | 1853 | { |
1842 | return dev_queue->state & QUEUE_STATE_XOFF_OR_FROZEN; | 1854 | return dev_queue->state & QUEUE_STATE_ANY_XOFF; |
1855 | } | ||
1856 | |||
1857 | static inline int netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue) | ||
1858 | { | ||
1859 | return dev_queue->state & QUEUE_STATE_ANY_XOFF_OR_FROZEN; | ||
1860 | } | ||
1861 | |||
1843 | } | 1862 | } |
1844 | 1863 | ||
1845 | /** | 1864 | /** |
@@ -1926,7 +1945,7 @@ static inline void netif_wake_subqueue(struct net_device *dev, u16 queue_index) | |||
1926 | if (netpoll_trap()) | 1945 | if (netpoll_trap()) |
1927 | return; | 1946 | return; |
1928 | #endif | 1947 | #endif |
1929 | if (test_and_clear_bit(__QUEUE_STATE_XOFF, &txq->state)) | 1948 | if (test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &txq->state)) |
1930 | __netif_schedule(txq->qdisc); | 1949 | __netif_schedule(txq->qdisc); |
1931 | } | 1950 | } |
1932 | 1951 | ||