* [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC
@ 2026-05-04 9:39 Andrea Cervesato
2026-05-04 9:54 ` Cyril Hrubis
0 siblings, 1 reply; 5+ messages in thread
From: Andrea Cervesato @ 2026-05-04 9:39 UTC (permalink / raw)
To: Linux Test Project
From: Andrea Cervesato <andrea.cervesato@suse.com>
The clock_settime helpers.h used a compile-time #ifdef on
_POSIX_MONOTONIC_CLOCK to select between real and stub
implementations of pts_mono_time_start()/pts_mono_time_check().
On Linux/glibc, _POSIX_MONOTONIC_CLOCK is defined as 0, meaning
support is optional and must be verified at runtime via
sysconf(_SC_MONOTONIC_CLOCK). The #ifdef treated 0 the same as
>0 (always available), which is not POSIX-correct.
Replace the compile-time #ifdef/#else split with a runtime
pts_mono_available() helper that performs proper POSIX detection
via sysconf(). Extract pts_mono_available() into the shared
include/clock.h so it can be reused by nanosleep helpers as well.
Also add a missing #ifndef include guard and #include <unistd.h>
so _POSIX_MONOTONIC_CLOCK is always defined.
Fixes: 9ecb4a004b18 ("clock_settime: Detect external clock adjustments via CLOCK_MONOTONIC")
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
Changes in v4:
- verify that CLOCK_MONOTONIC exists vs _POSIX_MONOTONIC_CLOCK
- Link to v3: https://lore.kernel.org/r/20260429-fix_clock_settime_helper-v3-1-2608c39d8499@suse.com
---
.../conformance/interfaces/clock_settime/4-1.c | 1 +
.../conformance/interfaces/clock_settime/5-1.c | 1 +
.../conformance/interfaces/clock_settime/5-2.c | 1 +
.../conformance/interfaces/clock_settime/7-1.c | 1 +
.../conformance/interfaces/clock_settime/7-2.c | 1 +
.../conformance/interfaces/clock_settime/helpers.h | 56 +---------------
testcases/open_posix_testsuite/include/clock.h | 77 ++++++++++++++++++++++
7 files changed, 85 insertions(+), 53 deletions(-)
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/4-1.c b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/4-1.c
index 631aad7debb242df88bd3493319a82add7e9f0e9..ebd609963a3651212447ff2ab0885e20b19ba302 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/4-1.c
+++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/4-1.c
@@ -28,6 +28,7 @@
#include <signal.h>
#include <unistd.h>
#include "posixtest.h"
+#include "clock.h"
#include "helpers.h"
// SLEEPTIME < TIMEROFFSET
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-1.c b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-1.c
index ff8660f18e73df472463ebd7316a436402b1b6ba..06023036cf4c704c43ec64cfaed75157973f3524 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-1.c
+++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-1.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include <stdlib.h>
#include "posixtest.h"
+#include "clock.h"
#include "helpers.h"
#define TIMERSEC 5
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-2.c b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-2.c
index de1a8e422f86e2cd71e8237fe77d5083f541b599..bb4e86c2fef77e75f9216c7fe59930d71e5715a0 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-2.c
+++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/5-2.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include <stdlib.h>
#include "posixtest.h"
+#include "clock.h"
#include "helpers.h"
#define TIMERSEC 5
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-1.c b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-1.c
index 7009b38b42a730a3526724c14843f1656a16d30a..0ed40fe612506d5a571003d4d9b592a3faab608c 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-1.c
+++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-1.c
@@ -24,6 +24,7 @@
#include <unistd.h>
#include <sys/wait.h>
#include "posixtest.h"
+#include "clock.h"
#include "helpers.h"
#define SLEEPOFFSET 5
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-2.c b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-2.c
index 6713369be4c31c4076a493a224a85f24b5120a83..6162152e574e51cfce095b518314132d331ee68f 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-2.c
+++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/7-2.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include <sys/wait.h>
#include "posixtest.h"
+#include "clock.h"
#include "helpers.h"
#define SLEEPOFFSET 5
diff --git a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/helpers.h b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/helpers.h
index 37bf30926f039553e9e370751b7938ca5ea1d00a..c559c189c163d7f7e1fb995b0806933504b278ab 100644
--- a/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/helpers.h
+++ b/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/helpers.h
@@ -13,7 +13,8 @@
* by those tests.
*/
-#include <stdlib.h>
+#ifndef CLOCK_SETTIME_HELPERS_H
+#define CLOCK_SETTIME_HELPERS_H
static int getBeforeTime(struct timespec *tpget)
{
@@ -35,55 +36,4 @@ static int setBackTime(struct timespec tpset)
return PTS_PASS;
}
-#define PTS_MONO_MAX_RETRIES 3
-
-#ifdef _POSIX_MONOTONIC_CLOCK
-static struct timespec _pts_mono_start;
-
-static inline int pts_mono_time_start(void)
-{
- if (clock_gettime(CLOCK_MONOTONIC, &_pts_mono_start) != 0) {
- perror("clock_gettime(CLOCK_MONOTONIC) failed");
- return -1;
- }
- return 0;
-}
-
-static inline int pts_mono_time_check(unsigned int expected_secs)
-{
- struct timespec now;
- long elapsed;
-
- if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) {
- perror("clock_gettime(CLOCK_MONOTONIC) failed");
- return -1;
- }
-
- elapsed = now.tv_sec - _pts_mono_start.tv_sec;
-
- if (labs(elapsed - (long)expected_secs) > 1) {
- printf("Clock adjustment detected (elapsed %lds, expected ~%us)\n",
- elapsed, expected_secs);
- return 1;
- }
- return 0;
-}
-#else
-static inline int pts_mono_time_start(void)
-{
- static int warned;
-
- if (!warned) {
- printf("CLOCK_MONOTONIC unavailable, test may fail due to clock adjustment\n");
- warned = 1;
- }
- return 0;
-}
-
-static inline int pts_mono_time_check(unsigned int expected_secs)
-{
- (void)expected_secs;
- return 0;
-}
-#endif
-
+#endif /* CLOCK_SETTIME_HELPERS_H */
diff --git a/testcases/open_posix_testsuite/include/clock.h b/testcases/open_posix_testsuite/include/clock.h
new file mode 100644
index 0000000000000000000000000000000000000000..9a97270cdc7a5ea5c5f52adc5a253eb55912d1aa
--- /dev/null
+++ b/testcases/open_posix_testsuite/include/clock.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2026, Linux Test Project
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef PTS_CLOCK_H
+#define PTS_CLOCK_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+static inline int pts_mono_available(void)
+{
+#ifdef CLOCK_MONOTONIC
+ if (_POSIX_MONOTONIC_CLOCK > 0)
+ return 1;
+
+ if (!_POSIX_MONOTONIC_CLOCK && sysconf(_SC_MONOTONIC_CLOCK) > 0)
+ return 1;
+#endif
+ return 0;
+}
+
+#define PTS_MONO_MAX_RETRIES 3
+
+static struct timespec pts_mono_start;
+
+static inline int pts_mono_time_start(void)
+{
+ if (!pts_mono_available()) {
+ static int warned;
+
+ if (!warned) {
+ printf("CLOCK_MONOTONIC unavailable, test may fail due to clock adjustment\n");
+ warned = 1;
+ }
+ return 0;
+ }
+
+#ifdef CLOCK_MONOTONIC
+ if (clock_gettime(CLOCK_MONOTONIC, &pts_mono_start) != 0) {
+ perror("clock_gettime(CLOCK_MONOTONIC) failed");
+ return -1;
+ }
+#endif
+ return 0;
+}
+
+static inline int pts_mono_time_check(unsigned int expected_secs)
+{
+#ifdef CLOCK_MONOTONIC
+ if (pts_mono_available()) {
+ struct timespec now;
+ long elapsed;
+
+ if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) {
+ perror("clock_gettime(CLOCK_MONOTONIC) failed");
+ return -1;
+ }
+
+ elapsed = now.tv_sec - pts_mono_start.tv_sec;
+
+ if (labs(elapsed - (long)expected_secs) > 1) {
+ printf("Clock adjustment detected (elapsed %lds, expected ~%us)\n",
+ elapsed, expected_secs);
+ return 1;
+ }
+ return 0;
+ }
+#endif
+ (void)expected_secs;
+ return 0;
+}
+
+#endif /* PTS_CLOCK_H */
---
base-commit: 73cfad509db014e5a631bd2298f4e9d8ea3ee1c1
change-id: 20260429-fix_clock_settime_helper-7670708ed94f
Best regards,
--
Andrea Cervesato <andrea.cervesato@suse.com>
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC
2026-05-04 9:39 [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC Andrea Cervesato
@ 2026-05-04 9:54 ` Cyril Hrubis
2026-05-04 10:22 ` Andrea Cervesato via ltp
0 siblings, 1 reply; 5+ messages in thread
From: Cyril Hrubis @ 2026-05-04 9:54 UTC (permalink / raw)
To: Andrea Cervesato; +Cc: Linux Test Project
Hi!
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <time.h>
> +#include <unistd.h>
> +
> +static inline int pts_mono_available(void)
> +{
> +#ifdef CLOCK_MONOTONIC
This one should have stayed _POSIX_MONOTONIC_CLOCK since we are doing a
presence checks and the -1 is correctly handled here (we get to return 0
case in this case).
> + if (_POSIX_MONOTONIC_CLOCK > 0)
> + return 1;
> +
> + if (!_POSIX_MONOTONIC_CLOCK && sysconf(_SC_MONOTONIC_CLOCK) > 0)
> + return 1;
> +#endif
> + return 0;
> +}
> +
> +#define PTS_MONO_MAX_RETRIES 3
> +
> +static struct timespec pts_mono_start;
> +
> +static inline int pts_mono_time_start(void)
> +{
> + if (!pts_mono_available()) {
> + static int warned;
> +
> + if (!warned) {
> + printf("CLOCK_MONOTONIC unavailable, test may fail due to clock adjustment\n");
> + warned = 1;
> + }
> + return 0;
> + }
> +
> +#ifdef CLOCK_MONOTONIC
> + if (clock_gettime(CLOCK_MONOTONIC, &pts_mono_start) != 0) {
> + perror("clock_gettime(CLOCK_MONOTONIC) failed");
> + return -1;
> + }
> +#endif
These are guarding againts compilation failures and looks fine to me
now.
> + return 0;
> +}
> +
> +static inline int pts_mono_time_check(unsigned int expected_secs)
> +{
> +#ifdef CLOCK_MONOTONIC
> + if (pts_mono_available()) {
> + struct timespec now;
> + long elapsed;
> +
> + if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) {
> + perror("clock_gettime(CLOCK_MONOTONIC) failed");
> + return -1;
> + }
> +
> + elapsed = now.tv_sec - pts_mono_start.tv_sec;
> +
> + if (labs(elapsed - (long)expected_secs) > 1) {
> + printf("Clock adjustment detected (elapsed %lds, expected ~%us)\n",
> + elapsed, expected_secs);
> + return 1;
> + }
> + return 0;
> + }
> +#endif
> + (void)expected_secs;
> + return 0;
> +}
> +
> +#endif /* PTS_CLOCK_H */
>
> ---
> base-commit: 73cfad509db014e5a631bd2298f4e9d8ea3ee1c1
> change-id: 20260429-fix_clock_settime_helper-7670708ed94f
>
> Best regards,
> --
> Andrea Cervesato <andrea.cervesato@suse.com>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC
2026-05-04 9:54 ` Cyril Hrubis
@ 2026-05-04 10:22 ` Andrea Cervesato via ltp
2026-05-04 10:24 ` Cyril Hrubis
0 siblings, 1 reply; 5+ messages in thread
From: Andrea Cervesato via ltp @ 2026-05-04 10:22 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: Linux Test Project
> This one should have stayed _POSIX_MONOTONIC_CLOCK since we are doing a
> presence checks and the -1 is correctly handled here (we get to return 0
> case in this case).
If it's ok, i can merge with this change
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC
2026-05-04 10:22 ` Andrea Cervesato via ltp
@ 2026-05-04 10:24 ` Cyril Hrubis
2026-05-04 10:31 ` Andrea Cervesato via ltp
0 siblings, 1 reply; 5+ messages in thread
From: Cyril Hrubis @ 2026-05-04 10:24 UTC (permalink / raw)
To: Andrea Cervesato; +Cc: Linux Test Project
Hi!
> > This one should have stayed _POSIX_MONOTONIC_CLOCK since we are doing a
> > presence checks and the -1 is correctly handled here (we get to return 0
> > case in this case).
> If it's ok, i can merge with this change
Yes. With this change:
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC
2026-05-04 10:24 ` Cyril Hrubis
@ 2026-05-04 10:31 ` Andrea Cervesato via ltp
0 siblings, 0 replies; 5+ messages in thread
From: Andrea Cervesato via ltp @ 2026-05-04 10:31 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: Linux Test Project
Merged, Thanks!
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-05-04 10:31 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-04 9:39 [LTP] [PATCH v4] clock_settime: use POSIX runtime detection for CLOCK_MONOTONIC Andrea Cervesato
2026-05-04 9:54 ` Cyril Hrubis
2026-05-04 10:22 ` Andrea Cervesato via ltp
2026-05-04 10:24 ` Cyril Hrubis
2026-05-04 10:31 ` Andrea Cervesato via ltp
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox