From 54562b6ac2f88c6a29264bb20e1fa5292f6ee8b9 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 1 May 2019 09:35:51 +0200 Subject: kernel: insert memory barrier in the scheduler before setting up->mach = nil we have to ensure that all stores saving the process state have completed before setting up->mach = nil in the scheduler. otherwise, another cpu could observe up->mach == nil while the stores such as the processes p->sched label have not finnished. --- sys/src/9/port/proc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c index 4d5b98f6f..33166ce39 100644 --- a/sys/src/9/port/proc.c +++ b/sys/src/9/port/proc.c @@ -70,6 +70,9 @@ schedinit(void) /* never returns */ edfrecord(up); m->proc = nil; switch(up->state) { + default: + updatecpu(up); + break; case Running: ready(up); break; @@ -88,8 +91,8 @@ schedinit(void) /* never returns */ mmurelease(up); unlock(&palloc); - up->mach = nil; updatecpu(up); + up->mach = nil; up->qnext = procalloc.free; procalloc.free = up; @@ -99,8 +102,8 @@ schedinit(void) /* never returns */ unlock(&procalloc); sched(); } + coherence(); up->mach = nil; - updatecpu(up); up = nil; } sched(); -- cgit v1.2.3