Message ID | 1439369712-21540-1-git-send-email-balakrishna.garapati@linaro.org |
---|---|
State | New |
Headers | show |
Reviewed-by: Maxim Uvarov <maxim.uvarov@linaro.org> That version looks good for me. Stuart, do you have something to add? Maxim. On 08/12/15 11:55, Balakrishna.Garapati wrote: > Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org> > --- > validate cpumask from parse_args and exit with a message > > example/generator/odp_generator.c | 72 ++++++++++++++++++++++++++++----------- > 1 file changed, 52 insertions(+), 20 deletions(-) > > diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c > index bdee222..2ad4e27 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,26 @@ 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; > - > - /* Get default worker cpumask */ > num_workers = odp_cpumask_def_worker(&cpumask, num_workers); > + if (args->appl.mask) { > + odp_cpumask_from_str(&cpumask, args->appl.mask); > + num_workers = odp_cpumask_count(&cpumask); > + } > + > (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 +713,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 +735,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 +752,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 +837,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 +857,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 +866,21 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) > case 'w': > appl_args->cpu_count = atoi(optarg); > break; > + case 'c': > + odp_cpumask_t cpumask, cpumask_args, cpumask_and; > + int num_workers; > + > + appl_args->mask = optarg; > + odp_cpumask_from_str(&cpumask_args, args->appl.mask); > + num_workers = odp_cpumask_def_worker(&cpumask, 0); > + odp_cpumask_and(&cpumask_and, &cpumask_args, &cpumask); > + if (odp_cpumask_count(&cpumask_and) < > + odp_cpumask_count(&cpumask_args)) { > + EXAMPLE_ERR("Wrong cpu mask, max cpu's:%d\n", > + num_workers); > + exit(EXIT_FAILURE); > + } > + break; > /* parse packet-io interface names */ > case 'I': > len = strlen(optarg); > @@ -920,7 +949,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 +963,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; > > @@ -1027,20 +1056,23 @@ static void usage(char *progname) > " 2.receive udp packets\n" > " odp_generator -I eth0 -m r\n" > " 3.work likes ping\n" > - " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 -m p\n" > + " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 --cpumask 0xc -m p\n" > "\n" > "Mandatory OPTIONS:\n" > " -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"
On Wed, Aug 12, 2015 at 10:55:12AM +0200, Balakrishna.Garapati wrote: > Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org> > --- > validate cpumask from parse_args and exit with a message > > example/generator/odp_generator.c | 72 ++++++++++++++++++++++++++++----------- > 1 file changed, 52 insertions(+), 20 deletions(-) > > diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c > index bdee222..2ad4e27 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 */ In my previous comment I was asking to replace the text "core mask" with "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,26 @@ 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; > - > - /* Get default worker cpumask */ > num_workers = odp_cpumask_def_worker(&cpumask, num_workers); > + if (args->appl.mask) { > + odp_cpumask_from_str(&cpumask, args->appl.mask); > + num_workers = odp_cpumask_count(&cpumask); > + } > + > (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 +713,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 +735,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 +752,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 +837,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 +857,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 +866,21 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) > case 'w': > appl_args->cpu_count = atoi(optarg); > break; > + case 'c': > + odp_cpumask_t cpumask, cpumask_args, cpumask_and; > + int num_workers; > + > + appl_args->mask = optarg; > + odp_cpumask_from_str(&cpumask_args, args->appl.mask); > + num_workers = odp_cpumask_def_worker(&cpumask, 0); > + odp_cpumask_and(&cpumask_and, &cpumask_args, &cpumask); > + if (odp_cpumask_count(&cpumask_and) < > + odp_cpumask_count(&cpumask_args)) { > + EXAMPLE_ERR("Wrong cpu mask, max cpu's:%d\n", > + num_workers); > + exit(EXIT_FAILURE); > + } > + break; > /* parse packet-io interface names */ > case 'I': > len = strlen(optarg); > @@ -920,7 +949,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 +963,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; > > @@ -1027,20 +1056,23 @@ static void usage(char *progname) > " 2.receive udp packets\n" > " odp_generator -I eth0 -m r\n" > " 3.work likes ping\n" > - " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 -m p\n" > + " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 --cpumask 0xc -m p\n" > "\n" > "Mandatory OPTIONS:\n" > " -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" These are listed under mandatory options but in fact many of them are optional. > "\n" > "Optional OPTIONS\n" > " -h, --help Display help and exit.\n" > -- > 1.9.1 >
Fixed all the comments in PATCHv8. On 19 August 2015 at 11:49, Stuart Haslam <stuart.haslam@linaro.org> wrote: > On Wed, Aug 12, 2015 at 10:55:12AM +0200, Balakrishna.Garapati wrote: > > Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org> > > --- > > validate cpumask from parse_args and exit with a message > > > > example/generator/odp_generator.c | 72 > ++++++++++++++++++++++++++++----------- > > 1 file changed, 52 insertions(+), 20 deletions(-) > > > > diff --git a/example/generator/odp_generator.c > b/example/generator/odp_generator.c > > index bdee222..2ad4e27 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 */ > > In my previous comment I was asking to replace the text "core mask" with > "CPU mask". > Fixed the comment in PATCHv8 > > > 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,26 @@ 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; > > - > > - /* Get default worker cpumask */ > > num_workers = odp_cpumask_def_worker(&cpumask, num_workers); > > + if (args->appl.mask) { > > + odp_cpumask_from_str(&cpumask, args->appl.mask); > > + num_workers = odp_cpumask_count(&cpumask); > > + } > > + > > (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 +713,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 +735,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 +752,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 +837,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 +857,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 +866,21 @@ static void parse_args(int argc, char *argv[], > appl_args_t *appl_args) > > case 'w': > > appl_args->cpu_count = atoi(optarg); > > break; > > + case 'c': > > + odp_cpumask_t cpumask, cpumask_args, cpumask_and; > > + int num_workers; > > + > > + appl_args->mask = optarg; > > + odp_cpumask_from_str(&cpumask_args, > args->appl.mask); > > + num_workers = odp_cpumask_def_worker(&cpumask, 0); > > + odp_cpumask_and(&cpumask_and, &cpumask_args, > &cpumask); > > + if (odp_cpumask_count(&cpumask_and) < > > + odp_cpumask_count(&cpumask_args)) { > > + EXAMPLE_ERR("Wrong cpu mask, max > cpu's:%d\n", > > + num_workers); > > + exit(EXIT_FAILURE); > > + } > > + break; > > /* parse packet-io interface names */ > > case 'I': > > len = strlen(optarg); > > @@ -920,7 +949,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 +963,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; > > > > @@ -1027,20 +1056,23 @@ static void usage(char *progname) > > " 2.receive udp packets\n" > > " odp_generator -I eth0 -m r\n" > > " 3.work likes ping\n" > > - " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 > --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 -m p\n" > > + " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 > --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 > --cpumask 0xc -m p\n" > > "\n" > > "Mandatory OPTIONS:\n" > > " -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" > > These are listed under mandatory options but in fact many of them are > optional. > Moved optional args from MANDATORY > > > "\n" > > "Optional OPTIONS\n" > > " -h, --help Display help and exit.\n" > > -- > > 1.9.1 > > > > -- > Stuart. >
diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index bdee222..2ad4e27 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,26 @@ 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; - - /* Get default worker cpumask */ num_workers = odp_cpumask_def_worker(&cpumask, num_workers); + if (args->appl.mask) { + odp_cpumask_from_str(&cpumask, args->appl.mask); + num_workers = odp_cpumask_count(&cpumask); + } + (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 +713,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 +735,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 +752,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 +837,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 +857,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 +866,21 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) case 'w': appl_args->cpu_count = atoi(optarg); break; + case 'c': + odp_cpumask_t cpumask, cpumask_args, cpumask_and; + int num_workers; + + appl_args->mask = optarg; + odp_cpumask_from_str(&cpumask_args, args->appl.mask); + num_workers = odp_cpumask_def_worker(&cpumask, 0); + odp_cpumask_and(&cpumask_and, &cpumask_args, &cpumask); + if (odp_cpumask_count(&cpumask_and) < + odp_cpumask_count(&cpumask_args)) { + EXAMPLE_ERR("Wrong cpu mask, max cpu's:%d\n", + num_workers); + exit(EXIT_FAILURE); + } + break; /* parse packet-io interface names */ case 'I': len = strlen(optarg); @@ -920,7 +949,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 +963,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; @@ -1027,20 +1056,23 @@ static void usage(char *progname) " 2.receive udp packets\n" " odp_generator -I eth0 -m r\n" " 3.work likes ping\n" - " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 -m p\n" + " odp_generator -I eth0 --srcmac fe:0f:97:c9:e0:44 --dstmac 32:cb:9b:27:2f:1a --srcip 192.168.0.1 --dstip 192.168.0.2 --cpumask 0xc -m p\n" "\n" "Mandatory OPTIONS:\n" " -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"
Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org> --- validate cpumask from parse_args and exit with a message example/generator/odp_generator.c | 72 ++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 20 deletions(-)