I will make another patch v5 with the changes. On 7 August 2015 at 16:24, Maxim Uvarov <maxim.uva...@linaro.org> wrote:
> Balakrishna, > > please also update usage() how to use thread mask here. And please find > one commend inside. > > Best regards, > Maxim. > > > On 08/05/15 21:09, Balakrishna.Garapati wrote: > >> Signed-off-by: Balakrishna.Garapati <balakrishna.garap...@linaro.org> >> --- >> Fixed the comments >> >> example/generator/odp_generator.c | 59 >> ++++++++++++++++++++++++++------------- >> 1 file changed, 40 insertions(+), 19 deletions(-) >> >> diff --git a/example/generator/odp_generator.c >> b/example/generator/odp_generator.c >> index bdee222..e364afa 100644 >> --- a/example/generator/odp_generator.c >> +++ b/example/generator/odp_generator.c >> @@ -43,6 +43,7 @@ >> */ >> typedef struct { >> int cpu_count; /**< system CPU count */ >> + const char *mask; /**< s/core mask/CPU mask */ >> int if_count; /**< Number of interfaces to be used */ >> char **if_names; /**< Array of pointers to interface names >> */ >> char *if_str; /**< Storage for interface names */ >> @@ -645,18 +646,27 @@ int main(int argc, char *argv[]) >> if (args->appl.cpu_count) >> num_workers = args->appl.cpu_count; >> - /* ping mode need two worker */ >> - if (args->appl.mode == APPL_MODE_PING) >> - num_workers = 2; >> + if (args->appl.mask) { >> + odp_cpumask_from_str(&cpumask, args->appl.mask); >> + num_workers = odp_cpumask_count(&cpumask); >> > here you got number mask from cmdline, convert it to count, but did not > check that this count less then MAX_CPUS. So on access to > array here might be seg. fault. You can check it here or in page_args(). > > + } else { >> + num_workers = odp_cpumask_def_worker(&cpumask, >> num_workers); >> > > or call above function in both cases. > > > > + } >> - /* Get default worker cpumask */ >> - num_workers = odp_cpumask_def_worker(&cpumask, num_workers); >> (void)odp_cpumask_to_str(&cpumask, cpumaskstr, >> sizeof(cpumaskstr)); >> printf("num worker threads: %i\n", num_workers); >> printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); >> printf("cpu mask: %s\n", cpumaskstr); >> + /* ping mode need two workers */ >> + if (args->appl.mode == APPL_MODE_PING) { >> + if (num_workers < 2) { >> + EXAMPLE_ERR("Need at least two worker threads\n"); >> + exit(EXIT_FAILURE); >> + } >> + } >> + >> /* Create packet pool */ >> memset(¶ms, 0, sizeof(params)); >> params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; >> @@ -704,12 +714,13 @@ int main(int argc, char *argv[]) >> memset(thread_tbl, 0, sizeof(thread_tbl)); >> if (args->appl.mode == APPL_MODE_PING) { >> - odp_cpumask_t cpu0_mask; >> + odp_cpumask_t cpu_mask; >> odp_queue_t tq; >> + int cpu_first, cpu_next; >> - /* Previous code forced both threads to CPU 0 */ >> - odp_cpumask_zero(&cpu0_mask); >> - odp_cpumask_set(&cpu0_mask, 0); >> + odp_cpumask_zero(&cpu_mask); >> + cpu_first = odp_cpumask_first(&cpumask); >> + odp_cpumask_set(&cpu_mask, cpu_first); >> tq = odp_queue_create("", ODP_QUEUE_TYPE_POLL, NULL); >> if (tq == ODP_QUEUE_INVALID) >> @@ -725,7 +736,7 @@ int main(int argc, char *argv[]) >> if (args->thread[1].tmo_ev == ODP_TIMEOUT_INVALID) >> abort(); >> args->thread[1].mode = args->appl.mode; >> - odph_linux_pthread_create(&thread_tbl[1], &cpu0_mask, >> + odph_linux_pthread_create(&thread_tbl[1], &cpu_mask, >> gen_recv_thread, >> &args->thread[1]); >> tq = odp_queue_create("", ODP_QUEUE_TYPE_POLL, NULL); >> @@ -742,7 +753,10 @@ int main(int argc, char *argv[]) >> if (args->thread[0].tmo_ev == ODP_TIMEOUT_INVALID) >> abort(); >> args->thread[0].mode = args->appl.mode; >> - odph_linux_pthread_create(&thread_tbl[0], &cpu0_mask, >> + cpu_next = odp_cpumask_next(&cpumask, cpu_first); >> + odp_cpumask_zero(&cpu_mask); >> + odp_cpumask_set(&cpu_mask, cpu_next); >> + odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, >> gen_send_thread, >> &args->thread[0]); >> /* only wait send thread to join */ >> @@ -824,11 +838,12 @@ static void parse_args(int argc, char *argv[], >> appl_args_t *appl_args) >> static struct option longopts[] = { >> {"interface", required_argument, NULL, 'I'}, >> {"workers", required_argument, NULL, 'w'}, >> + {"cpumask", required_argument, NULL, 'c'}, >> {"srcmac", required_argument, NULL, 'a'}, >> {"dstmac", required_argument, NULL, 'b'}, >> - {"srcip", required_argument, NULL, 'c'}, >> + {"srcip", required_argument, NULL, 's'}, >> {"dstip", required_argument, NULL, 'd'}, >> - {"packetsize", required_argument, NULL, 's'}, >> + {"packetsize", required_argument, NULL, 'p'}, >> {"mode", required_argument, NULL, 'm'}, >> {"count", required_argument, NULL, 'n'}, >> {"timeout", required_argument, NULL, 't'}, >> @@ -843,8 +858,8 @@ static void parse_args(int argc, char *argv[], >> appl_args_t *appl_args) >> appl_args->timeout = -1; >> while (1) { >> - opt = getopt_long(argc, argv, "+I:a:b:c:d:s:i:m:n:t:w:h", >> - longopts, &long_index); >> + opt = getopt_long(argc, argv, >> "+I:a:b:s:d:p:i:m:n:t:w:c:h", >> + longopts, &long_index); >> if (opt == -1) >> break; /* No more options */ >> @@ -852,6 +867,9 @@ static void parse_args(int argc, char *argv[], >> appl_args_t *appl_args) >> case 'w': >> appl_args->cpu_count = atoi(optarg); >> break; >> + case 'c': >> + appl_args->mask = optarg; >> + break; >> /* parse packet-io interface names */ >> case 'I': >> len = strlen(optarg); >> @@ -920,7 +938,7 @@ static void parse_args(int argc, char *argv[], >> appl_args_t *appl_args) >> } >> break; >> - case 'c': >> + case 's': >> if (scan_ip(optarg, &appl_args->srcip) != 1) { >> EXAMPLE_ERR("wrong src ip:%s\n", optarg); >> exit(EXIT_FAILURE); >> @@ -934,7 +952,7 @@ static void parse_args(int argc, char *argv[], >> appl_args_t *appl_args) >> } >> break; >> - case 's': >> + case 'p': >> appl_args->payload = atoi(optarg); >> break; >> @@ -1033,14 +1051,17 @@ static void usage(char *progname) >> " -I, --interface Eth interfaces (comma-separated, no >> spaces)\n" >> " -a, --srcmac src mac address\n" >> " -b, --dstmac dst mac address\n" >> - " -c, --srcip src ip address\n" >> + " -s, --srcip src ip address\n" >> " -d, --dstip dst ip address\n" >> - " -s, --packetsize payload length of the packets\n" >> + " -p, --packetsize payload length of the packets\n" >> " -m, --mode work mode: send udp(u), receive(r), send >> icmp(p)\n" >> " -n, --count the number of packets to be send\n" >> " -t, --timeout only for ping mode, wait ICMP reply >> timeout seconds\n" >> " -i, --interval wait interval ms between sending each >> packet\n" >> " default is 1000ms. 0 for flood mode\n" >> + " -w, --workers specify number of workers need to be >> assigned to application\n" >> + " default is to assign all\n" >> + " -c, --cpumask to set on cores\n" >> "\n" >> "Optional OPTIONS\n" >> " -h, --help Display help and exit.\n" >> > >
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp