diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-01-19 18:20:57 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-01-21 17:34:30 -0500 |
commit | 5c0999b72b34541a3734a9138c43d5c024a42d47 (patch) | |
tree | d73efcb136aa71a7b82161b25d5e19c72865694e /drivers/net/igb/igb_ethtool.c | |
parent | 649aa95d75cbadb9f440c1b8d04c666461de326f (diff) |
igb: Replace LRO with GRO
This patch makes igb invoke the GRO hooks instead of LRO. As
GRO has a compatible external interface to LRO this is a very
straightforward replacement.
Three things of note:
1) I've kept the LRO Kconfig option until we decide to enable
GRO across the board at which point it can also be killed.
2) The poll_controller stuff is broken in igb as it tries to do
the same work as the normal poll routine. Since poll_controller
can be called in the middle of a poll, this can't be good.
I noticed this because poll_controller can invoke the GRO hooks
without flushing held GRO packets.
However, this should be harmless (assuming the poll_controller
bug above doesn't kill you first :) since the next ->poll will
clear the backlog. The only time when we'll have a problem is
if we're already executing the GRO code on the same ring, but
that's no worse than what happens now.
3) I kept the ip_summed check before calling GRO so that we're
on par with previous behaviour.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/igb/igb_ethtool.c')
-rw-r--r-- | drivers/net/igb/igb_ethtool.c | 17 |
1 files changed, 0 insertions, 17 deletions
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index 3c831f1472ad..4606e63fc6f5 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -93,11 +93,6 @@ static const struct igb_stats igb_gstrings_stats[] = { | |||
93 | { "tx_smbus", IGB_STAT(stats.mgptc) }, | 93 | { "tx_smbus", IGB_STAT(stats.mgptc) }, |
94 | { "rx_smbus", IGB_STAT(stats.mgprc) }, | 94 | { "rx_smbus", IGB_STAT(stats.mgprc) }, |
95 | { "dropped_smbus", IGB_STAT(stats.mgpdc) }, | 95 | { "dropped_smbus", IGB_STAT(stats.mgpdc) }, |
96 | #ifdef CONFIG_IGB_LRO | ||
97 | { "lro_aggregated", IGB_STAT(lro_aggregated) }, | ||
98 | { "lro_flushed", IGB_STAT(lro_flushed) }, | ||
99 | { "lro_no_desc", IGB_STAT(lro_no_desc) }, | ||
100 | #endif | ||
101 | }; | 96 | }; |
102 | 97 | ||
103 | #define IGB_QUEUE_STATS_LEN \ | 98 | #define IGB_QUEUE_STATS_LEN \ |
@@ -1921,18 +1916,6 @@ static void igb_get_ethtool_stats(struct net_device *netdev, | |||
1921 | int stat_count = sizeof(struct igb_queue_stats) / sizeof(u64); | 1916 | int stat_count = sizeof(struct igb_queue_stats) / sizeof(u64); |
1922 | int j; | 1917 | int j; |
1923 | int i; | 1918 | int i; |
1924 | #ifdef CONFIG_IGB_LRO | ||
1925 | int aggregated = 0, flushed = 0, no_desc = 0; | ||
1926 | |||
1927 | for (i = 0; i < adapter->num_rx_queues; i++) { | ||
1928 | aggregated += adapter->rx_ring[i].lro_mgr.stats.aggregated; | ||
1929 | flushed += adapter->rx_ring[i].lro_mgr.stats.flushed; | ||
1930 | no_desc += adapter->rx_ring[i].lro_mgr.stats.no_desc; | ||
1931 | } | ||
1932 | adapter->lro_aggregated = aggregated; | ||
1933 | adapter->lro_flushed = flushed; | ||
1934 | adapter->lro_no_desc = no_desc; | ||
1935 | #endif | ||
1936 | 1919 | ||
1937 | igb_update_stats(adapter); | 1920 | igb_update_stats(adapter); |
1938 | for (i = 0; i < IGB_GLOBAL_STATS_LEN; i++) { | 1921 | for (i = 0; i < IGB_GLOBAL_STATS_LEN; i++) { |