# HG changeset patch # User Gorka Guardiola # Date 1332599219 -3600 # Node ID 07315b1847057217a064979ab04706695d5ee66a # Parent 025dfd0b9ecf5dce5bb1a9d8c3766ef0fb44e80a colors: use them for scheduling. makes things go much faster R=nixiedev, nemo CC=nix-dev http://codereview.appspot.com/5876071 Committer: Francisco J Ballesteros diff -r 025dfd0b9ecf -r 07315b184705 sys/src/nix/k10/acpi.h --- a/sys/src/nix/k10/acpi.h Sat Mar 24 15:26:18 2012 +0100 +++ b/sys/src/nix/k10/acpi.h Sat Mar 24 15:26:59 2012 +0100 @@ -14,6 +14,8 @@ typedef struct Mdom Mdom; typedef struct Apicst Apicst; typedef struct Srat Srat; +typedef struct Slit Slit; +typedef struct SlEntry SlEntry; enum { @@ -322,6 +324,18 @@ }; }; +/* System locality information table + */ +struct Slit { + uvlong rowlen; + SlEntry **e; +}; + +struct SlEntry { + int dom; /* proximity domain */ + uint dist; /* distance to proximity domain */ +}; + /* Fixed ACPI description table. * Describes implementation and hardware registers. * PM* blocks are low level functions. diff -r 025dfd0b9ecf -r 07315b184705 sys/src/nix/k10/devacpi.c --- a/sys/src/nix/k10/devacpi.c Sat Mar 24 15:26:18 2012 +0100 +++ b/sys/src/nix/k10/devacpi.c Sat Mar 24 15:26:59 2012 +0100 @@ -25,6 +25,7 @@ static Atable* acpimadt(uchar*, int); static Atable* acpimsct(uchar*, int); static Atable* acpisrat(uchar*, int); +static Atable* acpislit(uchar*, int); #pragma varargck type "G" Gas* @@ -54,6 +55,7 @@ "FACP", acpifadt, "APIC", acpimadt, "SRAT", acpisrat, + "SLIT", acpislit, "MSCT", acpimsct, "SSDT", acpitable, }; @@ -65,6 +67,7 @@ static Atable* tlast; /* pointer to last table */ static Madt* apics; /* APIC info */ static Srat* srat; /* System resource affinity, used by physalloc */ +static Slit* slit; /* System locality information table used by the scheduler */ static Msct* msct; /* Maximum system characteristics table */ static Reg* reg; /* region used for I/O */ static Gpe* gpes; /* General purpose events */ @@ -760,6 +763,57 @@ return nil; /* can be unmapped once parsed */ } +static void +dumpslit(Slit *sl) +{ + int i; + + DBG("acpi slit:\n"); + for(i = 0; i < sl->rowlen*sl->rowlen; i++){ + DBG("slit: %ux\n", sl->e[i/sl->rowlen][i%sl->rowlen].dist); + } +} + +static int +cmpslitent(void* v1, void* v2) +{ + SlEntry *se1, *se2; + + se1 = v1; + se2 = v2; + return se1->dist - se2->dist; +} + +static Atable* +acpislit(uchar *p, int len) +{ + uchar *pe; + int i, j, k; + SlEntry *se; + + pe = p + len; + slit = malloc(sizeof(*slit)); + slit->rowlen = l64get(p+36); + slit->e = malloc(slit->rowlen*sizeof(SlEntry*)); + for(i = 0; i < slit->rowlen; i++) + slit->e[i] = malloc(sizeof(SlEntry)*slit->rowlen); + + i = 0; + for(p += 44; p < pe; p++, i++){ + j = i/slit->rowlen; + k = i%slit->rowlen; + se = &slit->e[j][k]; + se->dom = k; + se->dist = *p; + } + dumpslit(slit); + for(i = 0; i < slit->rowlen; i++) + qsort(slit->e[i], slit->rowlen, sizeof(slit->e[0][0]), cmpslitent); + + dumpslit(slit); + return nil; /* can be unmapped once parsed */ +} + uintmem acpimblocksize(uintmem addr, int *dom) { @@ -774,6 +828,7 @@ return 0; } + /* * we use mp->machno (or index in Mach array) as the identifier, * but ACPI relies on the apic identifier. @@ -803,6 +858,21 @@ return -1; } + +int +pickcore(int mycolor, int index) +{ + int color; + int ncorepercol; + + if(slit == nil) + return 0; + ncorepercol = MACHMAX/slit->rowlen; + color = slit->e[mycolor][index/ncorepercol].dom; + return color * ncorepercol + index % ncorepercol; +} + + static void dumpmadt(Madt *apics) { @@ -1619,6 +1689,7 @@ return n; } + Dev acpidevtab = { L'α', "acpi", diff -r 025dfd0b9ecf -r 07315b184705 sys/src/nix/k10/fns.h --- a/sys/src/nix/k10/fns.h Sat Mar 24 15:26:18 2012 +0100 +++ b/sys/src/nix/k10/fns.h Sat Mar 24 15:26:59 2012 +0100 @@ -125,6 +125,7 @@ void pcisetbme(Pcidev*); void pcisetmwi(Pcidev*); int pcisetpms(Pcidev*, int); +int pickcore(int, int); void printcpufreq(void); void putac(Mach*); void runapcore(int); diff -r 025dfd0b9ecf -r 07315b184705 sys/src/nix/port/lib.h --- a/sys/src/nix/port/lib.h Sat Mar 24 15:26:18 2012 +0100 +++ b/sys/src/nix/port/lib.h Sat Mar 24 15:26:59 2012 +0100 @@ -181,7 +181,7 @@ extern ulong strtoul(char*, char**, int); extern vlong strtoll(char*, char**, int); extern uvlong strtoull(char*, char**, int); - +extern void qsort(void*, long, long, int (*)(void*, void*)); /* * Syscall data structures */ diff -r 025dfd0b9ecf -r 07315b184705 sys/src/nix/port/proc.c --- a/sys/src/nix/port/proc.c Sat Mar 24 15:26:18 2012 +0100 +++ b/sys/src/nix/port/proc.c Sat Mar 24 15:26:59 2012 +0100 @@ -557,7 +557,7 @@ preemptfor(Proc *p) { ulong delta; - uint i, rr; + uint i, j, rr; Proc *mup; Mach *mp; @@ -567,8 +567,9 @@ * round robin otherwise. */ for(rr = 0; rr < 2; rr++) - for(i = 0; i < MACHMAX; i++) - if((mp = sys->machptr[i]) != nil && mp->online && mp->nixtype == NIXTC){ + for(i = 0; i < MACHMAX; i++){ + j = pickcore(p->color, i); + if((mp = sys->machptr[j]) != nil && mp->online && mp->nixtype == NIXTC){ if(mp == m) continue; /* @@ -591,6 +592,7 @@ return; } } + } } /* @@ -604,7 +606,7 @@ Proc *p; Mach *mp; ulong start, now; - int n, i; + int n, i, j; assert(m->machno == 0); acmodeset(NIXKC); /* we don't time share any more */ @@ -653,10 +655,12 @@ if(mp->proc != nil) goto loop; }else{ - for(i = 0; i < MACHMAX; i++) - if((mp = sys->machptr[i]) != nil && mp->online && mp->nixtype == NIXTC) + for(i = 0; i < MACHMAX; i++){ + j = pickcore(p->color, i); + if((mp = sys->machptr[j]) != nil && mp->online && mp->nixtype == NIXTC) if(mp != m && mp->proc == nil) break; + } if(i == MACHMAX){ preemptfor(p); goto loop; diff -r 025dfd0b9ecf -r 07315b184705 sys/src/nix/port/sysproc.c --- a/sys/src/nix/port/sysproc.c Sat Mar 24 15:26:18 2012 +0100 +++ b/sys/src/nix/port/sysproc.c Sat Mar 24 15:26:59 2012 +0100 @@ -8,7 +8,7 @@ #include "../port/edf.h" #include -#include +#include void @@ -393,7 +393,6 @@ datalim = BIGPGROUND(textlim+datasz); bsslim = BIGPGROUND(textlim+datasz+bsssz); - /* * Check the binary header for consistency, * e.g. the entry point is within the text segment and @@ -588,6 +587,9 @@ s->flushme = 1; s->fstart = 0; s->flen = hdrsz+textsz; + if(img->color != up->color){ + up->color = img->color; + } unlock(img); /* Data. Shared. */