From: Pravin B Shelar Date: Mon, 29 Apr 2013 21:45:08 +0000 (-0700) Subject: datapath: Use generic struct pcpu_tstats. X-Git-Tag: v1.11.0~141 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=a0049ffcdb2b42e5687fa9db0fd5029551214eab;p=cascardo%2Fovs.git datapath: Use generic struct pcpu_tstats. Rather than defining ovs specific stats struct (vport_percpu_stats), we can use existing pcpu_tstats to achieve exactly same functionality. Signed-off-by: Pravin B Shelar Acked-by: Jesse Gross --- diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk index f82bffe78..1434a2d1c 100644 --- a/datapath/linux/Modules.mk +++ b/datapath/linux/Modules.mk @@ -26,6 +26,7 @@ openvswitch_headers += \ linux/compat/include/linux/if.h \ linux/compat/include/linux/if_arp.h \ linux/compat/include/linux/if_ether.h \ + linux/compat/include/linux/if_tunnel.h \ linux/compat/include/linux/if_vlan.h \ linux/compat/include/linux/in.h \ linux/compat/include/linux/inetdevice.h \ diff --git a/datapath/linux/compat/include/linux/if_tunnel.h b/datapath/linux/compat/include/linux/if_tunnel.h new file mode 100644 index 000000000..96ab7026e --- /dev/null +++ b/datapath/linux/compat/include/linux/if_tunnel.h @@ -0,0 +1,20 @@ +#ifndef _IF_TUNNEL_WRAPPER_H_ +#define _IF_TUNNEL_WRAPPER_H_ + +#include +#include_next + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) + +#include + +struct pcpu_tstats { + u64 rx_packets; + u64 rx_bytes; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; +}; +#endif + +#endif /* _IF_TUNNEL_WRAPPER_H_ */ diff --git a/datapath/vport.c b/datapath/vport.c index 42a125821..03446da51 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -181,7 +181,7 @@ struct vport *ovs_vport_alloc(int priv_size, const struct vport_ops *ops, vport->ops = ops; INIT_HLIST_NODE(&vport->dp_hash_node); - vport->percpu_stats = alloc_percpu(struct vport_percpu_stats); + vport->percpu_stats = alloc_percpu(struct pcpu_tstats); if (!vport->percpu_stats) { kfree(vport); return ERR_PTR(-ENOMEM); @@ -334,16 +334,16 @@ void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) spin_unlock_bh(&vport->stats_lock); for_each_possible_cpu(i) { - const struct vport_percpu_stats *percpu_stats; - struct vport_percpu_stats local_stats; + const struct pcpu_tstats *percpu_stats; + struct pcpu_tstats local_stats; unsigned int start; percpu_stats = per_cpu_ptr(vport->percpu_stats, i); do { - start = u64_stats_fetch_begin_bh(&percpu_stats->sync); + start = u64_stats_fetch_begin_bh(&percpu_stats->syncp); local_stats = *percpu_stats; - } while (u64_stats_fetch_retry_bh(&percpu_stats->sync, start)); + } while (u64_stats_fetch_retry_bh(&percpu_stats->syncp, start)); stats->rx_bytes += local_stats.rx_bytes; stats->rx_packets += local_stats.rx_packets; @@ -402,13 +402,13 @@ int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb) */ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb) { - struct vport_percpu_stats *stats; + struct pcpu_tstats *stats; stats = this_cpu_ptr(vport->percpu_stats); - u64_stats_update_begin(&stats->sync); + u64_stats_update_begin(&stats->syncp); stats->rx_packets++; stats->rx_bytes += skb->len; - u64_stats_update_end(&stats->sync); + u64_stats_update_end(&stats->syncp); if (!(vport->ops->flags & VPORT_F_TUN_ID)) OVS_CB(skb)->tun_key = NULL; @@ -430,14 +430,14 @@ int ovs_vport_send(struct vport *vport, struct sk_buff *skb) int sent = vport->ops->send(vport, skb); if (likely(sent)) { - struct vport_percpu_stats *stats; + struct pcpu_tstats *stats; stats = this_cpu_ptr(vport->percpu_stats); - u64_stats_update_begin(&stats->sync); + u64_stats_update_begin(&stats->syncp); stats->tx_packets++; stats->tx_bytes += sent; - u64_stats_update_end(&stats->sync); + u64_stats_update_end(&stats->syncp); } return sent; } diff --git a/datapath/vport.h b/datapath/vport.h index 6781cf6de..5c213e909 100644 --- a/datapath/vport.h +++ b/datapath/vport.h @@ -19,6 +19,7 @@ #ifndef VPORT_H #define VPORT_H 1 +#include #include #include #include @@ -53,14 +54,6 @@ int ovs_vport_send(struct vport *, struct sk_buff *); /* The following definitions are for implementers of vport devices: */ -struct vport_percpu_stats { - u64 rx_bytes; - u64 rx_packets; - u64 tx_bytes; - u64 tx_packets; - struct u64_stats_sync sync; -}; - struct vport_err_stats { u64 rx_dropped; u64 rx_errors; @@ -94,7 +87,7 @@ struct vport { struct hlist_node dp_hash_node; const struct vport_ops *ops; - struct vport_percpu_stats __percpu *percpu_stats; + struct pcpu_tstats __percpu *percpu_stats; spinlock_t stats_lock; struct vport_err_stats err_stats;