From: gilles.carry <[EMAIL PROTECTED]>

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.
---
 testcases/realtime/func/matrix_mult/matrix_mult.c |   30 ++++++++++++++-------
 1 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/testcases/realtime/func/matrix_mult/matrix_mult.c 
b/testcases/realtime/func/matrix_mult/matrix_mult.c
index 21fded8..55c1086 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 */
@@ -70,6 +71,7 @@ static int *flags;
 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)
 {
@@ -148,20 +150,28 @@ void matrix_mult_record(int m_size, int index)
        curdat->records[index].y = delta;
 }
 
-int set_affinity(int cpuid)
+int set_affinity(int thread_id)
 {
        int tid = gettid();
        cpu_set_t mask;
+       static int cpuid = 0;
+
+       pthread_mutex_lock(&mutex_cpu);
+       do {
+               CPU_ZERO(&mask);
+               CPU_SET(cpuid, &mask);
+
+               if (!sched_setaffinity(0, sizeof(mask), &mask)) {
+                       printf ("Thread %d affinity set to 
cpu%d\n",thread_id,cpuid);
+                       cpuid++;
+                       pthread_mutex_unlock(&mutex_cpu);
+                       return 0;
+               }
+       } while (++cpuid < MAX_CPUS);
+       pthread_mutex_unlock(&mutex_cpu);
 
-       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;
+       printf("Thread %d: Can't set affinity: %s\n", tid, strerror(errno));
+       exit(1);
 }
 
 void *concurrent_thread(void *thread)
-- 
1.5.5.GIT


-------------------------------------------------------------------------
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