diff mbox

[PATCHv7] example:generator:option to supply core mask

Message ID 1439369712-21540-1-git-send-email-balakrishna.garapati@linaro.org
State New
Headers show

Commit Message

Balakrishna Garapati Aug. 12, 2015, 8:55 a.m. UTC
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(-)

Comments

Maxim Uvarov Aug. 12, 2015, 9:14 a.m. UTC | #1
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(&params, 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"
Stuart Haslam Aug. 19, 2015, 9:49 a.m. UTC | #2
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(&params, 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
>
Balakrishna Garapati Aug. 19, 2015, 11:06 a.m. UTC | #3
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(&params, 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 mbox

Patch

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(&params, 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"