Hi Reshma, > -----Original Message----- > From: reshma.pat...@intel.com [mailto:reshma.pat...@intel.com] > Sent: Friday, September 21, 2018 11:02 PM > To: long...@viettel.com.vn; konstantin.anan...@intel.com; dev@dpdk.org > Cc: Reshma Pattan <reshma.pat...@intel.com> > Subject: [PATCH] latencystats: fix timestamp marking and latency calculation > > Latency calculation logic is not correct for the case where packets gets > dropped before TX. As for the dropped packets, the timestamp is not > cleared, and such packets still gets counted for latency calculation in next > runs, that will result in inaccurate latency measurement. > > So fix this issue as below, > > Before setting timestamp in mbuf, check mbuf don't have any prior valid > time stamp flag set and after marking the timestamp, set mbuf flags to > indicate timestamp is valid. > > Before calculating timestamp check mbuf flags are set to indicate timestamp > is valid. >
This solution as suggested by Konstantin is great. Not only does it solve the problem but also now the usage of mbuf->timestamp is not exclusive to latencystats anymore. The application can make use of timestamp at the same as latencystats simply by toggling PKT_RX_TIMESTAMP. I think we should update the doc to include this information. > With the above logic it is guaranteed that correct timestamps have been > used. > > Fixes: 5cd3cac9ed ("latency: added new library for latency stats") > > Reported-by: Bao-Long Tran <long...@viettel.com.vn> > Signed-off-by: Reshma Pattan <reshma.pat...@intel.com> > --- > lib/librte_latencystats/rte_latencystats.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_latencystats/rte_latencystats.c > b/lib/librte_latencystats/rte_latencystats.c > index 1fdec68e3..8870226bb 100644 > --- a/lib/librte_latencystats/rte_latencystats.c > +++ b/lib/librte_latencystats/rte_latencystats.c > @@ -125,8 +125,11 @@ add_time_stamps(uint16_t pid __rte_unused, > for (i = 0; i < nb_pkts; i++) { > diff_tsc = now - prev_tsc; > timer_tsc += diff_tsc; > - if (timer_tsc >= samp_intvl) { > + > + if ((pkts[i]->ol_flags & PKT_RX_TIMESTAMP) == 0 > + && (timer_tsc >= samp_intvl)) { > pkts[i]->timestamp = now; > + pkts[i]->ol_flags |= PKT_RX_TIMESTAMP; > timer_tsc = 0; > } > prev_tsc = now; > @@ -156,7 +159,8 @@ calc_latency(uint16_t pid __rte_unused, > > now = rte_rdtsc(); > for (i = 0; i < nb_pkts; i++) { > - if (pkts[i]->timestamp) > + if ((pkts[i]->ol_flags & PKT_RX_TIMESTAMP) && > + pkts[i]->timestamp) Just a nit, but I think we don't have to check for pkts[i]->timestamp here. > latency[cnt++] = now - pkts[i]->timestamp; > } > > -- > 2.14.4 Best regards, BL