Module Name:    src
Committed By:   riastradh
Date:           Sat Oct 29 13:59:04 UTC 2022

Modified Files:
        src/sys/arch/x86/x86: intr.c

Log Message:
x86: Add dtrace probes for interrupt handler entry and return.

Arguments:

0: interrupt handler function
1: interrupt handler's private cookie argument
2: MD struct intrhand pointer
3: return value (true if relevant to this handler, false if not)

The MD struct intrhand pointer makes the first two arguments
redundant, but we might reuse the signature of the first two
arguments for an MI SDT probe to make it easy to write MI dtrace
scripts for monitoring interrupt handlers.  The MD intrhand can be
used for getting more information about the interrupt like ih_level,
ih_pin, ih_slot, &c., which may not make sense as an MI API.


To generate a diff of this commit:
cvs rdiff -u -r1.162 -r1.163 src/sys/arch/x86/x86/intr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/x86/intr.c
diff -u src/sys/arch/x86/x86/intr.c:1.162 src/sys/arch/x86/x86/intr.c:1.163
--- src/sys/arch/x86/x86/intr.c:1.162	Wed Oct 26 23:38:09 2022
+++ src/sys/arch/x86/x86/intr.c	Sat Oct 29 13:59:04 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.162 2022/10/26 23:38:09 riastradh Exp $	*/
+/*	$NetBSD: intr.c,v 1.163 2022/10/29 13:59:04 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -133,7 +133,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.162 2022/10/26 23:38:09 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.163 2022/10/29 13:59:04 riastradh Exp $");
 
 #include "opt_intrdebug.h"
 #include "opt_multiprocessor.h"
@@ -152,6 +152,7 @@ __KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.1
 #include <sys/xcall.h>
 #include <sys/interrupt.h>
 #include <sys/reboot.h> /* for AB_VERBOSE */
+#include <sys/sdt.h>
 
 #include <sys/kauth.h>
 #include <sys/conf.h>
@@ -246,6 +247,16 @@ static void intr_deactivate_xcall(void *
 static void intr_get_affinity(struct intrsource *, kcpuset_t *);
 static int intr_set_affinity(struct intrsource *, const kcpuset_t *);
 
+SDT_PROBE_DEFINE3(sdt, kernel, intr, entry,
+    "int (*)(void *)"/*func*/,
+    "void *"/*arg*/,
+    "struct intrhand *"/*ih*/);
+SDT_PROBE_DEFINE4(sdt, kernel, intr, return,
+    "int (*)(void *)"/*func*/,
+    "void *"/*arg*/,
+    "struct intrhand *"/*ih*/,
+    "int"/*handled*/);
+
 /*
  * Fill in default interrupt table (in case of spurious interrupt
  * during configuration of kernel), setup interrupt control unit
@@ -660,7 +671,11 @@ intr_biglock_wrapper(void *vp)
 	KERNEL_LOCK(1, NULL);
 
 	locks = curcpu()->ci_biglock_count;
+	SDT_PROBE3(sdt, kernel, intr, entry,
+	    ih->ih_realfun, ih->ih_realarg, ih);
 	ret = (*ih->ih_realfun)(ih->ih_realarg);
+	SDT_PROBE4(sdt, kernel, intr, return,
+	    ih->ih_realfun, ih->ih_realarg, ih, ret);
 	KASSERTMSG(locks == curcpu()->ci_biglock_count,
 	    "%s @ %p slipped locks %d -> %d",
 	    ih->ih_xname, ih->ih_realfun, locks, curcpu()->ci_biglock_count);
@@ -671,6 +686,23 @@ intr_biglock_wrapper(void *vp)
 }
 #endif /* MULTIPROCESSOR */
 
+#ifdef KDTRACE_HOOKS
+static int
+intr_kdtrace_wrapper(void *vp)
+{
+	struct intrhand *ih = vp;
+	int ret;
+
+	SDT_PROBE3(sdt, kernel, intr, entry,
+	    ih->ih_realfun, ih->ih_realarg, ih);
+	ret = (*ih->ih_realfun)(ih->ih_realarg);
+	SDT_PROBE4(sdt, kernel, intr, return,
+	    ih->ih_realfun, ih->ih_realarg, ih, ret);
+
+	return ret;
+}
+#endif
+
 /*
  * Append device name to intrsource. If device A and device B share IRQ number,
  * the device name of the interrupt id is "device A, device B".
@@ -911,6 +943,10 @@ intr_establish_xname(int legacy_irq, str
 	ih->ih_cpu = ci;
 	ih->ih_slot = slot;
 	strlcpy(ih->ih_xname, xname, sizeof(ih->ih_xname));
+#ifdef KDTRACE_HOOKS
+	ih->ih_fun = intr_kdtrace_wrapper;
+	ih->ih_arg = ih;
+#endif
 #ifdef MULTIPROCESSOR
 	if (!mpsafe) {
 		ih->ih_fun = intr_biglock_wrapper;

Reply via email to