example: hello: do not pin control thread

Message ID 20170113132529.25320-1-maxim.uvarov@linaro.org
State New
Headers show

Commit Message

Maxim Uvarov Jan. 13, 2017, 1:25 p.m.
hello word app should not use any linux specific
things. Pinning thread to core is also optional
and should not be in minimal app. This also fixes
bug with cgroups env where core 0 is not available.

Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>

---
 example/hello/odp_hello.c | 29 ++---------------------------
 1 file changed, 2 insertions(+), 27 deletions(-)

-- 
2.11.0.295.gd7dffce

Comments

Mike Holmes Jan. 13, 2017, 3:31 p.m. | #1
I still feel that we need to show a user how we expect ODP to be used on
Linux.

I hate to hold things up, and agree hello world needs to be minimal, but if
we delete this then will there be any drive to add an example showing how
we pin control and workers - CC Ravineet directly as he is workign in this
area.
I think we do need to close the door here and have a clear example in ODP
on running ODP in the highest performance way.

Mike

On 13 January 2017 at 08:25, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

> hello word app should not use any linux specific

> things. Pinning thread to core is also optional

> and should not be in minimal app. This also fixes

> bug with cgroups env where core 0 is not available.

>

> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>

> ---

>  example/hello/odp_hello.c | 29 ++---------------------------

>  1 file changed, 2 insertions(+), 27 deletions(-)

>

> diff --git a/example/hello/odp_hello.c b/example/hello/odp_hello.c

> index 6d114eea..0b75b58f 100644

> --- a/example/hello/odp_hello.c

> +++ b/example/hello/odp_hello.c

> @@ -10,21 +10,12 @@

>   * anything else than the ODP API header file.

>   */

>

> -/* Linux CPU affinity */

> -#define _GNU_SOURCE

> -#include <sched.h>

> -

> -/* Linux PID */

> -#include <sys/types.h>

> -#include <unistd.h>

> -

>  #include <stdio.h>

>  #include <string.h>

>

>  #include <odp_api.h>

>

>  typedef struct {

> -       int cpu;

>         int num;

>  } options_t;

>

> @@ -36,17 +27,12 @@ static int parse_args(int argc, char *argv[],

> options_t *opt)

>         for (i = 1; i < argc; i++) {

>                 if ((strcmp(argv[i], args[0]) == 0) &&

>                     (sscanf(argv[i + 1], "%i", &tmp) == 1)) {

> -                       opt->cpu = tmp;

> -                       i++;

> -               } else if ((strcmp(argv[i], args[1]) == 0) &&

> -                          (sscanf(argv[i + 1], "%i", &tmp) == 1)) {

>                         opt->num = tmp;

>                         i++;

>                 } else {

>                         printf("\nUsage:\n"

> -                              "  %s  CPU number\n"

>                                "  %s  Number of iterations\n\n",

> -                              args[0], args[1]);

> +                              args[0]);

>                         return -1;

>                 }

>         }

> @@ -58,26 +44,14 @@ int main(int argc, char *argv[])

>  {

>         odp_instance_t inst;

>         options_t opt;

> -       pid_t pid;

> -       cpu_set_t cpu_set;

>         int i;

>

>         memset(&opt, 0, sizeof(opt));

> -       opt.cpu = 0;

>         opt.num = 1;

>

>         if (parse_args(argc, argv, &opt))

>                 return -1;

>

> -       pid = getpid();

> -       CPU_ZERO(&cpu_set);

> -       CPU_SET(opt.cpu, &cpu_set);

> -

> -       if (sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set)) {

> -               printf("Set CPU affinity failed.\n");

> -               return -1;

> -       }

> -

>         if (odp_init_global(&inst, NULL, NULL)) {

>                 printf("Global init failed.\n");

>                 return -1;

> @@ -85,6 +59,7 @@ int main(int argc, char *argv[])

>

>         if (odp_init_local(inst, ODP_THREAD_CONTROL)) {

>                 printf("Local init failed.\n");

> +               (void)odp_term_global(inst);

>                 return -1;

>         }

>

> --

> 2.11.0.295.gd7dffce

>

>



-- 
Mike Holmes
Program Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
"Work should be fun and collaborative, the rest follows"
Maxim Uvarov Jan. 13, 2017, 4:50 p.m. | #2
On 01/13/17 18:31, Mike Holmes wrote:
> I still feel that we need to show a user how we expect ODP to be used on

> Linux.

> 

> I hate to hold things up, and agree hello world needs to be minimal, but

> if we delete this then will there be any drive to add an example showing

> how we pin control and workers - CC Ravineet directly as he is workign

> in this area.

> I think we do need to close the door here and have a clear example in

> ODP on running ODP in the highest performance way.

> 

> Mike

> 



Mike, here I replied with patch how pinning has to be done:

https://lists.linaro.org/pipermail/lng-odp/2017-January/027625.html

but if you read app description:

/* This is a minimal application which demonstrates the startup and shutdown
 * steps of an ODP application. It can be also used to debug API related
 * build problems, etc. It does not use helpers to minimize dependency to
 * anything else than the ODP API header file.
 */


There is no any works about pining thread. That is not needed for odp.
If you have only 1 cpu that is not needed. You can pin single thread app
like that with command "taskset 0x1 ./app". So there is no any reason
for that.

Maxim.


> On 13 January 2017 at 08:25, Maxim Uvarov <maxim.uvarov@linaro.org

> <mailto:maxim.uvarov@linaro.org>> wrote:

> 

>     hello word app should not use any linux specific

>     things. Pinning thread to core is also optional

>     and should not be in minimal app. This also fixes

>     bug with cgroups env where core 0 is not available.

> 

>     Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org

>     <mailto:maxim.uvarov@linaro.org>>

>     ---

>      example/hello/odp_hello.c | 29 ++---------------------------

>      1 file changed, 2 insertions(+), 27 deletions(-)

> 

>     diff --git a/example/hello/odp_hello.c b/example/hello/odp_hello.c

>     index 6d114eea..0b75b58f 100644

>     --- a/example/hello/odp_hello.c

>     +++ b/example/hello/odp_hello.c

>     @@ -10,21 +10,12 @@

>       * anything else than the ODP API header file.

>       */

> 

>     -/* Linux CPU affinity */

>     -#define _GNU_SOURCE

>     -#include <sched.h>

>     -

>     -/* Linux PID */

>     -#include <sys/types.h>

>     -#include <unistd.h>

>     -

>      #include <stdio.h>

>      #include <string.h>

> 

>      #include <odp_api.h>

> 

>      typedef struct {

>     -       int cpu;

>             int num;

>      } options_t;

> 

>     @@ -36,17 +27,12 @@ static int parse_args(int argc, char *argv[],

>     options_t *opt)

>             for (i = 1; i < argc; i++) {

>                     if ((strcmp(argv[i], args[0]) == 0) &&

>                         (sscanf(argv[i + 1], "%i", &tmp) == 1)) {

>     -                       opt->cpu = tmp;

>     -                       i++;

>     -               } else if ((strcmp(argv[i], args[1]) == 0) &&

>     -                          (sscanf(argv[i + 1], "%i", &tmp) == 1)) {

>                             opt->num = tmp;

>                             i++;

>                     } else {

>                             printf("\nUsage:\n"

>     -                              "  %s  CPU number\n"

>                                    "  %s  Number of iterations\n\n",

>     -                              args[0], args[1]);

>     +                              args[0]);

>                             return -1;

>                     }

>             }

>     @@ -58,26 +44,14 @@ int main(int argc, char *argv[])

>      {

>             odp_instance_t inst;

>             options_t opt;

>     -       pid_t pid;

>     -       cpu_set_t cpu_set;

>             int i;

> 

>             memset(&opt, 0, sizeof(opt));

>     -       opt.cpu = 0;

>             opt.num = 1;

> 

>             if (parse_args(argc, argv, &opt))

>                     return -1;

> 

>     -       pid = getpid();

>     -       CPU_ZERO(&cpu_set);

>     -       CPU_SET(opt.cpu, &cpu_set);

>     -

>     -       if (sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set)) {

>     -               printf("Set CPU affinity failed.\n");

>     -               return -1;

>     -       }

>     -

>             if (odp_init_global(&inst, NULL, NULL)) {

>                     printf("Global init failed.\n");

>                     return -1;

>     @@ -85,6 +59,7 @@ int main(int argc, char *argv[])

> 

>             if (odp_init_local(inst, ODP_THREAD_CONTROL)) {

>                     printf("Local init failed.\n");

>     +               (void)odp_term_global(inst);

>                     return -1;

>             }

> 

>     --

>     2.11.0.295.gd7dffce

> 

> 

> 

> 

> -- 

> Mike Holmes

> Program Manager - Linaro Networking Group

> Linaro.org <http://www.linaro.org/>* **│ *Open source software for ARM SoCs

> "Work should be fun and collaborative, the rest follows"

> 

> __

> 

>

Patch

diff --git a/example/hello/odp_hello.c b/example/hello/odp_hello.c
index 6d114eea..0b75b58f 100644
--- a/example/hello/odp_hello.c
+++ b/example/hello/odp_hello.c
@@ -10,21 +10,12 @@ 
  * anything else than the ODP API header file.
  */
 
-/* Linux CPU affinity */
-#define _GNU_SOURCE
-#include <sched.h>
-
-/* Linux PID */
-#include <sys/types.h>
-#include <unistd.h>
-
 #include <stdio.h>
 #include <string.h>
 
 #include <odp_api.h>
 
 typedef struct {
-	int cpu;
 	int num;
 } options_t;
 
@@ -36,17 +27,12 @@  static int parse_args(int argc, char *argv[], options_t *opt)
 	for (i = 1; i < argc; i++) {
 		if ((strcmp(argv[i], args[0]) == 0) &&
 		    (sscanf(argv[i + 1], "%i", &tmp) == 1)) {
-			opt->cpu = tmp;
-			i++;
-		} else if ((strcmp(argv[i], args[1]) == 0) &&
-			   (sscanf(argv[i + 1], "%i", &tmp) == 1)) {
 			opt->num = tmp;
 			i++;
 		} else {
 			printf("\nUsage:\n"
-			       "  %s  CPU number\n"
 			       "  %s  Number of iterations\n\n",
-			       args[0], args[1]);
+			       args[0]);
 			return -1;
 		}
 	}
@@ -58,26 +44,14 @@  int main(int argc, char *argv[])
 {
 	odp_instance_t inst;
 	options_t opt;
-	pid_t pid;
-	cpu_set_t cpu_set;
 	int i;
 
 	memset(&opt, 0, sizeof(opt));
-	opt.cpu = 0;
 	opt.num = 1;
 
 	if (parse_args(argc, argv, &opt))
 		return -1;
 
-	pid = getpid();
-	CPU_ZERO(&cpu_set);
-	CPU_SET(opt.cpu, &cpu_set);
-
-	if (sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set)) {
-		printf("Set CPU affinity failed.\n");
-		return -1;
-	}
-
 	if (odp_init_global(&inst, NULL, NULL)) {
 		printf("Global init failed.\n");
 		return -1;
@@ -85,6 +59,7 @@  int main(int argc, char *argv[])
 
 	if (odp_init_local(inst, ODP_THREAD_CONTROL)) {
 		printf("Local init failed.\n");
+		(void)odp_term_global(inst);
 		return -1;
 	}