Calling time_msec() (which calls clock_gettime()) too often might be expensive. With this commit OVS makes only one call per received batch and caches the result.
Suggested-by: Ethan Jackson <et...@nicira.com> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> --- lib/dpif-netdev.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index cad063d..8aa70c8 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2946,9 +2946,8 @@ dpif_netdev_get_datapath_version(void) static void dp_netdev_flow_used(struct dp_netdev_flow *netdev_flow, int cnt, int size, - uint16_t tcp_flags) + uint16_t tcp_flags, long long now) { - long long now = time_msec(); uint16_t flags; atomic_store_relaxed(&netdev_flow->stats.used, now); @@ -3050,13 +3049,14 @@ packet_batch_init(struct packet_batch *batch, struct dp_netdev_flow *flow) static inline void packet_batch_execute(struct packet_batch *batch, struct dp_netdev_pmd_thread *pmd, - enum dp_stat_type hit_type) + enum dp_stat_type hit_type, + long long now) { struct dp_netdev_actions *actions; struct dp_netdev_flow *flow = batch->flow; dp_netdev_flow_used(batch->flow, batch->packet_count, batch->byte_count, - batch->tcp_flags); + batch->tcp_flags, now); actions = dp_netdev_flow_get_actions(flow); @@ -3119,7 +3119,7 @@ dp_packet_swap(struct dp_packet **a, struct dp_packet **b) */ static inline size_t emc_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet **packets, - size_t cnt, struct netdev_flow_key *keys) + size_t cnt, struct netdev_flow_key *keys, long long now) { struct netdev_flow_key key; struct packet_batch batches[4]; @@ -3154,7 +3154,7 @@ emc_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet **packets, } for (i = 0; i < n_batches; i++) { - packet_batch_execute(&batches[i], pmd, DP_STAT_EXACT_HIT); + packet_batch_execute(&batches[i], pmd, DP_STAT_EXACT_HIT, now); } return notfound_cnt; @@ -3163,7 +3163,7 @@ emc_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet **packets, static inline void fast_path_processing(struct dp_netdev_pmd_thread *pmd, struct dp_packet **packets, size_t cnt, - struct netdev_flow_key *keys) + struct netdev_flow_key *keys, long long now) { #if !defined(__CHECKER__) && !defined(_WIN32) const size_t PKT_ARRAY_SIZE = cnt; @@ -3291,7 +3291,7 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd, } for (i = 0; i < n_batches; i++) { - packet_batch_execute(&batches[i], pmd, DP_STAT_MASKED_HIT); + packet_batch_execute(&batches[i], pmd, DP_STAT_MASKED_HIT, now); } } @@ -3306,11 +3306,12 @@ dp_netdev_input(struct dp_netdev_pmd_thread *pmd, enum { PKT_ARRAY_SIZE = NETDEV_MAX_RX_BATCH }; #endif struct netdev_flow_key keys[PKT_ARRAY_SIZE]; + long long now = time_msec(); size_t newcnt; - newcnt = emc_processing(pmd, packets, cnt, keys); + newcnt = emc_processing(pmd, packets, cnt, keys, now); if (OVS_UNLIKELY(newcnt)) { - fast_path_processing(pmd, packets, newcnt, keys); + fast_path_processing(pmd, packets, newcnt, keys, now); } } -- 2.1.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev