shithub: riscv

Download patch

ref: e3ad3d6968f4fd4cbb325e081ac9027d24f01316
parent: b54c61c6174251736e0a6bf30fc1631eca79210c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Mar 16 16:14:40 EDT 2024

qio: revert the change, i was not reading the code right

actually, the initial condition for blocking
was q->len/2 >= q->limit, which menas the queue
grew over TWICE the size. thich makes this
heuristic kick in later, which i think was
fine. so revert and put comment to not getting
confused again. sorry :(

--- a/sys/src/9/port/qio.c
+++ b/sys/src/9/port/qio.c
@@ -1163,9 +1163,14 @@
 
 	QDEBUG if(!islo())
 		print("qwrite hi %#p\n", getcallerpc(&q));
-
-	/* stop queue bloat before allocating blocks */
-	if(q->len >= q->limit && q->noblock == 0 && q->bypass == nil){
+	/*
+	 * when the queue length grew over twice the limit,
+	 * block here before allocating more blocks.
+	 * this can happen when qflow() is getting
+	 * interrupted by notes, preventing effective
+	 * flow control.
+	 */
+	if(q->len/2 >= q->limit && q->noblock == 0 && q->bypass == nil){
 		while(waserror()){
 			if(up->procctl == Proc_exitme || up->procctl == Proc_exitbig)
 				error(Egreg);