Reviewed-and-tested-by: Bogdan Pricope <bogdan.pric...@linaro.org>
On 8 February 2017 at 14:19, Petri Savolainen <petri.savolai...@linaro.org> wrote: > User may select number of worker threads (-w) or cpumask (-c) > (but not both) to limit number of worker thread. > > Increased pool size since many threads empty the pool easily and > result some threads to give up (on the first time those see pool > empty). > > Added EXAMPLE_ERR() before abort() to make debugging easier. > > Signed-off-by: Petri Savolainen <petri.savolai...@linaro.org> > --- > example/generator/odp_generator.c | 77 > ++++++++++++++++++++++++++------------- > 1 file changed, 51 insertions(+), 26 deletions(-) > > diff --git a/example/generator/odp_generator.c > b/example/generator/odp_generator.c > index 6ac8f2d..8062d87 100644 > --- a/example/generator/odp_generator.c > +++ b/example/generator/odp_generator.c > @@ -22,10 +22,10 @@ > > #include <odp/helper/odph_api.h> > > -#define MAX_WORKERS 32 /**< max number of works */ > -#define SHM_PKT_POOL_SIZE (512*2048) /**< pkt pool size */ > -#define SHM_PKT_POOL_BUF_SIZE 1856 /**< pkt pool buf size */ > -#define DEFAULT_PKT_INTERVAL 1000 /**< interval btw each pkt */ > +#define MAX_WORKERS 32 /* Max number of workers */ > +#define POOL_NUM_PKT 2048 /* Number of packets in packet pool */ > +#define POOL_PKT_LEN 1856 /* Max packet length */ > +#define DEFAULT_PKT_INTERVAL 1000 /* Interval between each packet */ > > #define APPL_MODE_UDP 0 /**< UDP mode */ > #define APPL_MODE_PING 1 /**< ping mode */ > @@ -41,7 +41,7 @@ > * Parsed command line application arguments > */ > typedef struct { > - int cpu_count; /**< system CPU count */ > + int num_workers; /**< Number of worker thread */ > const char *mask; /**< CPU mask */ > int if_count; /**< Number of interfaces to be used */ > char **if_names; /**< Array of pointers to interface names */ > @@ -383,14 +383,17 @@ static int gen_send_thread(void *arg) > (unsigned int)args->appl.number) > break; > > + pkt = ODP_PACKET_INVALID; > + > if (args->appl.mode == APPL_MODE_UDP) > pkt = pack_udp_pkt(thr_args->pool); > else if (args->appl.mode == APPL_MODE_PING) > pkt = pack_icmp_pkt(thr_args->pool); > - else > - pkt = ODP_PACKET_INVALID; > > - if (!odp_packet_is_valid(pkt)) { > + if (pkt == ODP_PACKET_INVALID) { > + /* Thread gives up as soon as it sees the pool empty. > + * Depending on pool size and transmit latency, it may > + * be normal that pool gets empty sometimes. */ > EXAMPLE_ERR(" [%2i] alloc_single failed\n", thr); > break; > } > @@ -671,13 +674,17 @@ int main(int argc, char *argv[]) > /* Print both system and application information */ > print_info(NO_PATH(argv[0]), &args->appl); > > - /* Default to system CPU count unless user specified */ > + /* Default to max number of workers, unless user specified number of > + * workers or cpumask */ > num_workers = MAX_WORKERS; > - if (args->appl.cpu_count) > - num_workers = args->appl.cpu_count; > - > num_workers = odp_cpumask_default_worker(&cpumask, num_workers); > - if (args->appl.mask) { > + > + if (args->appl.num_workers) { > + /* -w option: number of workers */ > + num_workers = args->appl.num_workers; > + num_workers = odp_cpumask_default_worker(&cpumask, > num_workers); > + } else if (args->appl.mask) { > + /* -c option: cpumask */ > odp_cpumask_from_str(&cpumask, args->appl.mask); > num_workers = odp_cpumask_count(&cpumask); > } > @@ -700,9 +707,9 @@ int main(int argc, char *argv[]) > > /* Create packet pool */ > odp_pool_param_init(¶ms); > - params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; > - params.pkt.len = SHM_PKT_POOL_BUF_SIZE; > - params.pkt.num = SHM_PKT_POOL_SIZE/SHM_PKT_POOL_BUF_SIZE; > + params.pkt.seg_len = POOL_PKT_LEN; > + params.pkt.len = POOL_PKT_LEN; > + params.pkt.num = POOL_NUM_PKT; > params.type = ODP_POOL_PACKET; > > pool = odp_pool_create("packet_pool", ¶ms); > @@ -763,18 +770,24 @@ int main(int argc, char *argv[]) > odp_cpumask_set(&cpu_mask, cpu_first); > > tq = odp_queue_create("", NULL); > - if (tq == ODP_QUEUE_INVALID) > + if (tq == ODP_QUEUE_INVALID) { > + EXAMPLE_ERR("queue_create failed\n"); > abort(); > + } > args->thread[1].pktio_dev = args->appl.if_names[0]; > args->thread[1].pool = pool; > args->thread[1].tp = tp; > args->thread[1].tq = tq; > args->thread[1].tim = odp_timer_alloc(tp, tq, NULL); > - if (args->thread[1].tim == ODP_TIMER_INVALID) > + if (args->thread[1].tim == ODP_TIMER_INVALID) { > + EXAMPLE_ERR("timer_alloc failed\n"); > abort(); > + } > args->thread[1].tmo_ev = odp_timeout_alloc(tmop); > - if (args->thread[1].tmo_ev == ODP_TIMEOUT_INVALID) > + if (args->thread[1].tmo_ev == ODP_TIMEOUT_INVALID) { > + EXAMPLE_ERR("timeout_alloc failed\n"); > abort(); > + } > args->thread[1].mode = args->appl.mode; > > memset(&thr_params, 0, sizeof(thr_params)); > @@ -786,18 +799,24 @@ int main(int argc, char *argv[]) > odph_odpthreads_create(&thread_tbl[1], &cpu_mask, > &thr_params); > > tq = odp_queue_create("", NULL); > - if (tq == ODP_QUEUE_INVALID) > + if (tq == ODP_QUEUE_INVALID) { > + EXAMPLE_ERR("queue_create failed\n"); > abort(); > + } > args->thread[0].pktio_dev = args->appl.if_names[0]; > args->thread[0].pool = pool; > args->thread[0].tp = tp; > args->thread[0].tq = tq; > args->thread[0].tim = odp_timer_alloc(tp, tq, NULL); > - if (args->thread[0].tim == ODP_TIMER_INVALID) > + if (args->thread[0].tim == ODP_TIMER_INVALID) { > + EXAMPLE_ERR("timer_alloc failed\n"); > abort(); > + } > args->thread[0].tmo_ev = odp_timeout_alloc(tmop); > - if (args->thread[0].tmo_ev == ODP_TIMEOUT_INVALID) > + if (args->thread[0].tmo_ev == ODP_TIMEOUT_INVALID) { > + EXAMPLE_ERR("timeout_alloc failed\n"); > abort(); > + } > args->thread[0].mode = args->appl.mode; > cpu_next = odp_cpumask_next(&cpumask, cpu_first); > odp_cpumask_zero(&cpu_mask); > @@ -819,17 +838,23 @@ int main(int argc, char *argv[]) > > args->thread[i].pktio_dev = > args->appl.if_names[if_idx]; > tq = odp_queue_create("", NULL); > - if (tq == ODP_QUEUE_INVALID) > + if (tq == ODP_QUEUE_INVALID) { > + EXAMPLE_ERR("queue_create failed\n"); > abort(); > + } > args->thread[i].pool = pool; > args->thread[i].tp = tp; > args->thread[i].tq = tq; > args->thread[i].tim = odp_timer_alloc(tp, tq, NULL); > - if (args->thread[i].tim == ODP_TIMER_INVALID) > + if (args->thread[i].tim == ODP_TIMER_INVALID) { > + EXAMPLE_ERR("timer_alloc failed\n"); > abort(); > + } > args->thread[i].tmo_ev = odp_timeout_alloc(tmop); > - if (args->thread[i].tmo_ev == ODP_TIMEOUT_INVALID) > + if (args->thread[i].tmo_ev == ODP_TIMEOUT_INVALID) { > + EXAMPLE_ERR("timeout_alloc failed\n"); > abort(); > + } > args->thread[i].mode = args->appl.mode; > > if (args->appl.mode == APPL_MODE_UDP) { > @@ -955,7 +980,7 @@ static void parse_args(int argc, char *argv[], > appl_args_t *appl_args) > > switch (opt) { > case 'w': > - appl_args->cpu_count = atoi(optarg); > + appl_args->num_workers = atoi(optarg); > break; > case 'c': > appl_args->mask = optarg; > -- > 2.8.1 >