public inbox for [email protected]
help / color / mirror / Atom feedFrom: Andres Freund <[email protected]>
Subject: [PATCH v26a 2/2] fixup! instrumentation: Show additional TSC clock source info in pg_test_timing
Date: Thu, 9 Apr 2026 11:55:58 -0400
---
src/include/portability/instr_time.h | 2 ++
src/common/instr_time.c | 18 +++++++++++++++--
src/port/pg_cpu_x86.c | 3 ---
src/bin/pg_test_timing/pg_test_timing.c | 27 +++++++++++++++++--------
4 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h
index 4917728afc3..46307fd47a9 100644
--- a/src/include/portability/instr_time.h
+++ b/src/include/portability/instr_time.h
@@ -161,6 +161,7 @@ extern PGDLLIMPORT bool timing_tsc_enabled;
*/
extern PGDLLIMPORT int32 timing_tsc_frequency_khz;
+
#if PG_INSTR_TSC_CLOCK
extern void pg_initialize_timing_tsc(void);
@@ -178,6 +179,7 @@ extern const TscClockSourceInfo *pg_timing_tsc_clock_source_info(void);
#endif /* PG_INSTR_TSC_CLOCK */
+
/*
* Returns the current timing clock source effectively in use, resolving
* TIMING_CLOCK_SOURCE_AUTO to either TIMING_CLOCK_SOURCE_SYSTEM or
diff --git a/src/common/instr_time.c b/src/common/instr_time.c
index 2523d6a0df6..0db19673490 100644
--- a/src/common/instr_time.c
+++ b/src/common/instr_time.c
@@ -208,9 +208,23 @@ tsc_detect_frequency(void)
tsc_info.frequency_khz = 0;
tsc_info.frequency_source[0] = '\0';
+ strlcat(tsc_info.frequency_source, "x86",
+ sizeof(tsc_info.frequency_source));
+
/* We require RDTSCP support and an invariant TSC, bail if not available */
- if (!x86_feature_available(PG_RDTSCP) || !x86_feature_available(PG_TSC_INVARIANT))
+ if (!x86_feature_available(PG_RDTSCP))
+ {
+ strlcat(tsc_info.frequency_source, ", no rdtscp",
+ sizeof(tsc_info.frequency_source));
return;
+ }
+
+ if (!x86_feature_available(PG_TSC_INVARIANT))
+ {
+ strlcat(tsc_info.frequency_source, ", not invariant",
+ sizeof(tsc_info.frequency_source));
+ return;
+ }
/* Determine speed at which the TSC advances */
timing_tsc_frequency_khz = x86_tsc_frequency_khz(tsc_info.frequency_source,
@@ -231,7 +245,7 @@ tsc_detect_frequency(void)
timing_tsc_frequency_khz = tsc_info.calibrated_frequency_khz;
if (timing_tsc_frequency_khz > 0)
{
- strlcpy(tsc_info.frequency_source, "x86, calibration",
+ strlcat(tsc_info.frequency_source, ", calibration",
sizeof(tsc_info.frequency_source));
tsc_info.frequency_khz = timing_tsc_frequency_khz;
}
diff --git a/src/port/pg_cpu_x86.c b/src/port/pg_cpu_x86.c
index c097807fc7f..56925e9aa51 100644
--- a/src/port/pg_cpu_x86.c
+++ b/src/port/pg_cpu_x86.c
@@ -169,9 +169,6 @@ x86_tsc_frequency_khz(char *source, size_t source_len)
{
unsigned int reg[4] = {0};
- if (source)
- strlcpy(source, "x86", source_len);
-
/*
* If we're inside a virtual machine, try to fetch the TSC frequency from
* the hypervisor, using a hypervisor specific method.
diff --git a/src/bin/pg_test_timing/pg_test_timing.c b/src/bin/pg_test_timing/pg_test_timing.c
index ef5dd90c41f..5cb551fa7b0 100644
--- a/src/bin/pg_test_timing/pg_test_timing.c
+++ b/src/bin/pg_test_timing/pg_test_timing.c
@@ -197,17 +197,28 @@ test_tsc_timing(void)
loop_count = test_timing(test_duration, TIMING_CLOCK_SOURCE_TSC, true);
output(loop_count);
printf("\n");
+ }
- info = pg_timing_tsc_clock_source_info();
- printf(_("TSC frequency in use: %d kHz\n"), info->frequency_khz);
- if (info->frequency_source[0] != '\0')
- printf(_("TSC frequency source: %s\n"), info->frequency_source);
+ /*
+ * Report TSC information regardless of whether it was usable, makes
+ * debugging a lot easier.
+ */
+ info = pg_timing_tsc_clock_source_info();
+ if (info->frequency_source[0] != '\0')
+ printf(_("TSC frequency source: %s\n"), info->frequency_source);
+ printf(_("TSC frequency in use: %d kHz\n"), info->frequency_khz);
- if (info->calibrated_frequency_khz > 0)
- printf(_("TSC frequency from calibration: %d kHz\n"), info->calibrated_frequency_khz);
- else
- printf(_("TSC calibration did not converge\n"));
+ if (info->calibrated_frequency_khz > 0)
+ printf(_("TSC frequency from calibration: %d kHz\n"), info->calibrated_frequency_khz);
+ else
+ printf(_("TSC calibration did not converge\n"));
+ /*
+ * Report whether TSC was usable and, if so, whether it will be used
+ * automatically.
+ */
+ if (loop_count > 0)
+ {
pg_set_timing_clock_source(TIMING_CLOCK_SOURCE_AUTO);
if (pg_current_timing_clock_source() == TIMING_CLOCK_SOURCE_TSC)
printf(_("TSC clock source will be used by default, unless timing_clock_source is set to 'system'.\n"));
--
2.53.0.1.gb2826b52eb
--5ynaw2hkmtmijn2o--
view thread (271+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v26a 2/2] fixup! instrumentation: Show additional TSC clock source info in pg_test_timing
In-Reply-To: <no-message-id-602202@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox