shithub: riscv

Download patch

ref: 1848f4e946c6a5d625c23f9c6a3ad7480816585a
parent: bfd8098b8de4c9dfbd5def087b92b09dfc97b41c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Sep 7 19:36:04 EDT 2016

kernel: tsemacquire() use MACHP(0)->ticks for time delta

we might wake up on a different cpu after the sleep so
delta from machX->ticks - machY->ticks can become negative
giving spurious timeouts. to avoid this always use the
same mach 0 tick counter for the delta.

--- a/sys/src/9/port/sysproc.c
+++ b/sys/src/9/port/sysproc.c
@@ -1126,7 +1126,7 @@
 tsemacquire(Segment *s, long *addr, ulong ms)
 {
 	int acquired, timedout;
-	ulong t, elms;
+	ulong t;
 	Sema phore;
 
 	if(canacquire(addr))
@@ -1144,15 +1144,15 @@
 		}
 		if(waserror())
 			break;
-		t = m->ticks;
+		t = MACHP(0)->ticks;
 		tsleep(&phore, semawoke, &phore, ms);
-		elms = TK2MS(m->ticks - t);
+		t = TK2MS(MACHP(0)->ticks - t);
 		poperror();
-		if(elms >= ms){
+		if(t >= ms){
 			timedout = 1;
 			break;
 		}
-		ms -= elms;
+		ms -= t;
 	}
 	semdequeue(s, &phore);
 	coherence();	/* not strictly necessary due to lock in semdequeue */