On Fri, 2008-10-31 at 14:15 -0700, Darren Hart wrote:
> 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]>
Thanks Gilles and Darren.
Regards--
Subrata
>
> > ---
> > 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