Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com> --- lib/dpif-netdev.c | 97 +++++++++++++++++++++---------------------------------- 1 file changed, 36 insertions(+), 61 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 11aacc3..a798c86 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -54,6 +54,7 @@ #include "ofpbuf.h" #include "ovs-numa.h" #include "ovs-rcu.h" +#include "ovs-thread-stats.h" #include "packet-dpif.h" #include "packets.h" #include "poll-loop.h" @@ -288,10 +289,8 @@ struct dp_netdev_flow { * reference. */ struct ovs_refcount ref_cnt; - /* Statistics. - * - * Reading or writing these members requires 'mutex'. */ - struct ovsthread_stats stats; /* Contains "struct dp_netdev_flow_stats". */ + /* Statistics. */ + int stats; /* Contains 'struct dp_netdev_flow_stats'. */ /* Actions. */ OVSRCU_TYPE(struct dp_netdev_actions *) actions; @@ -302,12 +301,10 @@ static bool dp_netdev_flow_ref(struct dp_netdev_flow *); /* Contained by struct dp_netdev_flow's 'stats' member. */ struct dp_netdev_flow_stats { - struct ovs_mutex mutex; /* Guards all the other members. */ - - long long int used OVS_GUARDED; /* Last used time, in monotonic msecs. */ - long long int packet_count OVS_GUARDED; /* Number of packets matched. */ - long long int byte_count OVS_GUARDED; /* Number of bytes matched. */ - uint16_t tcp_flags OVS_GUARDED; /* Bitwise-OR of seen tcp_flags values. */ + long long int used; /* Last used time, in monotonic msecs. */ + long long int packet_count; /* Number of packets matched. */ + long long int byte_count; /* Number of bytes matched. */ + uint16_t tcp_flags; /* Bitwise-OR of seen tcp_flags values. */ }; /* A set of datapath actions within a "struct dp_netdev_flow". @@ -1083,16 +1080,8 @@ dpif_netdev_port_query_by_name(const struct dpif *dpif, const char *devname, static void dp_netdev_flow_free(struct dp_netdev_flow *flow) { - struct dp_netdev_flow_stats *bucket; - size_t i; - - OVSTHREAD_STATS_FOR_EACH_BUCKET (bucket, i, &flow->stats) { - ovs_mutex_destroy(&bucket->mutex); - free_cacheline(bucket); - } - ovsthread_stats_destroy(&flow->stats); - cls_rule_destroy(CONST_CAST(struct cls_rule *, &flow->cr)); + ovsthread_stats_destroy_bucket(flow->stats); dp_netdev_actions_free(dp_netdev_flow_get_actions(flow)); free(flow); } @@ -1398,21 +1387,24 @@ dp_netdev_find_flow(const struct dp_netdev *dp, const struct flow *flow) } static void +dp_netdev_flow_aggregate_cb(void *aux, struct ovsthread_stats_bucket *b) +{ + struct dpif_flow_stats *dst = (struct dpif_flow_stats *)aux; + struct dp_netdev_flow_stats *src + = OVSTHREAD_STATS_BUCKET_CAST(struct dp_netdev_flow_stats *, b); + dst->used = MAX(dst->used, src->used); + dst->n_packets += src->packet_count; + dst->n_bytes += src->byte_count; + dst->tcp_flags |= src->tcp_flags; +} + +static void get_dpif_flow_stats(const struct dp_netdev_flow *netdev_flow, struct dpif_flow_stats *stats) { - struct dp_netdev_flow_stats *bucket; - size_t i; - memset(stats, 0, sizeof *stats); - OVSTHREAD_STATS_FOR_EACH_BUCKET (bucket, i, &netdev_flow->stats) { - ovs_mutex_lock(&bucket->mutex); - stats->n_packets += bucket->packet_count; - stats->n_bytes += bucket->byte_count; - stats->used = MAX(stats->used, bucket->used); - stats->tcp_flags |= bucket->tcp_flags; - ovs_mutex_unlock(&bucket->mutex); - } + ovsthread_stats_aggregate(netdev_flow->stats, stats, + dp_netdev_flow_aggregate_cb); } static void @@ -1564,7 +1556,7 @@ dp_netdev_flow_add(struct dp_netdev *dp, struct match *match, ovs_refcount_init(&netdev_flow->ref_cnt); - ovsthread_stats_init(&netdev_flow->stats); + netdev_flow->stats = ovsthread_stats_create_bucket(); ovsrcu_set(&netdev_flow->actions, dp_netdev_actions_create(actions, actions_len)); @@ -1596,17 +1588,7 @@ dp_netdev_flow_add(struct dp_netdev *dp, struct match *match, static void clear_stats(struct dp_netdev_flow *netdev_flow) { - struct dp_netdev_flow_stats *bucket; - size_t i; - - OVSTHREAD_STATS_FOR_EACH_BUCKET (bucket, i, &netdev_flow->stats) { - ovs_mutex_lock(&bucket->mutex); - bucket->used = 0; - bucket->packet_count = 0; - bucket->byte_count = 0; - bucket->tcp_flags = 0; - ovs_mutex_unlock(&bucket->mutex); - } + ovsthread_stats_clear(netdev_flow->stats); } static int @@ -2360,14 +2342,6 @@ dp_netdev_set_pmds_on_numa(struct dp_netdev *dp, int numa_id) } -static void * -dp_netdev_flow_stats_new_cb(void) -{ - struct dp_netdev_flow_stats *bucket = xzalloc_cacheline(sizeof *bucket); - ovs_mutex_init(&bucket->mutex); - return bucket; -} - /* Called after pmd threads config change. Restarts pmd threads with * new configuration. */ static void @@ -2385,22 +2359,23 @@ dp_netdev_reset_pmd_threads(struct dp_netdev *dp) } static void -dp_netdev_flow_used(struct dp_netdev_flow *netdev_flow, - int cnt, int size, +dp_netdev_flow_used(struct dp_netdev_flow *netdev_flow, int cnt, int size, uint16_t tcp_flags) { long long int now = time_msec(); - struct dp_netdev_flow_stats *bucket; + struct ovsthread_stats_bucket *bucket; + struct dp_netdev_flow_stats *stats; + uint32_t seq; - bucket = ovsthread_stats_bucket_get(&netdev_flow->stats, - dp_netdev_flow_stats_new_cb); + bucket = ovsthread_stats_get_bucket(netdev_flow->stats, &seq); + stats = OVSTHREAD_STATS_BUCKET_CAST(struct dp_netdev_flow_stats *, bucket); - ovs_mutex_lock(&bucket->mutex); - bucket->used = MAX(now, bucket->used); - bucket->packet_count += cnt; - bucket->byte_count += size; - bucket->tcp_flags |= tcp_flags; - ovs_mutex_unlock(&bucket->mutex); + stats->used = MAX(now, stats->used); + stats->packet_count += cnt; + stats->byte_count += size; + stats->tcp_flags |= tcp_flags; + + ovsthread_stats_bucket_done(bucket, seq); } static void * -- 2.1.0.rc1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev