• Jason A. Donenfeld's avatar
    wireguard: ratelimiter: use hrtimer in selftest · 151c8e49
    Jason A. Donenfeld authored
    Using msleep() is problematic because it's compared against
    ratelimiter.c's ktime_get_coarse_boottime_ns(), which means on systems
    with slow jiffies (such as UML's forced HZ=100), the result is
    inaccurate. So switch to using schedule_hrtimeout().
    
    However, hrtimer gives us access only to the traditional posix timers,
    and none of the _COARSE variants. So now, rather than being too
    imprecise like jiffies, it's too precise.
    
    One solution would be to give it a large "range" value, but this will
    still fire early on a loaded system. A better solution is to align the
    timeout to the actual coarse timer, and then round up to the nearest
    tick, plus change.
    
    So add the timeout to the current coarse time, and then
    schedule_hrtimer() until the absolute computed time.
    
    This should hopefully reduce flakes in CI as well. Note that we keep the
    retry loop in case the entire function is running behind, because the
    test could still be scheduled out, by either the kernel or by the
    hypervisor's kernel, in which case restarting the test and hoping to not
    be scheduled out still helps.
    
    Fixes: e7096c13 ("net: WireGuard secure network tunnel")
    Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    151c8e49
hrtimer.c 66.1 KB