RFR: 8372625: [Linux] Remove unnecessary logic for supports_fast_thread_cpu_time
David Holmes
dholmes at openjdk.org
Thu Nov 27 04:43:50 UTC 2025
On Wed, 26 Nov 2025 22:43:26 GMT, Jonas Norlinder <jnorlinder at openjdk.org> wrote:
> For Linux we test if we can use `CLOCK_THREAD_CPUTIME_ID` but not the clocks supported by `pthread_getcpuclockid()`.
>
> The following comment has been around for at least 18 years according to the git commit history (points to the initial git commit from Dec 1, 2007):
>
>
> // Switch to using fast clocks for thread cpu time if
> // the sys_clock_getres() returns 0 error code.
> // Note, that some kernels may support the current thread
> // clock (CLOCK_THREAD_CPUTIME_ID) but not the clocks
> // returned by the pthread_getcpuclockid().
> // If the fast Posix clocks are supported then the sys_clock_getres()
> // must return at least tp.tv_sec == 0 which means a resolution
> // better than 1 sec. This is extra check for reliability.
>
>
> There was a time when the Linux kernel did not provide an implementation for `CLOCK_THREAD_CPUTIME_ID` (that arrived with v2.6.12). During this period, glibc emulated support for `clock_gettime(CLOCK_THREAD_CPUTIME_ID)` in userspace for the current thread only. `clock_gettime(CLOCK_THREAD_CPUTIME_ID)` will call `pthread_getcpuclockid` in https://elixir.bootlin.com/glibc/glibc-2.2.5/source/linuxthreads/sysdeps/pthread/getcpuclockid.c. The checks and comment exists because `CLOCK_THREAD_CPUTIME_ID` worked (via emulation) but `pthread_getcpuclockid()` failed.
>
> During that period of the early 2000s this check was indeed needed. But now sufficient time has passed and we don't support OpenJDK for that old kernel versions/glibc. Therefore, this check should be removed and some code can be cleaned up.
The fast/slow to total/user renaming could be done as a first step to simplify the comparison as that isn't really removing unnecessary logic. And you didn't quite remove all the logic I expected to be removed.
Comments below. Thanks
src/hotspot/os/linux/os_linux.cpp line 162:
> 160: uintptr_t os::Linux::_initial_thread_stack_size = 0;
> 161:
> 162: int (*os::Linux::_pthread_getcpuclockid)(pthread_t, clockid_t *) = (int(*)(pthread_t, clockid_t *)) dlsym(RTLD_DEFAULT, "pthread_getcpuclockid");
I expected to see this go away. Are we not guaranteed to have the function available at build time and run time?
src/hotspot/os/linux/os_linux.cpp line 4955:
> 4953: &user_time, &sys_time);
> 4954: if (count != 13) return -1;
> 4955: return ((jlong)sys_time + (jlong)user_time) * (1000000000 / os::Posix::clock_tics_per_second());
If this function is meant to be `user` time you kept the wrong line.
-------------
PR Review: https://git.openjdk.org/jdk/pull/28516#pullrequestreview-3513482225
PR Review Comment: https://git.openjdk.org/jdk/pull/28516#discussion_r2567110414
PR Review Comment: https://git.openjdk.org/jdk/pull/28516#discussion_r2567148791
More information about the hotspot-runtime-dev
mailing list