Hi again, Well, looks like a bug in the C library. Using the syscall directly produces the expected behavior, using the C library produces an error. Compile the following with -DBUG to see the buggy behavior. Comments? Phil #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <syscall.h> #include <asm/cpumask.h> void set_affin(void) { int retval; cpumask_t mask = { 0 }; cpu_set(0,mask); #ifdef BUG retval = sched_setaffinity(getpid(),sizeof(cpumask_t),&mask); #else retval = syscall(__NR_sched_setaffinity,getpid(),sizeof(cpumask_t),&mask); #endif printf("sched_setaffinity returns %d\n",retval); if (errno == -1) { printf("%d ",errno); perror("sched_setaffinity"); } } int main(int argc, char **argv) { set_affin(); sleep(1); exit(0); } On Tue, 2004-06-29 at 11:51, Philip J. Mucci wrote:
Hi folks,
I'm working with some guys at PGI/AMD to get some sched_setaffinity support in some runtime systems. We're having great difficulty getting sched_setaffinity working.
The code below was constructed via the code in linux/kernel/sched.c, contrary to the prototypes and the like. Surely we must be doing something rather stupid, because we keep getting -EFAULT.
The only thing I can guess is that the sizeof(cpumask) is different in kernel than it is in user land.
Any help would be greatly appreciated...
Phil
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <asm/cpumask.h>
void set_affin(void) { cpumask_t mask = { 0, }; int retval;
cpu_set(1,mask); retval = sched_setaffinity(0,sizeof(cpumask_t),&mask); printf("sched_setaffinity returns %d, errno %d\n",retval,errno); perror("ERROR MESSAGE"); } int main(int argc, char **argv) { set_affin(); sleep(1); exit(0); }