diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2015-08-29 20:44:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-08-29 22:07:15 -0400 |
commit | 8c876639c98501b049269b554bf4ecbb8f9c012f (patch) | |
tree | df0acdaec7613cfd181a98448d0678660b6ca5ad /net/openvswitch/vport-internal_dev.c | |
parent | 3eedb41fb43461b5fde3f72fd00a7706f0b90103 (diff) |
openvswitch: Remove vport stats.
Since all vport types are now backed by netdev, we can directly
use netdev stats. Following patch removes redundant stat
from vport.
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/openvswitch/vport-internal_dev.c')
-rw-r--r-- | net/openvswitch/vport-internal_dev.c | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index 80b3e12ec882..388b8a6bf112 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c | |||
@@ -43,35 +43,26 @@ static struct internal_dev *internal_dev_priv(struct net_device *netdev) | |||
43 | return netdev_priv(netdev); | 43 | return netdev_priv(netdev); |
44 | } | 44 | } |
45 | 45 | ||
46 | /* This function is only called by the kernel network layer.*/ | ||
47 | static struct rtnl_link_stats64 *internal_dev_get_stats(struct net_device *netdev, | ||
48 | struct rtnl_link_stats64 *stats) | ||
49 | { | ||
50 | struct vport *vport = ovs_internal_dev_get_vport(netdev); | ||
51 | struct ovs_vport_stats vport_stats; | ||
52 | |||
53 | ovs_vport_get_stats(vport, &vport_stats); | ||
54 | |||
55 | /* The tx and rx stats need to be swapped because the | ||
56 | * switch and host OS have opposite perspectives. */ | ||
57 | stats->rx_packets = vport_stats.tx_packets; | ||
58 | stats->tx_packets = vport_stats.rx_packets; | ||
59 | stats->rx_bytes = vport_stats.tx_bytes; | ||
60 | stats->tx_bytes = vport_stats.rx_bytes; | ||
61 | stats->rx_errors = vport_stats.tx_errors; | ||
62 | stats->tx_errors = vport_stats.rx_errors; | ||
63 | stats->rx_dropped = vport_stats.tx_dropped; | ||
64 | stats->tx_dropped = vport_stats.rx_dropped; | ||
65 | |||
66 | return stats; | ||
67 | } | ||
68 | |||
69 | /* Called with rcu_read_lock_bh. */ | 46 | /* Called with rcu_read_lock_bh. */ |
70 | static int internal_dev_xmit(struct sk_buff *skb, struct net_device *netdev) | 47 | static int internal_dev_xmit(struct sk_buff *skb, struct net_device *netdev) |
71 | { | 48 | { |
49 | int len, err; | ||
50 | |||
51 | len = skb->len; | ||
72 | rcu_read_lock(); | 52 | rcu_read_lock(); |
73 | ovs_vport_receive(internal_dev_priv(netdev)->vport, skb, NULL); | 53 | err = ovs_vport_receive(internal_dev_priv(netdev)->vport, skb, NULL); |
74 | rcu_read_unlock(); | 54 | rcu_read_unlock(); |
55 | |||
56 | if (likely(!err)) { | ||
57 | struct pcpu_sw_netstats *tstats = this_cpu_ptr(netdev->tstats); | ||
58 | |||
59 | u64_stats_update_begin(&tstats->syncp); | ||
60 | tstats->tx_bytes += len; | ||
61 | tstats->tx_packets++; | ||
62 | u64_stats_update_end(&tstats->syncp); | ||
63 | } else { | ||
64 | netdev->stats.tx_errors++; | ||
65 | } | ||
75 | return 0; | 66 | return 0; |
76 | } | 67 | } |
77 | 68 | ||
@@ -121,7 +112,6 @@ static const struct net_device_ops internal_dev_netdev_ops = { | |||
121 | .ndo_start_xmit = internal_dev_xmit, | 112 | .ndo_start_xmit = internal_dev_xmit, |
122 | .ndo_set_mac_address = eth_mac_addr, | 113 | .ndo_set_mac_address = eth_mac_addr, |
123 | .ndo_change_mtu = internal_dev_change_mtu, | 114 | .ndo_change_mtu = internal_dev_change_mtu, |
124 | .ndo_get_stats64 = internal_dev_get_stats, | ||
125 | }; | 115 | }; |
126 | 116 | ||
127 | static struct rtnl_link_ops internal_dev_link_ops __read_mostly = { | 117 | static struct rtnl_link_ops internal_dev_link_ops __read_mostly = { |
@@ -212,18 +202,17 @@ static void internal_dev_destroy(struct vport *vport) | |||
212 | rtnl_unlock(); | 202 | rtnl_unlock(); |
213 | } | 203 | } |
214 | 204 | ||
215 | static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) | 205 | static void internal_dev_recv(struct vport *vport, struct sk_buff *skb) |
216 | { | 206 | { |
217 | struct net_device *netdev = vport->dev; | 207 | struct net_device *netdev = vport->dev; |
218 | int len; | 208 | struct pcpu_sw_netstats *stats; |
219 | 209 | ||
220 | if (unlikely(!(netdev->flags & IFF_UP))) { | 210 | if (unlikely(!(netdev->flags & IFF_UP))) { |
221 | kfree_skb(skb); | 211 | kfree_skb(skb); |
222 | return 0; | 212 | netdev->stats.rx_dropped++; |
213 | return; | ||
223 | } | 214 | } |
224 | 215 | ||
225 | len = skb->len; | ||
226 | |||
227 | skb_dst_drop(skb); | 216 | skb_dst_drop(skb); |
228 | nf_reset(skb); | 217 | nf_reset(skb); |
229 | secpath_reset(skb); | 218 | secpath_reset(skb); |
@@ -233,9 +222,13 @@ static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) | |||
233 | skb->protocol = eth_type_trans(skb, netdev); | 222 | skb->protocol = eth_type_trans(skb, netdev); |
234 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | 223 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); |
235 | 224 | ||
236 | netif_rx(skb); | 225 | stats = this_cpu_ptr(netdev->tstats); |
226 | u64_stats_update_begin(&stats->syncp); | ||
227 | stats->rx_packets++; | ||
228 | stats->rx_bytes += skb->len; | ||
229 | u64_stats_update_end(&stats->syncp); | ||
237 | 230 | ||
238 | return len; | 231 | netif_rx(skb); |
239 | } | 232 | } |
240 | 233 | ||
241 | static struct vport_ops ovs_internal_vport_ops = { | 234 | static struct vport_ops ovs_internal_vport_ops = { |