diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2021-03-08 01:50:12 +0200 |
---|---|---|
committer | Moyano, Gabriel <gabriel.moyano@dlr.de> | 2021-11-16 09:48:22 +0100 |
commit | 2cf37001fc9db16e5033d547d7846274b6507edf (patch) | |
tree | 7f9b2efca4aeb5fbf473af5a39ed88cc5899adf0 | |
parent | Add ddb 'show timecounter' command. (diff) | |
download | rtems-2cf37001fc9db16e5033d547d7846274b6507edf.tar.bz2 |
Make kern.timecounter.hardware tunable
Noted and reviewed by: kevans
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D29122
-rw-r--r-- | cpukit/score/src/kern_tc.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c index 6fbb59038a..5e0b6fa227 100644 --- a/cpukit/score/src/kern_tc.c +++ b/cpukit/score/src/kern_tc.c @@ -273,6 +273,7 @@ SYSCTL_PROC(_kern_timecounter, OID_AUTO, alloweddeviation, volatile int rtc_generation = 1; static int tc_chosen; /* Non-zero if a specific tc was chosen via sysctl. */ +static char tc_from_tunable[16]; #endif /* __rtems__ */ static void tc_windup(struct bintime *new_boottimebin); @@ -1383,17 +1384,26 @@ tc_init(struct timecounter *tc) return; if (tc->tc_quality < 0) return; -#endif /* __rtems__ */ + if (tc_from_tunable[0] != '\0' && + strcmp(tc->tc_name, tc_from_tunable) == 0) { + tc_chosen = 1; + tc_from_tunable[0] = '\0'; + } else { + if (tc->tc_quality < timecounter->tc_quality) + return; + if (tc->tc_quality == timecounter->tc_quality && + tc->tc_frequency < timecounter->tc_frequency) + return; + } + (void)tc->tc_get_timecount(tc); + timecounter = tc; +#else /* __rtems__ */ if (tc->tc_quality < timecounter->tc_quality) return; if (tc->tc_quality == timecounter->tc_quality && tc->tc_frequency < timecounter->tc_frequency) return; -#ifndef __rtems__ - (void)tc->tc_get_timecount(tc); -#endif /* __rtems__ */ timecounter = tc; -#ifdef __rtems__ tc_windup(NULL); #endif /* __rtems__ */ } @@ -2224,6 +2234,9 @@ inittimehands(void *dummy) for (i = 1, thp = &ths[0]; i < timehands_count; thp = &ths[i++]) thp->th_next = &ths[i]; thp->th_next = &ths[0]; + + TUNABLE_STR_FETCH("kern.timecounter.hardware", tc_from_tunable, + sizeof(tc_from_tunable)); } SYSINIT(timehands, SI_SUB_TUNABLES, SI_ORDER_ANY, inittimehands, NULL); |