diff options
author | Grant Likely <grant.likely@secretlab.ca> | 2010-12-30 00:20:30 -0500 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2010-12-30 00:21:47 -0500 |
commit | d392da5207352f09030e95d9ea335a4225667ec0 (patch) | |
tree | 7d6cd1932afcad0a5619a5c504a6d93ca318187c /drivers/net/loopback.c | |
parent | e39d5ef678045d61812c1401f04fe8edb14d6359 (diff) | |
parent | 387c31c7e5c9805b0aef8833d1731a5fe7bdea14 (diff) |
Merge v2.6.37-rc8 into powerpc/next
Diffstat (limited to 'drivers/net/loopback.c')
-rw-r--r-- | drivers/net/loopback.c | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c index 9a0996795321..2d9663a1c54d 100644 --- a/drivers/net/loopback.c +++ b/drivers/net/loopback.c | |||
@@ -64,7 +64,6 @@ struct pcpu_lstats { | |||
64 | u64 packets; | 64 | u64 packets; |
65 | u64 bytes; | 65 | u64 bytes; |
66 | struct u64_stats_sync syncp; | 66 | struct u64_stats_sync syncp; |
67 | unsigned long drops; | ||
68 | }; | 67 | }; |
69 | 68 | ||
70 | /* | 69 | /* |
@@ -74,7 +73,6 @@ struct pcpu_lstats { | |||
74 | static netdev_tx_t loopback_xmit(struct sk_buff *skb, | 73 | static netdev_tx_t loopback_xmit(struct sk_buff *skb, |
75 | struct net_device *dev) | 74 | struct net_device *dev) |
76 | { | 75 | { |
77 | struct pcpu_lstats __percpu *pcpu_lstats; | ||
78 | struct pcpu_lstats *lb_stats; | 76 | struct pcpu_lstats *lb_stats; |
79 | int len; | 77 | int len; |
80 | 78 | ||
@@ -83,8 +81,7 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, | |||
83 | skb->protocol = eth_type_trans(skb, dev); | 81 | skb->protocol = eth_type_trans(skb, dev); |
84 | 82 | ||
85 | /* it's OK to use per_cpu_ptr() because BHs are off */ | 83 | /* it's OK to use per_cpu_ptr() because BHs are off */ |
86 | pcpu_lstats = (void __percpu __force *)dev->ml_priv; | 84 | lb_stats = this_cpu_ptr(dev->lstats); |
87 | lb_stats = this_cpu_ptr(pcpu_lstats); | ||
88 | 85 | ||
89 | len = skb->len; | 86 | len = skb->len; |
90 | if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { | 87 | if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { |
@@ -92,8 +89,7 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, | |||
92 | lb_stats->bytes += len; | 89 | lb_stats->bytes += len; |
93 | lb_stats->packets++; | 90 | lb_stats->packets++; |
94 | u64_stats_update_end(&lb_stats->syncp); | 91 | u64_stats_update_end(&lb_stats->syncp); |
95 | } else | 92 | } |
96 | lb_stats->drops++; | ||
97 | 93 | ||
98 | return NETDEV_TX_OK; | 94 | return NETDEV_TX_OK; |
99 | } | 95 | } |
@@ -101,32 +97,26 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, | |||
101 | static struct rtnl_link_stats64 *loopback_get_stats64(struct net_device *dev, | 97 | static struct rtnl_link_stats64 *loopback_get_stats64(struct net_device *dev, |
102 | struct rtnl_link_stats64 *stats) | 98 | struct rtnl_link_stats64 *stats) |
103 | { | 99 | { |
104 | const struct pcpu_lstats __percpu *pcpu_lstats; | ||
105 | u64 bytes = 0; | 100 | u64 bytes = 0; |
106 | u64 packets = 0; | 101 | u64 packets = 0; |
107 | u64 drops = 0; | ||
108 | int i; | 102 | int i; |
109 | 103 | ||
110 | pcpu_lstats = (void __percpu __force *)dev->ml_priv; | ||
111 | for_each_possible_cpu(i) { | 104 | for_each_possible_cpu(i) { |
112 | const struct pcpu_lstats *lb_stats; | 105 | const struct pcpu_lstats *lb_stats; |
113 | u64 tbytes, tpackets; | 106 | u64 tbytes, tpackets; |
114 | unsigned int start; | 107 | unsigned int start; |
115 | 108 | ||
116 | lb_stats = per_cpu_ptr(pcpu_lstats, i); | 109 | lb_stats = per_cpu_ptr(dev->lstats, i); |
117 | do { | 110 | do { |
118 | start = u64_stats_fetch_begin(&lb_stats->syncp); | 111 | start = u64_stats_fetch_begin(&lb_stats->syncp); |
119 | tbytes = lb_stats->bytes; | 112 | tbytes = lb_stats->bytes; |
120 | tpackets = lb_stats->packets; | 113 | tpackets = lb_stats->packets; |
121 | } while (u64_stats_fetch_retry(&lb_stats->syncp, start)); | 114 | } while (u64_stats_fetch_retry(&lb_stats->syncp, start)); |
122 | drops += lb_stats->drops; | ||
123 | bytes += tbytes; | 115 | bytes += tbytes; |
124 | packets += tpackets; | 116 | packets += tpackets; |
125 | } | 117 | } |
126 | stats->rx_packets = packets; | 118 | stats->rx_packets = packets; |
127 | stats->tx_packets = packets; | 119 | stats->tx_packets = packets; |
128 | stats->rx_dropped = drops; | ||
129 | stats->rx_errors = drops; | ||
130 | stats->rx_bytes = bytes; | 120 | stats->rx_bytes = bytes; |
131 | stats->tx_bytes = bytes; | 121 | stats->tx_bytes = bytes; |
132 | return stats; | 122 | return stats; |
@@ -147,22 +137,16 @@ static const struct ethtool_ops loopback_ethtool_ops = { | |||
147 | 137 | ||
148 | static int loopback_dev_init(struct net_device *dev) | 138 | static int loopback_dev_init(struct net_device *dev) |
149 | { | 139 | { |
150 | struct pcpu_lstats __percpu *lstats; | 140 | dev->lstats = alloc_percpu(struct pcpu_lstats); |
151 | 141 | if (!dev->lstats) | |
152 | lstats = alloc_percpu(struct pcpu_lstats); | ||
153 | if (!lstats) | ||
154 | return -ENOMEM; | 142 | return -ENOMEM; |
155 | 143 | ||
156 | dev->ml_priv = (void __force *)lstats; | ||
157 | return 0; | 144 | return 0; |
158 | } | 145 | } |
159 | 146 | ||
160 | static void loopback_dev_free(struct net_device *dev) | 147 | static void loopback_dev_free(struct net_device *dev) |
161 | { | 148 | { |
162 | struct pcpu_lstats __percpu *lstats = | 149 | free_percpu(dev->lstats); |
163 | (void __percpu __force *)dev->ml_priv; | ||
164 | |||
165 | free_percpu(lstats); | ||
166 | free_netdev(dev); | 150 | free_netdev(dev); |
167 | } | 151 | } |
168 | 152 | ||