diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2024-01-04 04:49:33 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2024-01-04 04:49:33 +0000 |
commit | e38d42b4a7f278a7f7835e07983115e4ee1b0db4 (patch) | |
tree | 13a1f865ea2f7983425cc3d1e17363f7fe2fed21 | |
parent | 16c1cc99ec6db23f8d7b056127c77a4dcf14f2b5 (diff) |
kernel: handle errors in semacquire
Move waserror()/poperror() out of the loop,
so we can also catch errors from canacquire().
This is theoretically possible if memory has
been paged out and we get I/O errors when
trying to page it back in.
-rw-r--r-- | sys/src/9/port/segment.c | 3 | ||||
-rw-r--r-- | sys/src/9/port/sysproc.c | 57 |
2 files changed, 27 insertions, 33 deletions
diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c index b16be0f43..87231cee1 100644 --- a/sys/src/9/port/segment.c +++ b/sys/src/9/port/segment.c @@ -109,6 +109,9 @@ putseg(Segment *s) } else if(decref(s) != 0) return; + assert(s->sema.prev == &s->sema); + assert(s->sema.next = &s->sema); + if(s->mapsize > 0){ emap = &s->map[s->mapsize]; for(pte = s->map; pte < emap; pte++) diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index 2508b227a..f73bd76c9 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -236,7 +236,6 @@ sysrfork(va_list list) wm = up->wired; if(wm != nil) procwired(p, wm->machno); - p->psstate = nil; ready(p); sched(); return pid; @@ -1141,19 +1140,15 @@ semacquire(Segment *s, long *addr, int block) return 1; if(!block) return 0; - - acquired = 0; semqueue(s, addr, &phore); - for(;;){ - phore.waiting = 1; - coherence(); - if(canacquire(addr)){ - acquired = 1; - break; + if(acquired = !waserror()){ + for(;;){ + phore.waiting = 1; + coherence(); + if(canacquire(addr)) + break; + sleep(&phore, semawoke, &phore); } - if(waserror()) - break; - sleep(&phore, semawoke, &phore); poperror(); } semdequeue(s, &phore); @@ -1169,7 +1164,7 @@ semacquire(Segment *s, long *addr, int block) static int tsemacquire(Segment *s, long *addr, ulong ms) { - int acquired, timedout; + int timedout, acquired; ulong t; Sema phore; @@ -1177,36 +1172,32 @@ tsemacquire(Segment *s, long *addr, ulong ms) return 1; if(ms == 0) return 0; - acquired = timedout = 0; + timedout = 0; semqueue(s, addr, &phore); - for(;;){ - phore.waiting = 1; - coherence(); - if(canacquire(addr)){ - acquired = 1; - break; + if(acquired = !waserror()){ + for(;;){ + phore.waiting = 1; + coherence(); + if(canacquire(addr)) + break; + t = MACHP(0)->ticks; + tsleep(&phore, semawoke, &phore, ms); + t = TK2MS(MACHP(0)->ticks - t); + if(t >= ms){ + timedout = 1; + break; + } + ms -= t; } - if(waserror()) - break; - t = MACHP(0)->ticks; - tsleep(&phore, semawoke, &phore, ms); - t = TK2MS(MACHP(0)->ticks - t); poperror(); - if(t >= ms){ - timedout = 1; - break; - } - ms -= t; } semdequeue(s, &phore); coherence(); /* not strictly necessary due to lock in semdequeue */ if(!phore.waiting) semwakeup(s, addr, 1); - if(timedout) - return 0; if(!acquired) nexterror(); - return 1; + return !timedout; } uintptr |