libbsd select timeout issue(critial!!)
ruizx at 126.com
Wed Nov 11 02:50:55 UTC 2020
This issue is very critial, it can make the select abnormally return timeout after long run time.
If the timeout is set to 5ms, when the system run after 70000s(19.4h),
the select function will wait 10ms timeout, which is two times of setting value.
This issue is created by calculating timeout watchdog expire tick using the absolute time since libbsd5 version.
在 2020-11-03 10:26:39，"RUI Zhengxin" <ruizx at 126.com> 写道：
We meet an issue of select function timeout drift in rtems-libbsd5.1.
The select timeout can drift 1ms every 14000 seconds.
Kernel put the select thread to sleep queue in sleepq_set_timeout_sbt,
the expire value is calculated by this
expire = (sbt - SBT_1S + sbt_per_tick - 1) / sbt_per_tick;
sbt is the absolute time,
Precision is a constant value, no time drift.
but the sbt_per_tick is not an accurate value,
It can make the expire vaule bigger and bigger while sbt is increasing.
in rtems_bsd_initialize function,
rtems_bsd_sbt_per_watchdog_tick = SBT_1S / tps;
in our system the tick rate is set to 1000Hz,
The real value of rtems_bsd_sbt_per_watchdog_tick is 1<<32/1000=4294967.296
but in integer type the value is 4294967.
The error is 0.296/4294967 = 0.069ppm,
and it can increase the expire value 1ms every 14000 seconds.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the users