On Fri, Aug 07, 2015 at 11:00:17AM +0200, Balakrishna.Garapati wrote: > Signed-off-by: Balakrishna.Garapati <balakrishna.garap...@linaro.org> > --- > Made updates to print recv stats based on mode > > example/generator/odp_generator.c | 81 > ++++++++++++++++++++++++++++++++------- > 1 file changed, 67 insertions(+), 14 deletions(-) > > diff --git a/example/generator/odp_generator.c > b/example/generator/odp_generator.c > index bdee222..5d1c54a 100644 > --- a/example/generator/odp_generator.c > +++ b/example/generator/odp_generator.c > @@ -101,6 +101,7 @@ static void usage(char *progname); > static int scan_ip(char *buf, unsigned int *paddr); > static int scan_mac(char *in, odph_ethaddr_t *des); > static void tv_sub(struct timeval *recvtime, struct timeval *sendtime); > +static void print_global_stats(int num_workers); > > /** > * Sleep for the specified amount of milliseconds > @@ -371,7 +372,6 @@ static odp_pktio_t create_pktio(const char *dev, > odp_pool_t pool) > static void *gen_send_thread(void *arg) > { > int thr; > - uint64_t start, now, diff; > odp_pktio_t pktio; > thread_args_t *thr_args; > odp_queue_t outq_def; > @@ -393,7 +393,6 @@ static void *gen_send_thread(void *arg) > return NULL; > } > > - start = odp_time_cycles(); > printf(" [%02i] created mode: SEND\n", thr); > for (;;) { > int err; > @@ -434,15 +433,6 @@ static void *gen_send_thread(void *arg) > >= (unsigned int)args->appl.number) { > break; > } > - > - now = odp_time_cycles(); > - diff = odp_time_diff_cycles(start, now); > - if (odp_time_cycles_to_ns(diff) > 20 * ODP_TIME_SEC) { > - start = odp_time_cycles(); > - printf(" [%02i] total send: %ju\n", > - thr, odp_atomic_load_u64(&counters.seq)); > - fflush(stdout); > - } > } > > /* receive number of reply pks until timeout */ > @@ -502,16 +492,16 @@ static void print_pkts(int thr, odp_packet_t pkt_tbl[], > unsigned len) > continue; > > odp_atomic_inc_u64(&counters.ip); > - rlen += sprintf(msg, "receive Packet proto:IP "); > buf = odp_packet_data(pkt); > ip = (odph_ipv4hdr_t *)(buf + odp_packet_l3_offset(pkt)); > - rlen += sprintf(msg + rlen, "id %d ", > - odp_be_to_cpu_16(ip->id)); > offset = odp_packet_l4_offset(pkt); > > /* udp */ > if (ip->proto == ODPH_IPPROTO_UDP) { > odp_atomic_inc_u64(&counters.udp); > + rlen += sprintf(msg, "receive Packet proto:IP "); > + rlen += sprintf(msg + rlen, "id %d ", > + odp_be_to_cpu_16(ip->id)); > udp = (odph_udphdr_t *)(buf + offset); > rlen += sprintf(msg + rlen, "UDP payload %d ", > odp_be_to_cpu_16(udp->length) -
There's still an unconditional print for every received packet. > @@ -589,6 +579,67 @@ static void *gen_recv_thread(void *arg) > > return arg; > } > + > +/** > + * printing verbose statistics > + * > + */ > +static void print_global_stats(int num_workers) > +{ > + uint64_t start, now, diff; > + uint64_t pkts, pkts_prev = 0, pps, maximum_pps = 0; > + int verbose_interval = 20, worker_count; > + odp_thrmask_t thrd_mask; > + > + start = odp_time_cycles(); > + while (1) { > + now = odp_time_cycles(); > + diff = odp_time_diff_cycles(start, now); > + if (odp_time_cycles_to_ns(diff) < > + verbose_interval * ODP_TIME_SEC) { > + continue; > + } There's no exit condition check in this loop above, so you'll wait up to verbose_interval extra seconds unnecessarily, for example when running with "-n 100" the workers will finish quickly. > + > + start = odp_time_cycles(); > + > + worker_count = odp_thrmask_worker(&thrd_mask); There's a potential race here as the worker thread counts get incremented after the thread has started (rather than during the odph_linux_pthread_create() call), and it's pretty likely this code will be reached by the main thread before the workers have started. Should wait until worker count has reached num_workers before entering the loop. > + if (worker_count < num_workers) > + break; > + if (args->appl.mode == APPL_MODE_PING) { > + if (worker_count == num_workers) > + break; > + } > + > + if (args->appl.mode == APPL_MODE_RCV) { > + pkts = odp_atomic_load_u64(&counters.udp); > + if (pkts != 0) This check isn't needed, I want to see how many packets have been received even (especially) if it's 0. > + printf(" total receive(UDP: %" PRIu64 ")\n", > + pkts); > + continue; > + } > + > + if (args->appl.mode == APPL_MODE_PING) { > + pkts = odp_atomic_load_u64(&counters.icmp); > + if (pkts != 0) Same here. > + printf(" total receive(ICMP: %" PRIu64 ")\n", > + pkts); > + } > + > + pkts = odp_atomic_load_u64(&counters.seq); > + printf(" total sent: %" PRIu64 "\n", pkts); > + > + if (args->appl.mode == APPL_MODE_UDP) { Alignment problem here, need another tab. > + pps = (pkts - pkts_prev) / verbose_interval; > + if (pps > maximum_pps) > + maximum_pps = pps; > + printf(" %" PRIu64 " pps, %" PRIu64 " max pps\n", > + pps, maximum_pps); > + } > + > + pkts_prev = pkts; This should go inside the condition above. > + }; Spurious ; > +} > + > /** > * ODP packet example main function > */ > @@ -796,6 +847,8 @@ int main(int argc, char *argv[]) > } > } > > + print_global_stats(num_workers); > + > /* Master thread waits for other threads to exit */ > odph_linux_pthread_join(thread_tbl, num_workers); > > -- > 1.9.1 > -- Stuart. _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp