[libc-commits] [libc] 99fe595 - [libc] implement clock_gettime using vDSO (#108458)
via libc-commits
libc-commits at lists.llvm.org
Fri Sep 13 07:58:43 PDT 2024
Author: Schrodinger ZHU Yifan
Date: 2024-09-13T10:58:39-04:00
New Revision: 99fe5954d258511ec2e36e8c7f612568e9701ab7
URL: https://github.com/llvm/llvm-project/commit/99fe5954d258511ec2e36e8c7f612568e9701ab7
DIFF: https://github.com/llvm/llvm-project/commit/99fe5954d258511ec2e36e8c7f612568e9701ab7.diff
LOG: [libc] implement clock_gettime using vDSO (#108458)
supersedes https://github.com/llvm/llvm-project/pull/91805
Added:
Modified:
libc/src/__support/time/linux/CMakeLists.txt
libc/src/__support/time/linux/clock_gettime.h
Removed:
################################################################################
diff --git a/libc/src/__support/time/linux/CMakeLists.txt b/libc/src/__support/time/linux/CMakeLists.txt
index 1b41c7cb0a98a9..4297a029866685 100644
--- a/libc/src/__support/time/linux/CMakeLists.txt
+++ b/libc/src/__support/time/linux/CMakeLists.txt
@@ -9,6 +9,7 @@ add_header_library(
libc.src.__support.common
libc.src.__support.error_or
libc.src.__support.OSUtil.osutil
+ libc.src.__support.OSUtil.vdso
)
add_header_library(
diff --git a/libc/src/__support/time/linux/clock_gettime.h b/libc/src/__support/time/linux/clock_gettime.h
index eca1ba70de5924..517cca91391a74 100644
--- a/libc/src/__support/time/linux/clock_gettime.h
+++ b/libc/src/__support/time/linux/clock_gettime.h
@@ -11,26 +11,47 @@
#include "hdr/types/clockid_t.h"
#include "hdr/types/struct_timespec.h"
+#include "src/__support/OSUtil/linux/vdso.h"
#include "src/__support/OSUtil/syscall.h"
#include "src/__support/common.h"
#include "src/__support/error_or.h"
#include "src/__support/macros/config.h"
#include <sys/syscall.h>
+#if defined(SYS_clock_gettime64)
+#include <linux/time_types.h>
+#endif
+
namespace LIBC_NAMESPACE_DECL {
namespace internal {
LIBC_INLINE ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts) {
-#if SYS_clock_gettime
- int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_clock_gettime,
- static_cast<long>(clockid),
- reinterpret_cast<long>(ts));
+ using namespace vdso;
+ int ret;
+#if defined(SYS_clock_gettime)
+ TypedSymbol<VDSOSym::ClockGetTime> clock_gettime;
+ if (LIBC_LIKELY(clock_gettime != nullptr))
+ ret = clock_gettime(clockid, ts);
+ else
+ ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_clock_gettime,
+ static_cast<long>(clockid),
+ reinterpret_cast<long>(ts));
#elif defined(SYS_clock_gettime64)
static_assert(
sizeof(time_t) == sizeof(int64_t),
"SYS_clock_gettime64 requires struct timespec with 64-bit members.");
- int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_clock_gettime64,
- static_cast<long>(clockid),
- reinterpret_cast<long>(ts));
+
+ TypedSymbol<VDSOSym::ClockGetTime64> clock_gettime64;
+ __kernel_timespec ts64{};
+ if (LIBC_LIKELY(clock_gettime64 != nullptr))
+ ret = clock_gettime64(clockid, &ts64);
+ else
+ ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_clock_gettime64,
+ static_cast<long>(clockid),
+ reinterpret_cast<long>(&ts64));
+ if (ret == 0) {
+ ts->tv_sec = static_cast<decltype(ts->tv_sec)>(ts64.tv_sec);
+ ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(ts64.tv_nsec);
+ }
#else
#error "SYS_clock_gettime and SYS_clock_gettime64 syscalls not available."
#endif
More information about the libc-commits
mailing list