Gilles Carry wrote:
> From: gilles.carry <gilles.carry>
> 
> Syscall sched_setaffinity fails if choosen cpu is not online.
> In set_affinity, thread_id value is used as cpuid when calling
> sched_setaffinity. This fails when disabling cpus because threads ids
> and online cpu ids don't necessarly match.
> 
> This patch simply increments cpuid (max. 8192) until it finds an online cpu.
> This guaranties that no more than one thread is assigned to one cpu.
> If set_affinity is called more times than there are online cpus
> then matrix_mult.c fails.
> 
> Signed-off-by: Gilles Carry <[EMAIL PROTECTED]>

Acked-by: Darren Hart <[EMAIL PROTECTED]>

> ---
>  testcases/realtime/func/matrix_mult/matrix_mult.c |   56 +++++++++++++-------
>  1 files changed, 36 insertions(+), 20 deletions(-)
> 
> diff --git a/testcases/realtime/func/matrix_mult/matrix_mult.c 
> b/testcases/realtime/func/matrix_mult/matrix_mult.c
> index 21fded8..afaca06 100644
> --- a/testcases/realtime/func/matrix_mult/matrix_mult.c
> +++ b/testcases/realtime/func/matrix_mult/matrix_mult.c
> @@ -44,6 +44,7 @@
>  #include <libjvmsim.h>
>  #include <libstats.h>
> 
> +#define MAX_CPUS     8192
>  #define PRIO         43
>  #define MATRIX_SIZE  100
>  #define DEF_OPS              8               /* the higher the number, the 
> more CPU intensive */
> @@ -66,15 +67,13 @@ static float criteria;
>  static int *mult_index;
>  static int *tids;
>  static int *flags;
> +static int online_cpu_id = -1;
> 
>  stats_container_t sdat, cdat, *curdat;
>  stats_container_t shist, chist;
>  static pthread_barrier_t mult_start;
> +static pthread_mutex_t mutex_cpu;
> 
> -int gettid(void)
> -{
> -     return syscall(__NR_gettid);
> -}
> 
>  void usage(void)
>  {
> @@ -148,28 +147,39 @@ void matrix_mult_record(int m_size, int index)
>       curdat->records[index].y = delta;
>  }
> 
> -int set_affinity(int cpuid)
> +int set_affinity(void)
>  {
> -     int tid = gettid();
>       cpu_set_t mask;
> -
> -     CPU_ZERO(&mask);
> -     CPU_SET(cpuid, &mask);
> -
> -     if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
> -             printf("Thread %d: Can't set affinity: %s\n", tid, 
> strerror(errno));
> -             exit(1);
> -     }
> -
> -     return 0;
> +     int cpuid;
> +
> +     pthread_mutex_lock(&mutex_cpu);
> +     do {
> +             ++online_cpu_id;
> +             CPU_ZERO(&mask);
> +             CPU_SET(online_cpu_id, &mask);
> +
> +             if (!sched_setaffinity(0, sizeof(mask), &mask)) {
> +                     cpuid = online_cpu_id; /* Save this value before 
> unlocking mutex */
> +                     pthread_mutex_unlock(&mutex_cpu);
> +                     return cpuid;
> +             }
> +     } while (online_cpu_id < MAX_CPUS);
> +     pthread_mutex_unlock(&mutex_cpu);
> +     return -1;
>  }
> 
>  void *concurrent_thread(void *thread)
>  {
>       struct thread *t = (struct thread *)thread;
> -     int thread_id = (intptr_t)t->arg;
> +     int thread_id = (intptr_t)t->id;
> +     int cpuid;
> +
> +     cpuid = set_affinity();
> +     if (cpuid == -1) {
> +             fprintf(stderr, "Thread %d: Can't set affinity.\n", thread_id);
> +             exit(1);
> +     }
> 
> -     set_affinity(thread_id);
>       pthread_barrier_wait(&mult_start);
>       while (flags[thread_id] != THREAD_DONE) {
>               pthread_mutex_lock(&t->mutex);
> @@ -219,6 +229,7 @@ void main_thread(void)
>       nsec_t start, end;
>       long smin = 0, smax = 0, cmin = 0, cmax = 0, delta = 0;
>       float savg, cavg;
> +     int cpuid;
> 
>       if (    stats_container_init(&sdat, ITERATIONS) ||
>               stats_container_init(&shist, HIST_BUCKETS) ||
> @@ -251,7 +262,12 @@ void main_thread(void)
>       }
>       memset(flags, 0, numcpus);
> 
> -     set_affinity(numcpus-1);
> +     cpuid = set_affinity();
> +     if (cpuid == -1) {
> +             fprintf(stderr, "Main thread: Can't set affinity.\n");
> +             exit(1);
> +     }
> +
> 
>       /* run matrix mult operation sequentially */
>       curdat = &sdat;
> @@ -284,7 +300,7 @@ void main_thread(void)
> 
>       /* Create numcpus-1 concurrent threads */
>       for (j = 0; j < (numcpus-1); j++) {
> -             tids[j] = create_fifo_thread(concurrent_thread, (void 
> *)(intptr_t)j, PRIO);
> +             tids[j] = create_fifo_thread(concurrent_thread, NULL, PRIO);
>               if (tids[j] == -1) {
>                       printf("Thread creation failed (max threads 
> exceeded?)\n");
>                       break;


-- 
Darren Hart
IBM Linux Technology Center
Real-Time Linux Team

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to