summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/kern_tc.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* score: Make SMP only code explicitSebastian Huber2022-06-231-0/+4
| | | | | | | Conditional expressions with inline functions are not optimized away if optimization is disabled. Avoid such expressions to prevent dead branches. It helps also during code review to immediately see if a loop is used or not.
* kern_tc.c: Provide a weak hardpps() implementationSebastian Huber2022-06-231-0/+12
| | | | | | | The real implementation of hardpps() is defined in kern_ntptime.c. Use it only if the NTP support is needed by the application. Update #2349.
* kern_tc.c: Update pps_event() for uniprocessor configurationsGabriel Moyano2022-06-101-0/+6
| | | | | | Since pps->capgen equal to zero is not a special value in uniprocessor configurations, there is no need to check for this condition. Update #2349
* score: Fix pps_fetch()Sebastian Huber2022-05-271-1/+2
| | | | | | Return early only if there was a timeout, otherwise return the PPS info. Update #2349.
* kern_tc.c: Enable PPS API supportGabriel Moyano2022-05-231-4/+0
| | | | Update #2349.
* kern_tc.c: Add definitions required by PPS APIGabriel Moyano2022-05-231-0/+6
| | | | Update #2349.
* score: Rename tc_getfrequency()Gabriel Moyano2022-05-231-1/+1
| | | | | | Rename tc_getfrequency() to _Timecounter_Get_frequency(). Update #2349.
* kern_tc.c: Replace FreeBSD event mechanism by adding pointers to functionGabriel Moyano2022-05-231-0/+41
| | | | Update #2349.
* kern_tc.c: Add atomic dependencies required by the PPS APIGabriel Moyano2022-05-231-0/+7
| | | | Update #2349.
* kern_ntptime.c: Port to RTEMSSebastian Huber2022-02-211-3/+3
| | | | | | Remove previous adjtime() implementation. Update #2348.
* kern_tc: unify timecounter to bintime delta conversionAndriy Gapon2022-02-211-21/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There are two places where we convert from a timecounter delta to a bintime delta: tc_windup and bintime_off. Both functions use the same calculations when the timecounter delta is small. But for a large delta (greater than approximately an equivalent of 1 second) the calculations were different. Both functions use approximate calculations based on th_scale that avoid division. Both produce values slightly greater than a true value, calculated with division by tc_frequency, would be. tc_windup is slightly more accurate, so its result is closer to the true value and, thus, smaller than bintime_off result. As a consequence there can be a jump back in time when time hands are switched after a long period of time (a large delta). Just before the switch the time would be calculated with a large delta from th_offset_count in bintime_off. tc_windup does the switch using its own calculations of a new th_offset using the large delta. As explained earlier, the new th_offset may end up being less than the previously produced binuptime. So, for a period of time new binuptime values may be "back in time" comparing to values just before the switch. Such a jump must never happen. All the code assumes that the uptime is monotonically nondecreasing and some code works incorrectly when that assumption is broken. For example, we have observed sleepq_timeout() ignoring a timeout when the sbinuptime value obtained by the callout code was greater than the expiration value, but the sbinuptime obtained in sleepq_timeout() was less than it. In that case the target thread would never get woken up. The unified calculations should ensure the monotonic property of the uptime. The problem is quite rare as normally tc_windup should be called HZ times per second (typically 1000 or 100). But it may happen in VMs on very busy hypervisors where a VM's virtual CPU may not get an execution time slot for a second or more. Reviewed by: kib MFC after: 2 weeks Sponsored by: Panzura LLC
* timecounter: Initialize tc_lock earlierMark Johnston2022-02-211-1/+2
| | | | | | | | | | | | | Hyper-V wants to register its MSR-based timecounter during SI_SUB_HYPERVISOR, before SI_SUB_LOCK, since an emulated 8254 may not be available for DELAY(). So we cannot use MTX_SYSINIT to initialize the timecounter lock. PR: 259878 Reviewed by: kib MFC after: 3 days Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D33014
* rtems: Add new clock manager directivesSebastian Huber2021-11-151-0/+56
| | | | Update #4527.
* score: Add _Timecounter_Set_NTP_update_second()Sebastian Huber2021-11-151-5/+25
| | | | | | | Allow the installation of an NTP update second handler which may be used by an NTP service. Update #2348.
* score: Optimize timehand updates for non-SMPSebastian Huber2021-11-151-8/+36
| | | | | | In uniprocessor configurations, the timehand updates are done with interrupts disabled. So, it is impossible to observe a generation number of zero.
* score: Port large time delta support to RTEMSSebastian Huber2021-11-151-3/+22
|
* score: Initialize timehand generation to UINT_MAXSebastian Huber2021-11-151-1/+1
| | | | | This leads to a timehand generation overflow right at the system start and helps to get code coverage in test programs.
* timecounter: Load the currently selected tc once in tc_windup()Mark Johnston2021-11-151-7/+16
| | | | | | | | Reported by: Sebastian Huber <sebastian.huber@embedded-brains.de> Reviewed by: kib MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D32729
* kern_tc.c: Scaling/large delta recalculationSebastian Huber2021-11-151-38/+50
| | | | | | | | | | | | | | | | | | | | | This change is a slight performance optimization for systems with a slow 64-bit division. The th->th_scale and th->th_large_delta values only depend on the timecounter frequency and the th->th_adjustment. The timecounter frequency of a timehand only changes when a new timecounter is activated for the timehand. The th->th_adjustment is only changed by the NTP second update. The NTP second update is not done for every call of tc_windup(). Move the code block to recalculate the scaling factor and the large delta of a timehand to the new helper function recalculate_scaling_factor_and_large_delta(). Call recalculate_scaling_factor_and_large_delta() when a new timecounter is activated and a NTP second update occurred. MFC after: 1 week
* timecounter: Lock the timecounter listMark Johnston2021-11-151-10/+30
| | | | | | | | | | | | | | | | | Timecounter registration is dynamic, i.e., there is no requirement that timecounters must be registered during single-threaded boot. Loadable drivers may in principle register timecounters (which can be switched to automatically). Timecounters cannot be unregistered, though this could be implemented. Registered timecounters belong to a global linked list. Add a mutex to synchronize insertions and the traversals done by (mpsafe) sysctl handlers. No functional change intended. Reviewed by: imp, kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D32511
* timecounter: Let kern.timecounter.stepwarnings be set as a tunableMark Johnston2021-11-151-1/+1
| | | | MFC after: 1 week
* Remove "All Rights Reserved" fromEd Maste2021-11-151-1/+0
| | | | | | | | | FreeBSD Foundation sys/ copyrights These ones were unambiguous cases where the Foundation was the only listed copyright holder (in the associated license block). Sponsored by: The FreeBSD Foundation
* kern: clarify boot timeWarner Losh2021-11-151-1/+7
| | | | | | | | | | | | | | In FreeBSD, the current time is computed from uptime + boottime. Uptime is a continuous, smooth function that's monotonically increasing. To effect changes to the current time, boottime is adjusted. boottime is mutable and shouldn't be cached against future need. Document the current implementation, with the caveat that we may stop stepping boottime on resume in the future and will step uptime instead (noted in the commit message, but not in the code). Sponsored by: Netflix Reviewed by: phk, rpokala Differential Revision: https://reviews.freebsd.org/D30116
* Make kern.timecounter.hardware tunableKonstantin Belousov2021-11-151-5/+18
| | | | | | | Noted and reviewed by: kevans MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D29122
* Add ddb 'show timecounter' command.Konstantin Belousov2021-11-151-1/+31
| | | | | MFC after: 1 week Sponsored by: The FreeBSD Foundation
* Changes that improve DTrace FBT reliabilityRobert Watson2021-11-151-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | on freebsd/arm64: - Implement a dtrace_getnanouptime(), matching the existing dtrace_getnanotime(), to avoid DTrace calling out to a potentially instrumentable function. (These should probably both be under KDTRACE_HOOKS. Also, it's not clear to me that they are correct implementations for the DTrace thread time functions they are used in .. fixes for another commit.) - Don't allow FBT to instrument functions involved in EL1 exception handling that are involved in FBT trap processing: handle_el1h_sync() and do_el1h_sync(). - Don't allow FBT to instrument DDB and KDB functions, as that makes it rather harder to debug FBT problems. Prior to these changes, use of FBT on FreeBSD/arm64 rapidly led to kernel panics due to recursion in DTrace. Reliable FBT on FreeBSD/arm64 is reliant on another change from @andrew to have the aarch64 instrumentor more carefully check that instructions it replaces are against the stack pointer, which can otherwise lead to memory corruption. That change remains under review. MFC after: 2 weeks Reviewed by: andrew, kp, markj (earlier version), jrtc27 (earlier version) Differential revision: https://reviews.freebsd.org/D27766
* Remove double-calls to tc_get_timecount()Konstantin Belousov2021-11-151-3/+0
| | | | | | | | | | | to warm timecounters. It seems that second call does not add any useful state change for all implemented timecounters. Discussed with: bde Sponsored by: The FreeBSD Foundation MFC after: 3 weeks
* Mark more nodes as CTLFLAG_MPSAFEPawel Biernacki2021-11-151-13/+24
| | | | | | | | | | | | | | | | | | or CTLFLAG_NEEDGIANT (17 of many) r357614 added CTLFLAG_NEEDGIANT to make it easier to find nodes that are still not MPSAFE (or already are but aren’t properly marked). Use it in preparation for a general review of all nodes. This is non-functional change that adds annotations to SYSCTL_NODE and SYSCTL_PROC nodes using one of the soon-to-be-required flags. Mark all obvious cases as MPSAFE. All entries that haven't been marked as MPSAFE before are by default marked as NEEDGIANT Approved by: kib (mentor, blanket) Commented by: kib, gallatin, melifaro Differential Revision: https://reviews.freebsd.org/D23718
* Consolidate read code for timecountersKonstantin Belousov2021-11-151-145/+87
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | and fix possible overflow in bintime()/binuptime(). The algorithm to read the consistent snapshot of current timehand is repeated in each accessor, including the details proper rollup detection and synchronization with the writer. In fact there are only two different kind of readers: one for bintime()/binuptime() which has to do the in-place calculation, and another kind which fetches some member from struct timehand. Extract the logic into type-checked macros, GETTHBINTIME() for bintime calculation, and GETTHMEMBER() for safe read of a structure' member. This way, the synchronization is only written in bintime_off() and getthmember(). In bintime_off(), use overflow-safe calculation of th_scale * delta(timecounter). In tc_windup, pre-calculate the min delta value which overflows and require slow algorithm, into the new timehands th_large_delta member. This part with overflow fix was written by Bruce Evans. Reported by: Mark Millard <marklmi@yahoo.com> (the overflow issue) Tested by: pho Discussed with: emaste Sponsored by: The FreeBSD Foundation (kib) MFC after: 3 weeks
* Remove duplicated empty lines from kern/*.cMateusz Guzik2021-11-151-1/+0
| | | | No functional changes.
* Initialize timehands linkage much earlier.Konstantin Belousov2021-11-151-12/+22
| | | | | | Reported and tested by: trasz Sponsored by: The FreeBSD Foundation MFC after: 1 week
* Make timehands count selectable at boottime.Konstantin Belousov2021-11-151-5/+45
| | | | | | | | | | | Tested by: O'Connor, Daniel <darius@dons.net.au> Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D21563 This patch was modified by Sebastian Huber <sebastian.huber@embedded-brains.de> to adjust it for RTEMS. See comment in the patch.
* Instead of using an incomplete list of platformsOlivier Houchard2021-11-151-1/+2
| | | | | that uses 64bits time_t in 32bits mode, special case amd64, as i386 is the only arch that still uses 32bits time_t.
* Create a new macro for static DPCPU data.Andrew Turner2021-11-151-2/+2
| | | | | | | | | | | | | | On arm64 (and possible other architectures) we are unable to use static DPCPU data in kernel modules. This is because the compiler will generate PC-relative accesses, however the runtime-linker expects to be able to relocate these. In preparation to fix this create two macros depending on if the data is global or static. Reviewed by: bz, emaste, markj Sponsored by: ABT Systems Ltd Differential Revision: https://reviews.freebsd.org/D16140
* tc: bcopy -> memcpyMateusz Guzik2021-11-151-2/+1
|
* Move most of the contents of opt_compat.hBrooks Davis2021-11-151-1/+0
| | | | | | | | | | | | | | | | | | | | to opt_global.h. opt_compat.h is mentioned in nearly 180 files. In-progress network driver compabibility improvements may add over 100 more so this is closer to "just about everywhere" than "only some files" per the guidance in sys/conf/options. Keep COMPAT_LINUX32 in opt_compat.h as it is confined to a subset of sys/compat/linux/*.c. A fake _COMPAT_LINUX option ensure opt_compat.h is created on all architectures. Move COMPAT_LINUXKPI to opt_dontuse.h as it is only used to control the set of compiled files. Reviewed by: kib, cem, jhb, jtl Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D14941
* score: Remove FreeBSD identifierSebastian Huber2021-11-151-1/+1
|
* Use atomic_load(9) to read ppsinfo sequence numbers.Konstantin Belousov2021-11-151-4/+4
| | | | | | | | | | In this case volatile qualifiers enusre that a compiler does not optimize the accesses out. Reviewed by: alc, jhb Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D13534
* SPDX: use the Beerware identifier.Pedro F. Giffuni2021-11-151-0/+2
|
* kern_tc.c: Remove unused codeSebastian Huber2021-02-011-6/+0
| | | | This fix relates to a Coverity issue (PW.DECLARED_BUT_NOT_REFERENCED).
* score: Canonicalize Doxygen @file commentsSebastian Huber2020-12-021-0/+17
| | | | | | Use common phrases for the file brief descriptions. Update #3706.
* score: Install timecounter according to qualitySebastian Huber2019-10-021-0/+2
| | | | | | This makes it possible to install higher quality timecounter in plug-and-play systems and helps to override the clock driver provided timecounter in some test scenarios.
* score: Remove strange timecounter init stepSebastian Huber2019-10-021-1/+1
| | | | | The double call of the timecounter get method was added to FreeBSD in 2002 without a comment. It is not clear why this is needed.
* score: Remove superfluous timecounter membersSebastian Huber2019-10-021-3/+7
|
* Update FreeBSD kernel timespec supportSebastian Huber2018-08-231-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This change is based on the following FreeBSD commit: "Make timespecadd(3) and friends public The timespecadd(3) family of macros were imported from NetBSD back in r35029. However, they were initially guarded by #ifdef _KERNEL. In the meantime, we have grown at least 28 syscalls that use timespecs in some way, leading many programs both inside and outside of the base system to redefine those macros. It's better just to make the definitions public. Our kernel currently defines two-argument versions of timespecadd and timespecsub. NetBSD, OpenBSD, and FreeDesktop.org's libbsd, however, define three-argument versions. Solaris also defines a three-argument version, but only in its kernel. This revision changes our definition to match the common three-argument version. Bump _FreeBSD_version due to the breaking KPI change. Discussed with: cem, jilles, ian, bde Differential Revision: https://reviews.freebsd.org/D14725" To make the change public (outside #ifdef _KERNEL) it must be integrated in Newlib. Update #3472.
* score: Change _Timecounter_Time_uptime to int32_tSebastian Huber2017-11-091-1/+2
| | | | | | | Move basic timecounter API shared with BSD network stack to <machine/_timecounter.h>. Update #3185.
* timecounter: Update FreeBSD identifiersSebastian Huber2017-10-121-1/+1
| | | | Update #3175.
* timecounter: Merge FreeBSD change r324528Konstantin Belousov2017-10-121-3/+1
| | | | | | | | | | | | The th_bintime, th_microtime and th_nanotime members of the timehand all cache the last system time (uptime + boottime). Only the format differs. Do not re-calculate the bintime and simply use the value used to calculate the microtime and nanotime. Group all the updates under the relevant comment. Remove obsoleted XXX part. Submitted by: Sebastian Huber <sebastian.huber@embedded-brains.de> MFC after: 1 week Update #3175.
* timecounter: Merge FreeBSD change r315287Eric van Gyzen2017-10-121-0/+10
| | | | | | | | | | | | | | | | | | Add missing pieces of r315280 I moved this branch from github to a private server, and pulled from the wrong one when committing r315280, so I failed to include two recent commits. Thankfully, they were only cosmetic and were included in the review. Specifically: Add documentation, polish comments, and improve style(9). Tested by: pho (r315280) MFC after: 2 weeks Sponsored by: Dell EMC Differential Revision: https://reviews.freebsd.org/D9791 Update #3175.
* timecounter: Merge FreeBSD change r315280Eric van Gyzen2017-10-121-0/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the RTC is adjusted, reevaluate absolute sleep times based on the RTC POSIX 2008 says this about clock_settime(2): If the value of the CLOCK_REALTIME clock is set via clock_settime(), the new value of the clock shall be used to determine the time of expiration for absolute time services based upon the CLOCK_REALTIME clock. This applies to the time at which armed absolute timers expire. If the absolute time requested at the invocation of such a time service is before the new value of the clock, the time service shall expire immediately as if the clock had reached the requested time normally. Setting the value of the CLOCK_REALTIME clock via clock_settime() shall have no effect on threads that are blocked waiting for a relative time service based upon this clock, including the nanosleep() function; nor on the expiration of relative timers based upon this clock. Consequently, these time services shall expire when the requested relative interval elapses, independently of the new or old value of the clock. When the real-time clock is adjusted, such as by clock_settime(3), wake any threads sleeping until an absolute real-clock time. Such a sleep is indicated by a non-zero td_rtcgen. The sleep functions will set that field to zero and return zero to tell the caller to reevaluate its sleep duration based on the new value of the clock. At present, this affects the following functions: pthread_cond_timedwait(3) pthread_mutex_timedlock(3) pthread_rwlock_timedrdlock(3) pthread_rwlock_timedwrlock(3) sem_timedwait(3) sem_clockwait_np(3) I'm working on adding clock_nanosleep(2), which will also be affected. Reported by: Sebastian Huber <sebastian.huber@embedded-brains.de> Reviewed by: jhb, kib MFC after: 2 weeks Relnotes: yes Sponsored by: Dell EMC Differential Revision: https://reviews.freebsd.org/D9791 Update #3175.