diff mbox

example:generator:option to supply core mask

Message ID 1438243366-588-1-git-send-email-balakrishna.garapati@linaro.org
State Accepted
Commit a1e62a98b2d30aef7db18f68c4c905f20695316f
Headers show

Commit Message

Balakrishna Garapati July 30, 2015, 8:02 a.m. UTC
Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org>
---
 This patch also includes changes to enable the option to support number of workers.
 example/generator/odp_generator.c | 35 +++++++++++++++++++++++++++++------
 1 file changed, 29 insertions(+), 6 deletions(-)

Comments

Balakrishna Garapati July 30, 2015, 8:48 a.m. UTC | #1
just for the info, This patch only enables and sets the cpu masks
correctly. Still working on the patch to fix the PING mode to run on the
supplied cpu mask instead of hard coded cpu0.

On 30 July 2015 at 10:02, Balakrishna.Garapati <
balakrishna.garapati@linaro.org> wrote:

> Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org>
> ---
>  This patch also includes changes to enable the option to support number
> of workers.
>  example/generator/odp_generator.c | 35 +++++++++++++++++++++++++++++------
>  1 file changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/example/generator/odp_generator.c
> b/example/generator/odp_generator.c
> index d6ec758..08cd577 100644
> --- a/example/generator/odp_generator.c
> +++ b/example/generator/odp_generator.c
> @@ -42,6 +42,7 @@
>   */
>  typedef struct {
>         int cpu_count;          /**< system CPU count */
> +       const char *mask;       /**< core 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 */
> @@ -633,18 +634,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) {
> +               (void)odp_cpumask_from_str(&cpumask, args->appl.mask);
> +               num_workers = odp_cpumask_count(&cpumask);
> +       } else {
> +               num_workers = odp_cpumask_def_worker(&cpumask,
> num_workers);
> +       }
>
> -       /* 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(&params, 0, sizeof(params));
>         params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
> @@ -812,6 +822,7 @@ 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'},
> +               {"coremask", required_argument, NULL, 'k'},
>                 {"srcmac", required_argument, NULL, 'a'},
>                 {"dstmac", required_argument, NULL, 'b'},
>                 {"srcip", required_argument, NULL, 'c'},
> @@ -831,7 +842,7 @@ 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",
> +               opt = getopt_long(argc, argv, "+I:a:b:c:d:s:i:m:n:t:w:k:h",
>                                         longopts, &long_index);
>                 if (opt == -1)
>                         break;  /* No more options */
> @@ -840,6 +851,15 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
>                 case 'w':
>                         appl_args->cpu_count = atoi(optarg);
>                         break;
> +               case 'k':
> +                       len = strlen(optarg);
> +                       if (len == 0) {
> +                               usage(argv[0]);
> +                               exit(EXIT_FAILURE);
> +                       }
> +
> +                       appl_args->mask = optarg;
> +                       break;
>                 /* parse packet-io interface names */
>                 case 'I':
>                         len = strlen(optarg);
> @@ -1029,6 +1049,9 @@ static void usage(char *progname)
>                "  -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"
> +              "  -k, --coremask to set on cores\n"
>                "\n"
>                "Optional OPTIONS\n"
>                "  -h, --help       Display help and exit.\n"
> --
> 1.9.1
>
>
Stuart Haslam July 30, 2015, 10:58 a.m. UTC | #2
On Thu, Jul 30, 2015 at 10:02:46AM +0200, Balakrishna.Garapati wrote:
> Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org>
> ---
>  This patch also includes changes to enable the option to support number of workers.
>  example/generator/odp_generator.c | 35 +++++++++++++++++++++++++++++------
>  1 file changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c
> index d6ec758..08cd577 100644
> --- a/example/generator/odp_generator.c
> +++ b/example/generator/odp_generator.c
> @@ -42,6 +42,7 @@
>   */
>  typedef struct {
>  	int cpu_count;		/**< system CPU count */
> +	const char *mask;	/**< core 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 */
> @@ -633,18 +634,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) {
> +		(void)odp_cpumask_from_str(&cpumask, args->appl.mask);
> +		num_workers = odp_cpumask_count(&cpumask);
> +	} else {
> +		num_workers = odp_cpumask_def_worker(&cpumask, num_workers);
> +	}
>  
> -	/* 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(&params, 0, sizeof(params));
>  	params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
> @@ -812,6 +822,7 @@ 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'},
> +		{"coremask", required_argument, NULL, 'k'},

It would be better to use -c for coremask, on the assumption that we'll
need to add the same to other examples and it's much more intuitive. I
see that will mean needing to change the srcip short name, but it's
fairly arbitrary as it is (a, b, c, d) and everyone seems to use the
long name anyway.

>  		{"srcmac", required_argument, NULL, 'a'},
>  		{"dstmac", required_argument, NULL, 'b'},
>  		{"srcip", required_argument, NULL, 'c'},
> @@ -831,7 +842,7 @@ 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",
> +		opt = getopt_long(argc, argv, "+I:a:b:c:d:s:i:m:n:t:w:k:h",
>  					longopts, &long_index);
>  		if (opt == -1)
>  			break;	/* No more options */
> @@ -840,6 +851,15 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
>  		case 'w':
>  			appl_args->cpu_count = atoi(optarg);
>  			break;
> +		case 'k':
> +			len = strlen(optarg);
> +			if (len == 0) {

Can this actually happen? won't getopt fail if you don't provide an
argument?

> +				usage(argv[0]);
> +				exit(EXIT_FAILURE);
> +			}
> +
> +			appl_args->mask = optarg;
> +			break;
>  		/* parse packet-io interface names */
>  		case 'I':
>  			len = strlen(optarg);
> @@ -1029,6 +1049,9 @@ static void usage(char *progname)
>  	       "  -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"
> +	       "  -k, --coremask to set on cores\n"
>  	       "\n"
>  	       "Optional OPTIONS\n"
>  	       "  -h, --help       Display help and exit.\n"
> -- 
> 1.9.1
>
Balakrishna Garapati July 30, 2015, 11:05 a.m. UTC | #3
I agree. I can make the changes.

On 30 July 2015 at 12:58, Stuart Haslam <stuart.haslam@linaro.org> wrote:

> On Thu, Jul 30, 2015 at 10:02:46AM +0200, Balakrishna.Garapati wrote:
> > Signed-off-by: Balakrishna.Garapati <balakrishna.garapati@linaro.org>
> > ---
> >  This patch also includes changes to enable the option to support number
> of workers.
> >  example/generator/odp_generator.c | 35
> +++++++++++++++++++++++++++++------
> >  1 file changed, 29 insertions(+), 6 deletions(-)
> >
> > diff --git a/example/generator/odp_generator.c
> b/example/generator/odp_generator.c
> > index d6ec758..08cd577 100644
> > --- a/example/generator/odp_generator.c
> > +++ b/example/generator/odp_generator.c
> > @@ -42,6 +42,7 @@
> >   */
> >  typedef struct {
> >       int cpu_count;          /**< system CPU count */
> > +     const char *mask;       /**< core 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 */
> > @@ -633,18 +634,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) {
> > +             (void)odp_cpumask_from_str(&cpumask, args->appl.mask);
> > +             num_workers = odp_cpumask_count(&cpumask);
> > +     } else {
> > +             num_workers = odp_cpumask_def_worker(&cpumask,
> num_workers);
> > +     }
> >
> > -     /* 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(&params, 0, sizeof(params));
> >       params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
> > @@ -812,6 +822,7 @@ 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'},
> > +             {"coremask", required_argument, NULL, 'k'},
>
> It would be better to use -c for coremask, on the assumption that we'll
> need to add the same to other examples and it's much more intuitive. I
> see that will mean needing to change the srcip short name, but it's
> fairly arbitrary as it is (a, b, c, d) and everyone seems to use the
> long name anyway.
>
> >               {"srcmac", required_argument, NULL, 'a'},
> >               {"dstmac", required_argument, NULL, 'b'},
> >               {"srcip", required_argument, NULL, 'c'},
> > @@ -831,7 +842,7 @@ 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",
> > +             opt = getopt_long(argc, argv, "+I:a:b:c:d:s:i:m:n:t:w:k:h",
> >                                       longopts, &long_index);
> >               if (opt == -1)
> >                       break;  /* No more options */
> > @@ -840,6 +851,15 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
> >               case 'w':
> >                       appl_args->cpu_count = atoi(optarg);
> >                       break;
> > +             case 'k':
> > +                     len = strlen(optarg);
> > +                     if (len == 0) {
>
> Can this actually happen? won't getopt fail if you don't provide an
> argument?
>
> > +                             usage(argv[0]);
> > +                             exit(EXIT_FAILURE);
> > +                     }
> > +
> > +                     appl_args->mask = optarg;
> > +                     break;
> >               /* parse packet-io interface names */
> >               case 'I':
> >                       len = strlen(optarg);
> > @@ -1029,6 +1049,9 @@ static void usage(char *progname)
> >              "  -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"
> > +            "  -k, --coremask to set on cores\n"
> >              "\n"
> >              "Optional OPTIONS\n"
> >              "  -h, --help       Display help and exit.\n"
> > --
> > 1.9.1
> >
>
diff mbox

Patch

diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c
index d6ec758..08cd577 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -42,6 +42,7 @@ 
  */
 typedef struct {
 	int cpu_count;		/**< system CPU count */
+	const char *mask;	/**< core 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 */
@@ -633,18 +634,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) {
+		(void)odp_cpumask_from_str(&cpumask, args->appl.mask);
+		num_workers = odp_cpumask_count(&cpumask);
+	} else {
+		num_workers = odp_cpumask_def_worker(&cpumask, num_workers);
+	}
 
-	/* 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(&params, 0, sizeof(params));
 	params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
@@ -812,6 +822,7 @@  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'},
+		{"coremask", required_argument, NULL, 'k'},
 		{"srcmac", required_argument, NULL, 'a'},
 		{"dstmac", required_argument, NULL, 'b'},
 		{"srcip", required_argument, NULL, 'c'},
@@ -831,7 +842,7 @@  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",
+		opt = getopt_long(argc, argv, "+I:a:b:c:d:s:i:m:n:t:w:k:h",
 					longopts, &long_index);
 		if (opt == -1)
 			break;	/* No more options */
@@ -840,6 +851,15 @@  static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
 		case 'w':
 			appl_args->cpu_count = atoi(optarg);
 			break;
+		case 'k':
+			len = strlen(optarg);
+			if (len == 0) {
+				usage(argv[0]);
+				exit(EXIT_FAILURE);
+			}
+
+			appl_args->mask = optarg;
+			break;
 		/* parse packet-io interface names */
 		case 'I':
 			len = strlen(optarg);
@@ -1029,6 +1049,9 @@  static void usage(char *progname)
 	       "  -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"
+	       "  -k, --coremask to set on cores\n"
 	       "\n"
 	       "Optional OPTIONS\n"
 	       "  -h, --help       Display help and exit.\n"