> -----Original Message-----
> From: EXT Ivan Khoronzhuk [mailto:[email protected]]
> Sent: Tuesday, September 15, 2015 3:08 PM
> To: Savolainen, Petri (Nokia - FI/Espoo); [email protected]
> Subject: Re: [lng-odp] [PATCH v2 5/5] performance: odp_pktio_perf: fix
> potential overflow for burst_gap
> 
> 
> 
> On 15.09.15 14:42, Savolainen, Petri (Nokia - FI/Espoo) wrote:
> >
> >
> >> -----Original Message-----
> >> From: lng-odp [mailto:[email protected]] On Behalf Of
> >> EXT Ivan Khoronzhuk
> >> Sent: Friday, September 11, 2015 1:05 PM
> >> To: [email protected]
> >> Subject: [lng-odp] [PATCH v2 5/5] performance: odp_pktio_perf: fix
> >> potential overflow for burst_gap
> >>
> >> The direct comparing of "cur_cycles" and "next_tx_cycles" is not
> >> valid, as "next_tx_cycles" can be overflowed and comparison will
> >> give wrong result. So use odp_time_diff_cycles() for that, as it
> >> takes in account ticks overflow.
> >>
> >> Signed-off-by: Ivan Khoronzhuk <[email protected]>
> >> ---
> >>   test/performance/odp_pktio_perf.c | 9 +++++----
> >>   1 file changed, 5 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/test/performance/odp_pktio_perf.c
> >> b/test/performance/odp_pktio_perf.c
> >> index ac32b15..85ef2bc 100644
> >> --- a/test/performance/odp_pktio_perf.c
> >> +++ b/test/performance/odp_pktio_perf.c
> >> @@ -303,7 +303,7 @@ static void *run_thread_tx(void *arg)
> >>    int thr_id;
> >>    odp_queue_t outq;
> >>    pkt_tx_stats_t *stats;
> >> -  uint64_t next_tx_cycles, start_cycles, cur_cycles, send_duration;
> >> +  uint64_t burst_start_cycles, start_cycles, cur_cycles,
> >> send_duration;
> >>    uint64_t burst_gap_cycles;
> >>    uint32_t batch_len;
> >>    int unsent_pkts = 0;
> >> @@ -334,11 +334,12 @@ static void *run_thread_tx(void *arg)
> >>
> >>    cur_cycles     = odp_time_cycles();
> >>    start_cycles   = cur_cycles;
> >> -  next_tx_cycles = cur_cycles;
> >> +  burst_start_cycles = odp_time_diff_cycles(cur_cycles,
> >> burst_gap_cycles);
> >
> > Shouldn't this be:
> >
> > burst_start_cycles = cur_cycles + burst_gap_cycles;
> >
> > ,which works as long as cycle count wraps at UINT64_MAX. Maybe we
> need a cpu.h API for summing two values with correct wrapping.
> It's initialization for burst gap, which is changing while
> send_duration.
> Current algorithm don't wait "burst gap" at first iteration, my
> intention to not change it.
> So I've used diff, in another case it waits one init gap.
> In case of cur_cycles + burst_gap_cycles it waits 2 x burst_gap. So
> it's not correct.
> I suppose here shouldn't be functional changes.
> The cpu API doesn't have sum function and is not for this case, we need
> time here, that is
> Time API is indented for. The new Time API is going to be added after
> this series and will
> contain sum function which will replace "+" on odp_time_sum(). Current
> API supposes that "+"
> correctly handles UINT64_MAX wrap and doesn't contain sum function.


For example:

burst_gap_cycles = 1k; // e.g. 1msec 
cur_cycles = 1M;  // wraps at 10M

burst_start_cycles = odp_time_diff_cycles(cur_cycles, burst_gap_cycles);


burst_start_cycles = 10M - 1M + 1k = 9 001 000



> 
> >
> >
> >
> >
> >
> >>    while (odp_time_diff_cycles(start_cycles, cur_cycles) <
> >> send_duration) {
> >>            unsigned alloc_cnt = 0, tx_cnt;
> >>
> >> -          if (cur_cycles < next_tx_cycles) {
> >> +          if (odp_time_diff_cycles(burst_start_cycles, cur_cycles)
> >> +                                                  < burst_gap_cycles) {

This spins back to the top of the while loop until 'cur_cycles' has passed 
'burst_start_cycles' by ' burst_gap_cycles'. So, in the example the first 
packet is sent at cur_cycles == 9 002 000 cycles.

-Petri


> >>                    cur_cycles = odp_time_cycles();
> >>                    if (idle_start == 0)
> >>                            idle_start = cur_cycles;
> >> @@ -351,7 +352,7 @@ static void *run_thread_tx(void *arg)
> >>                    idle_start = 0;
> >>            }
> >>
> >> -          next_tx_cycles += burst_gap_cycles;
> >> +          burst_start_cycles += burst_gap_cycles;
> >>
> >>            alloc_cnt = alloc_packets(tx_event, batch_len -
> >> unsent_pkts);
> >>            if (alloc_cnt != batch_len)
> >> --
> >> 1.9.1
> >>
> >> _______________________________________________
> >> lng-odp mailing list
> >> [email protected]
> >> https://lists.linaro.org/mailman/listinfo/lng-odp
> 
> --
> Regards,
> Ivan Khoronzhuk
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to