Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/xen/xen xen_clock(4): Sprinkle dtrace probes.
details: https://anonhg.NetBSD.org/src/rev/e6890a0dfd0f
branches: trunk
changeset: 374539:e6890a0dfd0f
user: riastradh <riastradh%NetBSD.org@localhost>
date: Mon May 01 09:03:19 2023 +0000
description:
xen_clock(4): Sprinkle dtrace probes.
diffstat:
sys/arch/xen/xen/xen_clock.c | 89 ++++++++++++++++++++++++++++++++++++++-----
1 files changed, 78 insertions(+), 11 deletions(-)
diffs (160 lines):
diff -r 49abe01a6c9a -r e6890a0dfd0f sys/arch/xen/xen/xen_clock.c
--- a/sys/arch/xen/xen/xen_clock.c Mon May 01 05:12:44 2023 +0000
+++ b/sys/arch/xen/xen/xen_clock.c Mon May 01 09:03:19 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: xen_clock.c,v 1.8 2020/11/30 17:05:02 bouyer Exp $ */
+/* $NetBSD: xen_clock.c,v 1.9 2023/05/01 09:03:19 riastradh Exp $ */
/*-
* Copyright (c) 2017, 2018 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_clock.c,v 1.8 2020/11/30 17:05:02 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_clock.c,v 1.9 2023/05/01 09:03:19 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -49,6 +49,7 @@
#include <sys/kernel.h>
#include <sys/lwp.h>
#include <sys/proc.h>
+#include <sys/sdt.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/time.h>
@@ -76,6 +77,50 @@ static unsigned xen_get_timecount(struct
static int xen_timer_handler(void *, struct clockframe *);
/*
+ * dtrace probes
+ */
+SDT_PROBE_DEFINE7(sdt, xen, clock, tsc__backward,
+ "uint64_t"/*raw_systime_ns*/,
+ "uint64_t"/*tsc_timestamp*/,
+ "uint64_t"/*tsc_to_system_mul*/,
+ "int"/*tsc_shift*/,
+ "uint64_t"/*delta_ns*/,
+ "uint64_t"/*tsc*/,
+ "uint64_t"/*systime_ns*/);
+SDT_PROBE_DEFINE7(sdt, xen, clock, tsc__delta__negative,
+ "uint64_t"/*raw_systime_ns*/,
+ "uint64_t"/*tsc_timestamp*/,
+ "uint64_t"/*tsc_to_system_mul*/,
+ "int"/*tsc_shift*/,
+ "uint64_t"/*delta_ns*/,
+ "uint64_t"/*tsc*/,
+ "uint64_t"/*systime_ns*/);
+SDT_PROBE_DEFINE7(sdt, xen, clock, systime__wraparound,
+ "uint64_t"/*raw_systime_ns*/,
+ "uint64_t"/*tsc_timestamp*/,
+ "uint64_t"/*tsc_to_system_mul*/,
+ "int"/*tsc_shift*/,
+ "uint64_t"/*delta_ns*/,
+ "uint64_t"/*tsc*/,
+ "uint64_t"/*systime_ns*/);
+SDT_PROBE_DEFINE7(sdt, xen, clock, systime__backward,
+ "uint64_t"/*raw_systime_ns*/,
+ "uint64_t"/*tsc_timestamp*/,
+ "uint64_t"/*tsc_to_system_mul*/,
+ "int"/*tsc_shift*/,
+ "uint64_t"/*delta_ns*/,
+ "uint64_t"/*tsc*/,
+ "uint64_t"/*systime_ns*/);
+
+SDT_PROBE_DEFINE2(sdt, xen, hardclock, systime__backward,
+ "uint64_t"/*last_systime_ns*/,
+ "uint64_t"/*this_systime_ns*/);
+SDT_PROBE_DEFINE3(sdt, xen, hardclock, missed,
+ "uint64_t"/*last_systime_ns*/,
+ "uint64_t"/*this_systime_ns*/,
+ "uint64_t"/*remaining_ns*/);
+
+/*
* xen timecounter:
*
* Xen vCPU system time, plus an adjustment with rdtsc.
@@ -277,7 +322,11 @@ xen_vcputime_systime_ns(void)
* Notify the console that the CPU's tsc appeared to
* run behind Xen's idea of it, and pretend it hadn't.
*/
-#if XEN_CLOCK_DEBUG /* XXX dtrace hook */
+ SDT_PROBE7(sdt, xen, clock, tsc__backward,
+ raw_systime_ns, tsc_timestamp,
+ tsc_to_system_mul, tsc_shift, /*delta_ns*/0, tsc,
+ /*systime_ns*/raw_systime_ns);
+#if XEN_CLOCK_DEBUG
device_printf(ci->ci_dev, "xen cpu tsc %"PRIu64
" ran backwards from timestamp %"PRIu64
" by %"PRIu64"\n",
@@ -301,9 +350,13 @@ xen_vcputime_systime_ns(void)
* This doesn't make sense but I include it out of paranoia.
*/
if (__predict_false((int64_t)delta_ns < 0)) {
-#if XEN_CLOCK_DEBUG /* XXX dtrace hook */
- device_printf(ci->ci_dev, "xen tsc delta in ns went negative: %"PRId64"\n",
- delta_ns);
+ SDT_PROBE7(sdt, xen, clock, tsc__delta__negative,
+ raw_systime_ns, tsc_timestamp,
+ tsc_to_system_mul, tsc_shift, delta_ns, tsc,
+ /*systime_ns*/raw_systime_ns);
+#if XEN_CLOCK_DEBUG
+ device_printf(ci->ci_dev, "xen tsc delta in ns went negative:"
+ " %"PRId64"\n", delta_ns);
#endif
ci->ci_xen_tsc_delta_negative_evcnt.ev_count++;
delta_ns = 0;
@@ -322,7 +375,11 @@ xen_vcputime_systime_ns(void)
* (2^64 ns is approximately half a millennium.)
*/
if (__predict_false(systime_ns < raw_systime_ns)) {
-#if XEN_CLOCK_DEBUG /* XXX dtrace hook */
+ SDT_PROBE7(sdt, xen, clock, systime__wraparound,
+ raw_systime_ns, tsc_timestamp,
+ tsc_to_system_mul, tsc_shift, delta_ns, tsc,
+ systime_ns);
+#if XEN_CLOCK_DEBUG
printf("xen raw systime + tsc delta wrapped around:"
" %"PRIu64" + %"PRIu64" = %"PRIu64"\n",
raw_systime_ns, delta_ns, systime_ns);
@@ -336,7 +393,11 @@ xen_vcputime_systime_ns(void)
* forward. This seems to happen pretty regularly under load.
*/
if (__predict_false(ci->ci_xen_last_systime_ns > systime_ns)) {
-#if XEN_CLOCK_DEBUG /* XXX dtrace hook */
+ SDT_PROBE7(sdt, xen, clock, systime__backward,
+ raw_systime_ns, tsc_timestamp,
+ tsc_to_system_mul, tsc_shift, delta_ns, tsc,
+ systime_ns);
+#if XEN_CLOCK_DEBUG
printf("xen raw systime + tsc delta went backwards:"
" %"PRIu64" > %"PRIu64"\n",
ci->ci_xen_last_systime_ns, systime_ns);
@@ -692,8 +753,11 @@ again:
last = ci->ci_xen_hardclock_systime_ns;
now = xen_vcputime_systime_ns();
if (now < last) {
-#if XEN_CLOCK_DEBUG /* XXX dtrace hook */
- device_printf(ci->ci_dev, "xen systime ran backwards in hardclock %"PRIu64"ns\n",
+ SDT_PROBE2(sdt, xen, hardclock, systime__backward,
+ last, now);
+#if XEN_CLOCK_DEBUG
+ device_printf(ci->ci_dev, "xen systime ran backwards"
+ " in hardclock %"PRIu64"ns\n",
last - now);
#endif
ci->ci_xen_systime_backwards_hardclock_evcnt.ev_count++;
@@ -710,8 +774,11 @@ again:
ci->ci_xen_hardclock_systime_ns += NS_PER_TICK;
delta -= NS_PER_TICK;
hardclock(frame);
- if (__predict_false(delta >= NS_PER_TICK))
+ if (__predict_false(delta >= NS_PER_TICK)) {
+ SDT_PROBE3(sdt, xen, hardclock, missed,
+ last, now, delta);
ci->ci_xen_missed_hardclock_evcnt.ev_count++;
+ }
}
/*
Home |
Main Index |
Thread Index |
Old Index