pc/pc64: bring up ap's one after another, use idlehands() while waiting for thunderbirdsarego
when testing in qemu, launching each ap became slower and slower because all the ap's where spinning in syncclock() waiting for cpu0 to update its mach0->tscticks, which happens only much later after all cpu's have been started up. now we wait for each cpu to do its timer callibration and manually update our tscticks while we wait and each cpu will not spin but halt while waiting for active.thunderbirdsarego. this reduces the system load and noise for timer callibration and makes the mp startup linear with regard to the number of cores.
This commit is contained in:
parent
dacaf31eb0
commit
63f9a4fda3
5 changed files with 16 additions and 7 deletions
|
@ -783,7 +783,6 @@ cpuidentify(void)
|
|||
wrmsr(0x10, 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* use i8253 to guess our cpu speed
|
||||
*/
|
||||
|
|
|
@ -196,9 +196,7 @@ mpinit(void)
|
|||
ncpu = MAXMACH;
|
||||
memmove((void*)APBOOTSTRAP, apbootstrap, sizeof(apbootstrap));
|
||||
for(i=0; i<nelem(mpapic); i++){
|
||||
if((apic = mpapic[i]) == nil)
|
||||
continue;
|
||||
if(apic->machno >= MAXMACH)
|
||||
if((apic = mpapic[i]) == nil || apic->machno == 0 || apic->machno >= MAXMACH)
|
||||
continue;
|
||||
if(ncpu <= 1)
|
||||
break;
|
||||
|
@ -206,6 +204,17 @@ mpinit(void)
|
|||
mpstartap(apic);
|
||||
conf.nmach++;
|
||||
ncpu--;
|
||||
|
||||
if(!apic->online){
|
||||
print("LAPIC%d: cpu%d did not startup\n", i, apic->machno);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* update tscticks for ap's syncclock() */
|
||||
while(!active.machs[apic->machno]){
|
||||
if(arch->fastclock == tscticks)
|
||||
cycles(&m->tscticks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ squidboy(Apic* apic)
|
|||
unlock(&active);
|
||||
|
||||
while(!active.thunderbirdsarego)
|
||||
microdelay(100);
|
||||
idlehands();
|
||||
|
||||
schedinit();
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#define BLOCKALIGN 8
|
||||
#define FPalign 16
|
||||
|
||||
#define MAXMACH 64 /* max # cpus system can run */
|
||||
#define MAXMACH 128 /* max # cpus system can run */
|
||||
|
||||
#define KSTACK (16*KiB) /* Size of Proc kernel stack */
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ squidboy(Apic* apic)
|
|||
mmuinit();
|
||||
cpuidentify();
|
||||
cpuidprint();
|
||||
|
||||
apic->online = 1;
|
||||
coherence();
|
||||
|
||||
|
@ -28,7 +29,7 @@ squidboy(Apic* apic)
|
|||
unlock(&active);
|
||||
|
||||
while(!active.thunderbirdsarego)
|
||||
microdelay(100);
|
||||
idlehands();
|
||||
|
||||
schedinit();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue