diff options
| author | Ori Bernstein <ori@eigenstate.org> | 2019-12-08 11:58:19 -0800 |
|---|---|---|
| committer | Ori Bernstein <ori@eigenstate.org> | 2019-12-08 11:58:19 -0800 |
| commit | 36af8405521be371605e4658ec8f4b133f3c7d6f (patch) | |
| tree | e3ca06d335312c31a58eb917dd4ebad57e26cd95 | |
| parent | 02e6003fc87ca7ace27beef200813426dd954852 (diff) | |
| parent | 13785bbbef60f5c13aa973c1e7d4277aa55f6a2d (diff) | |
| download | plan9front-36af8405521be371605e4658ec8f4b133f3c7d6f.tar.xz | |
merge
| -rw-r--r-- | sys/src/9/pc/mmu.c | 22 | ||||
| -rw-r--r-- | sys/src/9/port/portclock.c | 2 | ||||
| -rw-r--r-- | sys/src/9/port/portfns.h | 1 | ||||
| -rw-r--r-- | sys/src/9/port/proc.c | 40 |
4 files changed, 35 insertions, 30 deletions
diff --git a/sys/src/9/pc/mmu.c b/sys/src/9/pc/mmu.c index 383ba7d91..c9ff28abb 100644 --- a/sys/src/9/pc/mmu.c +++ b/sys/src/9/pc/mmu.c @@ -643,10 +643,7 @@ vmapalloc(ulong size) void vunmap(void *v, int size) { - int i; ulong va, o; - Mach *nm; - Proc *p; /* * might not be aligned @@ -675,25 +672,8 @@ vunmap(void *v, int size) putcr3(PADDR(MACHP(0)->pdb)); return; } - for(i=0; i<conf.nproc; i++){ - p = proctab(i); - if(p->state == Dead) - continue; - if(p != up) - p->newtlb = 1; - } - for(i=0; i<conf.nmach; i++){ - nm = MACHP(i); - if(nm != m) - nm->flushmmu = 1; - } + procflushothers(); flushmmu(); - for(i=0; i<conf.nmach; i++){ - nm = MACHP(i); - if(nm != m) - while(active.machs[nm->machno] && nm->flushmmu) - ; - } } /* diff --git a/sys/src/9/port/portclock.c b/sys/src/9/port/portclock.c index db2420948..6711815ff 100644 --- a/sys/src/9/port/portclock.c +++ b/sys/src/9/port/portclock.c @@ -148,7 +148,7 @@ hzclock(Ureg *ur) m->proc->pc = ur->pc; if(m->flushmmu){ - if(up) + if(up && up->newtlb) flushmmu(); m->flushmmu = 0; } diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h index a37777c20..b460ec935 100644 --- a/sys/src/9/port/portfns.h +++ b/sys/src/9/port/portfns.h @@ -229,6 +229,7 @@ void procdump(void); int procfdprint(Chan*, int, char*, int); void procflushseg(Segment*); void procflushpseg(Physseg*); +void procflushothers(void); int procindex(ulong); void procinit0(void); ulong procpagecount(Proc*); diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c index f67dc9f3a..59fe9ecd9 100644 --- a/sys/src/9/port/proc.c +++ b/sys/src/9/port/proc.c @@ -1331,36 +1331,49 @@ procdump(void) static void procflushmmu(int (*match)(Proc*, void*), void *a) { + Proc *await[MAXMACH]; int i, nm, nwait; Proc *p; /* * tell all matching processes to flush their mmu's */ + memset(await, 0, conf.nmach*sizeof(await[0])); nwait = 0; - for(i=0; i<conf.nproc; i++) { + for(i = 0; i < conf.nproc; i++){ p = &procalloc.arena[i]; if(p->state != Dead && (*match)(p, a)){ p->newtlb = 1; for(nm = 0; nm < conf.nmach; nm++){ if(MACHP(nm)->proc == p){ + coherence(); MACHP(nm)->flushmmu = 1; - nwait++; + if(await[nm] == nil) + nwait++; + await[nm] = p; } } } } - if(nwait == 0) - return; - /* * wait for all other processors to take a clock interrupt * and flush their mmu's */ - for(nm = 0; nm < conf.nmach; nm++) - while(m->machno != nm && MACHP(nm)->flushmmu) - sched(); + for(;;){ + if(nwait == 0 || nwait == 1 && await[m->machno] != nil) + break; + + sched(); + + for(nm = 0; nm < conf.nmach; nm++){ + p = await[nm]; + if(p != nil && (MACHP(nm)->proc != p || MACHP(nm)->flushmmu == 0)){ + await[nm] = nil; + nwait--; + } + } + } } static int @@ -1399,6 +1412,17 @@ procflushpseg(Physseg *ps) procflushmmu(matchpseg, ps); } +static int +matchother(Proc *p, void *a) +{ + return p != a; +} +void +procflushothers(void) +{ + procflushmmu(matchother, up); +} + void scheddump(void) { |
