summaryrefslogtreecommitdiffstats
path: root/serprog.c
diff options
context:
space:
mode:
authorBrian Norris <briannorris@chromium.org>2024-02-29 16:29:51 -0800
committerAnastasia Klimchuk <aklm@chromium.org>2024-03-14 10:24:22 +0000
commit54b053e6b23715fbefa59b71d2cc5211508f2d79 (patch)
tree792d76d3c1647cfbc7fe40e62f701b476dd5c799 /serprog.c
parent3c5eb532ada8d2efc5e59117b73020fbb6a93aae (diff)
downloadflashrom-54b053e6b23715fbefa59b71d2cc5211508f2d79.tar.gz
flashrom-54b053e6b23715fbefa59b71d2cc5211508f2d79.tar.bz2
flashrom-54b053e6b23715fbefa59b71d2cc5211508f2d79.zip
udelay: Lower the sleep vs delay threshold
By default, we busy-loop (a.k.a., "delay") for most delay values, and only allow sleeping for large delays. But busy-looping is expensive, as it wastes CPU cycles. In a simple program that runs a bunch of samples of [1] over 1000 samples, I find that for 0.1 s (100000 us): 64x2 AMD CPU (CONFIG_HZ=250 / CONFIG_NO_HZ_FULL=y): min diff: 60 us max diff: 831 us mean diff: 135 us 4+2 Mediatek MT8183 CPU (CONFIG_HZ=1000 / CONFIG_NO_HZ_IDLE=y / sysctl kernel.timer_highres=1): min diff: 70 us max diff: 1556 us mean diff: 146 us 4+2 Mediatek MT8183 CPU (CONFIG_HZ=1000 / CONFIG_NO_HZ_IDLE=y / sysctl kernel.timer_highres=0): min diff: 94 us max diff: 7222 us mean diff: 1201 us i.e., maximum 1.5% error, typically ~0.1% error with high resolution timers. Max 7% error, typical 1% error with low resolution timers. The error is always in the positive direction (i.e., sleep longer than the requested delay, not shorter than the request). This seems reasonable. [1] Stripped / pseudocode: clock_gettime(CLOCK_MONOTONIC, before); nanosleep({ .tv_nsec = usecs * 1000 }, NULL); clock_gettime(CLOCK_MONOTONIC, after); diff = abs((after - before) / 1000 - usecs)); Change-Id: Ifd4821c66c5564f7c975c08769a6742f645e9be0 Signed-off-by: Brian Norris <briannorris@chromium.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/80808 Reviewed-by: Anastasia Klimchuk <aklm@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'serprog.c')
0 files changed, 0 insertions, 0 deletions