]> git.lizzy.rs Git - plan9front.git/commitdiff
kernel: don't cap the minimum sleep time to TK2MS(1) for syssleep()
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 10 Jun 2018 17:47:21 +0000 (19:47 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 10 Jun 2018 17:47:21 +0000 (19:47 +0200)
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

sys/src/9/port/sysproc.c

index ee6f2b937b906a7f33ca2eb7e89a1f9334f8af5e..5a20316f12ce0be52f9fc9cc227831a7ba3d0e4d 100644 (file)
@@ -602,8 +602,6 @@ syssleep(va_list list)
                else
                        yield();
        } else {
-               if(ms < TK2MS(1))
-                       ms = TK2MS(1);
                tsleep(&up->sleep, return0, 0, ms);
        }
        return 0;