Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com> --- lib/dpif-netdev.c | 71 +++++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 36 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a798c86..9880027 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -175,7 +175,7 @@ struct dp_netdev { /* Statistics. * * ovsthread_stats is internally synchronized. */ - struct ovsthread_stats stats; /* Contains 'struct dp_netdev_stats *'. */ + int stats; /* Contains 'struct dp_netdev_stats *'. */ /* Ports. * @@ -219,10 +219,8 @@ enum dp_stat_type { /* Contained by struct dp_netdev's 'stats' member. */ struct dp_netdev_stats { - struct ovs_mutex mutex; /* Protects 'n'. */ - - /* Indexed by DP_STAT_*, protected by 'mutex'. */ - unsigned long long int n[DP_N_STATS] OVS_GUARDED; + /* Indexed by DP_STAT_*. */ + unsigned long long int n[DP_N_STATS]; }; @@ -550,7 +548,7 @@ create_dp_netdev(const char *name, const struct dpif_class *class, classifier_init(&dp->cls, NULL); cmap_init(&dp->flow_table); - ovsthread_stats_init(&dp->stats); + dp->stats = ovsthread_stats_create_bucket(); ovs_mutex_init(&dp->port_mutex); cmap_init(&dp->ports); @@ -627,8 +625,6 @@ dp_netdev_free(struct dp_netdev *dp) OVS_REQUIRES(dp_netdev_mutex) { struct dp_netdev_port *port; - struct dp_netdev_stats *bucket; - int i; shash_find_and_delete(&dp_netdevs, dp->name); @@ -644,11 +640,7 @@ dp_netdev_free(struct dp_netdev *dp) } ovs_mutex_unlock(&dp->port_mutex); - OVSTHREAD_STATS_FOR_EACH_BUCKET (bucket, i, &dp->stats) { - ovs_mutex_destroy(&bucket->mutex); - free_cacheline(bucket); - } - ovsthread_stats_destroy(&dp->stats); + ovsthread_stats_destroy_bucket(dp->stats); classifier_destroy(&dp->cls); cmap_destroy(&dp->flow_table); @@ -702,23 +694,34 @@ dpif_netdev_destroy(struct dpif *dpif) return 0; } +static void +dp_netdev_stats_aggr_cb(void *aux, struct ovsthread_stats_bucket *b) +{ + struct dp_netdev_stats *dst = (struct dp_netdev_stats *) aux; + struct dp_netdev_stats *src + = OVSTHREAD_STATS_BUCKET_CAST(struct dp_netdev_stats *, b); + size_t i; + + for (i = 0; i < DP_N_STATS; i++) { + dst->n[i] += src->n[i]; + } +} + static int dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats) { struct dp_netdev *dp = get_dp_netdev(dpif); - struct dp_netdev_stats *bucket; - size_t i; + struct dp_netdev_stats bucket; stats->n_flows = cmap_count(&dp->flow_table); - stats->n_hit = stats->n_missed = stats->n_lost = 0; - OVSTHREAD_STATS_FOR_EACH_BUCKET (bucket, i, &dp->stats) { - ovs_mutex_lock(&bucket->mutex); - stats->n_hit += bucket->n[DP_STAT_HIT]; - stats->n_missed += bucket->n[DP_STAT_MISS]; - stats->n_lost += bucket->n[DP_STAT_LOST]; - ovs_mutex_unlock(&bucket->mutex); - } + memset(&bucket, 0, sizeof(bucket)); + ovsthread_stats_aggregate(dp->stats, &bucket, dp_netdev_stats_aggr_cb); + + stats->n_hit = bucket.n[DP_STAT_HIT]; + stats->n_missed = bucket.n[DP_STAT_MISS]; + stats->n_lost = bucket.n[DP_STAT_LOST]; + stats->n_masks = UINT32_MAX; stats->n_mask_hit = UINT64_MAX; @@ -2378,23 +2381,19 @@ dp_netdev_flow_used(struct dp_netdev_flow *netdev_flow, int cnt, int size, ovsthread_stats_bucket_done(bucket, seq); } -static void * -dp_netdev_stats_new_cb(void) -{ - struct dp_netdev_stats *bucket = xzalloc_cacheline(sizeof *bucket); - ovs_mutex_init(&bucket->mutex); - return bucket; -} - static void dp_netdev_count_packet(struct dp_netdev *dp, enum dp_stat_type type, int cnt) { - struct dp_netdev_stats *bucket; + struct ovsthread_stats_bucket *bucket; + struct dp_netdev_stats *stats; + uint32_t seq; + + bucket = ovsthread_stats_get_bucket(dp->stats, &seq); + stats = OVSTHREAD_STATS_BUCKET_CAST(struct dp_netdev_stats *, bucket); - bucket = ovsthread_stats_bucket_get(&dp->stats, dp_netdev_stats_new_cb); - ovs_mutex_lock(&bucket->mutex); - bucket->n[type] += cnt; - ovs_mutex_unlock(&bucket->mutex); + stats->n[type] += cnt; + + ovsthread_stats_bucket_done(bucket, seq); } static int -- 2.1.0.rc1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev