Hallo Leute,
ich habe ein Problem mit dem clone-Aufruf.
Als Argument für die aufzurufende Funktion gebe ich eine Struktur mit.
|
Quellcode
|
1
2
3
4
5
|
typedef struct virt_cpu{
int vcpu_id; // einfach eine id
void (*fn)(void*); // pointer auf die eigentliche Funktion
void* fn_args; // Argumente
}vCPU;
|
clone sieht folgendermaßen aus:
|
Quellcode
|
1
2
3
4
5
6
7
|
childpid = clone( jump_start,(void*)(((long)stack)+MEM_SIZE),
CLONE_SIGHAND |
CLONE_VM |
CLONE_THREAD |
CLONE_FILES |
CLONE_FS,
&vcpus[i]);
|
vcpus ist dann ein array von der struct.
Damit ich die aus clone entstehende Prozesse an eine bestimmte CPU binden kann,
brauche ich eine "Sprungbrett"-Funktion.
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int
jump_start(void* arg){
cpu_set_t cpuset;
uint64_t cpumask = 1;
vCPU* vcpu=(vCPU*)arg;
CPU_ZERO(&cpuset); //cpu_set_t auf 0 setzen
CPU_SET(cpumask,&cpuset); //Prozessor rein
if((sched_setaffinity(0,sizeof(cpu_set_t),&cpuset)) < 0){
perror("sched_setaffinity() failed");
return -1;
}
vcpu->fn(vcpu->fn_args); // hier knallt es.
return 0;
|
Irgendwas schlägt fehlt, wenn der strukturpointer übergeben wird.
ich kann leider nicht rausfinden, wo der Fehler liegt.
Wäre nett wenn ihr mir weiterhelfen könntet.