From ed14b300105eb2bde89eaece3cdb4f0d976f6bb8 Mon Sep 17 00:00:00 2001 From: Xavier Simonart Date: Fri, 7 Jun 2019 14:54:43 +0200 Subject: Increase window size for latency accuracy Accuracy of latency is obtained by writing TX accuracy for packet N in a later packet i.e. packet N + WINDOW. If this window is too small, packet N + WINDOW (conveying accuracy for packet N) might arrive before packet N, resulting in no accuracy for packet N. This change increases this window from 64 to 8K packets. This change should result in a higher number of packets used for latency measurements when packets are reordered. This change might have a performance impact as it uses more memory. Change-Id: I1016fddb66af86605c73a24050238da41cf54152 Signed-off-by: Xavier Simonart Signed-off-by: Patrice Buriez --- VNFs/DPPD-PROX/handle_gen.c | 10 +++++----- VNFs/DPPD-PROX/handle_lat.c | 20 ++++++++++---------- VNFs/DPPD-PROX/handle_lat.h | 4 ++++ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/VNFs/DPPD-PROX/handle_gen.c b/VNFs/DPPD-PROX/handle_gen.c index 4bf2e6eb..fa16b309 100644 --- a/VNFs/DPPD-PROX/handle_gen.c +++ b/VNFs/DPPD-PROX/handle_gen.c @@ -114,7 +114,7 @@ struct task_gen { uint16_t rand_offset; /* each random has an offset*/ uint8_t rand_len; /* # bytes to take from random (no bias introduced) */ } rand[64]; - uint64_t accur[64]; + uint64_t accur[ACCURACY_WINDOW]; uint64_t pkt_tsc_offset[64]; struct pkt_template *pkt_template_orig; /* packet templates (from inline or from pcap) */ struct ether_addr src_mac; @@ -363,11 +363,11 @@ static void task_gen_apply_all_accur_pos(struct task_gen *task, struct rte_mbuf if (!task->accur_pos) return; - /* The accuracy of task->pkt_queue_index - 64 is stored in - packet task->pkt_queue_index. The ID modulo 64 is the + /* The accuracy of task->pkt_queue_index - ACCURACY_WINDOW is stored in + packet task->pkt_queue_index. The ID modulo ACCURACY_WINDOW is the same. */ for (uint16_t j = 0; j < count; ++j) { - uint32_t accuracy = task->accur[(task->pkt_queue_index + j) & 63]; + uint32_t accuracy = task->accur[(task->pkt_queue_index + j) & (ACCURACY_WINDOW - 1)]; task_gen_apply_accur_pos(task, pkt_hdr[j], accuracy); } } @@ -505,7 +505,7 @@ static void task_gen_store_accuracy(struct task_gen *task, uint32_t count, uint6 uint64_t first_accuracy_idx = task->pkt_queue_index - count; for (uint32_t i = 0; i < count; ++i) { - uint32_t accuracy_idx = (first_accuracy_idx + i) & 63; + uint32_t accuracy_idx = (first_accuracy_idx + i) & (ACCURACY_WINDOW - 1); task->accur[accuracy_idx] = accur; } diff --git a/VNFs/DPPD-PROX/handle_lat.c b/VNFs/DPPD-PROX/handle_lat.c index b4e016ec..d3a52d7e 100644 --- a/VNFs/DPPD-PROX/handle_lat.c +++ b/VNFs/DPPD-PROX/handle_lat.c @@ -35,7 +35,7 @@ #include "prox_port_cfg.h" #define DEFAULT_BUCKET_SIZE 10 -#define ACCURACY_BUFFER_SIZE 64 +#define ACCURACY_BUFFER_SIZE (2 * ACCURACY_WINDOW) struct lat_info { uint32_t rx_packet_index; @@ -344,9 +344,9 @@ static void lat_write_latency_to_file(struct task_lat *task) uint64_t rx_tsc = lat_info_get_rx_tsc(lat_info); uint64_t tx_tsc = lat_info_get_tx_tsc(lat_info); - /* Packet n + ACCURACY_BUFFER_SIZE delivers the TX error for packet n, - hence the last ACCURACY_BUFFER_SIZE packets do no have TX error. */ - if (i + ACCURACY_BUFFER_SIZE >= task->latency_buffer_idx) { + /* Packet n + ACCURACY_WINDOW delivers the TX error for packet n, + hence the last ACCURACY_WINDOW packets do no have TX error. */ + if (i + ACCURACY_WINDOW >= task->latency_buffer_idx) { tx_err_tsc = 0; } @@ -616,14 +616,14 @@ static int handle_lat_bulk(struct task_base *tbase, struct rte_mbuf **mbufs, uin } /* If accuracy is enabled, latency is reported with a - delay of ACCURACY_BUFFER_SIZE packets since the generator puts the - accuracy for packet N into packet N + ACCURACY_BUFFER_SIZE. The delay + delay of ACCURACY_WINDOW packets since the generator puts the + accuracy for packet N into packet N + ACCURACY_WINDOW. The delay ensures that all reported latencies have both rx and tx error. */ if (task->accur_pos) { uint32_t tx_time_err = *(uint32_t *)(hdr + task->accur_pos); - struct delayed_latency_entry *delayed_latency_entry = delayed_latency_get(task->delayed_latency_entries, generator_id, packet_id - ACCURACY_BUFFER_SIZE); + struct delayed_latency_entry *delayed_latency_entry = delayed_latency_get(task->delayed_latency_entries, generator_id, packet_id - ACCURACY_WINDOW); if (delayed_latency_entry) { task_lat_store_lat(task, @@ -764,11 +764,11 @@ static void init_task_lat(struct task_base *tbase, struct task_args *targ) PROX_PANIC(task->delayed_latency_entries[i] == NULL, "Failed to allocate array for storing delayed latency entries\n"); } if (task->unique_id_pos == 0) { - /* When using accuracy feature, the accuracy from TX is written ACCURACY_BUFFER_SIZE packets later + /* When using accuracy feature, the accuracy from TX is written ACCURACY_WINDOW packets later * We can only retrieve the good packet if a packet id is written to it. - * Otherwise we will use the packet RECEIVED ACCURACY_BUFFER_SIZE packets ago which is OK if + * Otherwise we will use the packet RECEIVED ACCURACY_WINDOW packets ago which is OK if * packets are not re-ordered. If packets are re-ordered, then the matching between - * the tx accuracy znd the latency is wrong. + * the TX accuracy and the latency is wrong. */ plog_warn("\tWhen accuracy feature is used, a unique id should ideally also be used\n"); } diff --git a/VNFs/DPPD-PROX/handle_lat.h b/VNFs/DPPD-PROX/handle_lat.h index 3cc80461..46f5e7d4 100644 --- a/VNFs/DPPD-PROX/handle_lat.h +++ b/VNFs/DPPD-PROX/handle_lat.h @@ -25,6 +25,10 @@ #include "clock.h" #define LATENCY_ACCURACY 1 +// If ACCURACY_WINDOW is too small, the accuracy for packet N can be received by lat BEFORE +// packet N is received (re-ordering) resulting in accuracy being unused +// 8192 packets is equivalent to 550 micro-seconds at 10Gbps for 64 bytes packets +#define ACCURACY_WINDOW 8192 struct lat_test { uint64_t tot_all_pkts; -- cgit 1.2.3-korg