[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH Mach] Add a mach host operation which returns elapsed tim
From: |
Diego Nieto Cid |
Subject: |
Re: [RFC PATCH Mach] Add a mach host operation which returns elapsed time since bootup |
Date: |
Tue, 17 Dec 2024 23:02:01 -0300 |
El mar, 17 dic 2024 a las 22:21, Zhaoming Luo (<zhmingluo@163.com>) escribió:
>
> The precision of this implmentation is 10ms. Not sure how to do with the
> possible data race.
>
> Signed-off-by: Zhaoming Luo <zhmingluo@163.com>
> ---
> include/mach/mach_host.defs | 7 +++++++
> kern/mach_clock.c | 20 ++++++++++++++++++++
> 2 files changed, 27 insertions(+)
>
> diff --git a/include/mach/mach_host.defs b/include/mach/mach_host.defs
> index 8fd9d6b3..67f72cda 100644
> --- a/include/mach/mach_host.defs
> +++ b/include/mach/mach_host.defs
> @@ -386,3 +386,10 @@ routine host_adjust_time64(
> routine host_get_kernel_version(
> host : host_t;
> out kernel_version : new_kernel_version_t);
> +
> +/*
> + * Get the elapsed time on this host.
> + */
> +routine host_get_elapsed_time(
> + host : host_t;
> + out elapsed_time : time_value_t);
If I'm not mistaken, this is most commonly called `uptime` (like in
`host_get_uptime` or similar)
> +
> + read_elapsed_ticks = elapsed_ticks;
> + elapsed_usec = read_elapsed_ticks * tick;
> + elapsed_time->seconds = elapsed_usec / MICROSECONDS_IN_ONE_SECOND;
> + elapsed_time->microseconds = elapsed_usec %
> MICROSECONDS_IN_ONE_SECOND;
`read_elapsed_ticks` is only used to calculate elapsed_usec and thus
may be inlined, removing the otherwise unused variable
As for the data races, I believe you can use atomic builtins[1], like below:
elapsed_usec = __sync_fetch_and_add(&elapsed_tikcs, 0) * tick
Or you could also use the lock used to increment `elapsed_ticks`:
s = simple_lock_irq(&timer_lock);
elapsed_usec = elapsed_tikcs * tick;
simple_unlock_irq(s, &timer_lock);
I'm not sure which works best.
Cheers
---
[1] https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html