From 313e1d5f1c8c7cd8e3d458628b040ce1c264d23c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 5 Jul 2019 10:18:42 +0200 Subject: SLEEPQUEUE(9): Fix timeout handling --- freebsd/sys/kern/subr_sleepqueue.c | 6 ++++-- rtemsbsd/include/machine/rtems-bsd-thread.h | 2 ++ rtemsbsd/rtems/rtems-kernel-init.c | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/freebsd/sys/kern/subr_sleepqueue.c b/freebsd/sys/kern/subr_sleepqueue.c index e8e221c8..118e1aaf 100644 --- a/freebsd/sys/kern/subr_sleepqueue.c +++ b/freebsd/sys/kern/subr_sleepqueue.c @@ -462,6 +462,7 @@ sleepq_set_timeout_sbt(void *wchan, sbintime_t sbt, sbintime_t pr, ISR_lock_Context lock_context; ISR_lock_Context lock_context_2; Watchdog_Header *header; + sbintime_t sbt_per_tick; uint64_t expire; cpu_self = _Thread_Dispatch_disable(); @@ -477,15 +478,16 @@ sleepq_set_timeout_sbt(void *wchan, sbintime_t sbt, sbintime_t pr, _Watchdog_Set_CPU(&executing->Timer.Watchdog, cpu_self); _Watchdog_Per_CPU_acquire_critical(cpu_self, &lock_context_2); + sbt_per_tick = rtems_bsd_sbt_per_watchdog_tick; if ((flags & C_ABSOLUTE) != 0) { /* * The FreeBSD uptime starts at one second, however, the * relative watchdog ticks start at zero, see also TIMESEL(). */ - expire = (sbt - SBT_1S + tick_sbt - 1) / tick_sbt; + expire = (sbt - SBT_1S + sbt_per_tick - 1) / sbt_per_tick; } else { - expire = (sbt + tick_sbt - 1) / tick_sbt; + expire = (sbt + sbt_per_tick - 1) / sbt_per_tick; expire += cpu_self->Watchdog.ticks; } diff --git a/rtemsbsd/include/machine/rtems-bsd-thread.h b/rtemsbsd/include/machine/rtems-bsd-thread.h index 49652a7e..28286b8e 100644 --- a/rtemsbsd/include/machine/rtems-bsd-thread.h +++ b/rtemsbsd/include/machine/rtems-bsd-thread.h @@ -46,6 +46,8 @@ #include +extern sbintime_t rtems_bsd_sbt_per_watchdog_tick; + #define BSD_TASK_NAME rtems_build_name('_', 'B', 'S', 'D') struct thread * diff --git a/rtemsbsd/rtems/rtems-kernel-init.c b/rtemsbsd/rtems/rtems-kernel-init.c index ac03fedf..7112914e 100644 --- a/rtemsbsd/rtems/rtems-kernel-init.c +++ b/rtemsbsd/rtems/rtems-kernel-init.c @@ -87,6 +87,7 @@ int hz; int tick; volatile int ticks; sbintime_t tick_sbt; +sbintime_t rtems_bsd_sbt_per_watchdog_tick; struct bintime bt_timethreshold; struct bintime bt_tickthreshold; sbintime_t sbt_timethreshold; @@ -123,6 +124,7 @@ rtems_bsd_initialize(void) tick = 1000000 / hz; tick_sbt = SBT_1S / hz; + rtems_bsd_sbt_per_watchdog_tick = SBT_1S / tps; FREQ2BT(hz, &tc_tick_bt); tc_tick_sbt = bttosbt(tc_tick_bt); tc_precexp = 31; -- cgit v1.2.3