ref: eed90aa0ad7ac012d9f1abe638074156654d81ef
parent: ce9d09a9650d2903d0dca659669cce14d68bd95b
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jun 10 15:47:21 EDT 2018
kernel: don't cap the minimum sleep time to TK2MS(1) for syssleep() on HZ 100 systems like pc and pc64, the minium sleep time was 10ms, which is quite high. the cap isnt really needed as arch specific timerset() enforces its own limit, but on a higher resolution. background: from Charles Forsyth: I haven't really got an opinion on it. The 10ms interval was first used on machines that were much slower. I thought someone did set HZ to a bigger value, partly to support better in-kernel timing. I haven't done it because I never had a need for it. If I were doing (say) protocol implementation in user mode, I'd certainly reconsider. Sleep itself forces at best ms granularity, and for some applications that's too big. initial mail from qwx raising the issue: > Hello, > > I found out recently that sleep(2)'s resolution on 386 and 9front's amd64 > kernel is 10 ms rather than 1 ms. The reason is that on those kernels, > HZ is set to 100 rather than say 1000. In syssleep, we get 1 tich every > 10 ms. > > What is unclear is why. > > To paraphrase cinap_lenrek's answer to my question: > > In syssleep: > if(ms < TK2MS(1)) > ms = TK2MS(1); > tsleep(&up->sleep, return0, 0, ms); > > "TK2MS(1)" can be replaced with just "1", and the arch specific > timerset() routine would do its own capping of the period if it's too > small for the timer resolution, and make better decisions based on what > the minimum timer period should be given the latency overhead of the > given arch's interrupt handling and performance characteristics. > > Alternatively, HZ could be raised to 500 or 1000. > > It seems it's just trying to prevent excessive context switches and > interrupts, but it seems somewhat arbitrary. A ton of syscalls can be > done in 1 ms, and it's the lowest we can go without changing the unit. > > > What do you think? > > Thanks in advance, > > qwx
--- a/sys/src/9/port/sysproc.c
+++ b/sys/src/9/port/sysproc.c
@@ -602,8 +602,6 @@
else
yield();
} else {
- if(ms < TK2MS(1))
- ms = TK2MS(1);
tsleep(&up->sleep, return0, 0, ms);
}
return 0;