aboutsummaryrefslogtreecommitdiffstats
path: root/net/openvswitch/vport-internal_dev.c
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@nicira.com>2015-08-29 20:44:07 -0400
committerDavid S. Miller <davem@davemloft.net>2015-08-29 22:07:15 -0400
commit8c876639c98501b049269b554bf4ecbb8f9c012f (patch)
treedf0acdaec7613cfd181a98448d0678660b6ca5ad /net/openvswitch/vport-internal_dev.c
parent3eedb41fb43461b5fde3f72fd00a7706f0b90103 (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.c57
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.*/
47static 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. */
70static int internal_dev_xmit(struct sk_buff *skb, struct net_device *netdev) 47static 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
127static struct rtnl_link_ops internal_dev_link_ops __read_mostly = { 117static 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
215static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) 205static 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
241static struct vport_ops ovs_internal_vport_ops = { 234static struct vport_ops ovs_internal_vport_ops = {