[rtems-libbsd commit] SLEEPQUEUE(9): Fix timeout handling

Sebastian Huber sebh at rtems.org
Fri Jul 5 08:21:10 UTC 2019


Module:    rtems-libbsd
Branch:    5-freebsd-12
Commit:    660a8835eb4ecb10ae9d320fb2ee32166bb61ec5
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=660a8835eb4ecb10ae9d320fb2ee32166bb61ec5

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Jul  5 10:18:42 2019 +0200

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 99a9d67..042c0b0 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 49652a7..28286b8 100644
--- a/rtemsbsd/include/machine/rtems-bsd-thread.h
+++ b/rtemsbsd/include/machine/rtems-bsd-thread.h
@@ -46,6 +46,8 @@
 
 #include <rtems.h>
 
+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 ac03fed..7112914 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;



More information about the vc mailing list