openvswitch: Per cpu flow stats.
With mega flow implementation ovs flow can be shared between multiple CPUs which makes stats updates highly contended operation. This patch uses per-CPU stats in cases where a flow is likely to be shared (if there is a wildcard in the 5-tuple and therefore likely to be spread by RSS). In other situations, it uses the current strategy, saving memory and allocation time. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com>
This commit is contained in:

committed by
Jesse Gross

parent
795449d8b8
commit
e298e50570
@@ -19,6 +19,7 @@
|
||||
#ifndef FLOW_H
|
||||
#define FLOW_H 1
|
||||
|
||||
#include <linux/cache.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/openvswitch.h>
|
||||
@@ -146,6 +147,22 @@ struct sw_flow_actions {
|
||||
struct nlattr actions[];
|
||||
};
|
||||
|
||||
struct flow_stats {
|
||||
u64 packet_count; /* Number of packets matched. */
|
||||
u64 byte_count; /* Number of bytes matched. */
|
||||
unsigned long used; /* Last used time (in jiffies). */
|
||||
spinlock_t lock; /* Lock for atomic stats update. */
|
||||
__be16 tcp_flags; /* Union of seen TCP flags. */
|
||||
};
|
||||
|
||||
struct sw_flow_stats {
|
||||
bool is_percpu;
|
||||
union {
|
||||
struct flow_stats *stat;
|
||||
struct flow_stats __percpu *cpu_stats;
|
||||
};
|
||||
};
|
||||
|
||||
struct sw_flow {
|
||||
struct rcu_head rcu;
|
||||
struct hlist_node hash_node[2];
|
||||
@@ -155,12 +172,7 @@ struct sw_flow {
|
||||
struct sw_flow_key unmasked_key;
|
||||
struct sw_flow_mask *mask;
|
||||
struct sw_flow_actions __rcu *sf_acts;
|
||||
|
||||
spinlock_t lock; /* Lock for values below. */
|
||||
unsigned long used; /* Last used time (in jiffies). */
|
||||
u64 packet_count; /* Number of packets matched. */
|
||||
u64 byte_count; /* Number of bytes matched. */
|
||||
__be16 tcp_flags; /* Union of seen TCP flags. */
|
||||
struct sw_flow_stats stats;
|
||||
};
|
||||
|
||||
struct arp_eth_header {
|
||||
@@ -177,7 +189,10 @@ struct arp_eth_header {
|
||||
unsigned char ar_tip[4]; /* target IP address */
|
||||
} __packed;
|
||||
|
||||
void ovs_flow_used(struct sw_flow *, struct sk_buff *);
|
||||
void ovs_flow_stats_update(struct sw_flow *flow, struct sk_buff *skb);
|
||||
void ovs_flow_stats_get(struct sw_flow *flow, struct ovs_flow_stats *stats,
|
||||
unsigned long *used, __be16 *tcp_flags);
|
||||
void ovs_flow_stats_clear(struct sw_flow *flow);
|
||||
u64 ovs_flow_used_time(unsigned long flow_jiffies);
|
||||
|
||||
int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *);
|
||||
|
Reference in New Issue
Block a user