Module Name:    src
Committed By:   jmcneill
Date:           Sat Nov 21 11:44:00 UTC 2020

Modified Files:
        src/sys/arch/aarch64/include: cpu.h
        src/sys/arch/arm/cortex: gicv3.c

Log Message:
Add a per-CPU event counter that counts every time an interrupt handler is
preempted by a higher priority interrupt.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/aarch64/include/cpu.h
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/arm/cortex/gicv3.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/aarch64/include/cpu.h
diff -u src/sys/arch/aarch64/include/cpu.h:1.28 src/sys/arch/aarch64/include/cpu.h:1.29
--- src/sys/arch/aarch64/include/cpu.h:1.28	Thu Oct  1 06:40:16 2020
+++ src/sys/arch/aarch64/include/cpu.h	Sat Nov 21 11:43:59 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.28 2020/10/01 06:40:16 ryo Exp $ */
+/* $NetBSD: cpu.h,v 1.29 2020/11/21 11:43:59 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014, 2020 The NetBSD Foundation, Inc.
@@ -112,6 +112,7 @@ struct cpu_info {
 	struct evcnt ci_vfp_save;
 	struct evcnt ci_vfp_release;
 	struct evcnt ci_uct_trap;
+	struct evcnt ci_intr_preempt;
 
 	/* FDT or similar supplied "cpu capacity" */
 	uint32_t ci_capacity_dmips_mhz;

Index: src/sys/arch/arm/cortex/gicv3.c
diff -u src/sys/arch/arm/cortex/gicv3.c:1.32 src/sys/arch/arm/cortex/gicv3.c:1.33
--- src/sys/arch/arm/cortex/gicv3.c:1.32	Sun Nov  1 14:30:12 2020
+++ src/sys/arch/arm/cortex/gicv3.c	Sat Nov 21 11:44:00 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: gicv3.c,v 1.32 2020/11/01 14:30:12 jmcneill Exp $ */
+/* $NetBSD: gicv3.c,v 1.33 2020/11/21 11:44:00 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
 #define	_INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gicv3.c,v 1.32 2020/11/01 14:30:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gicv3.c,v 1.33 2020/11/21 11:44:00 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -368,6 +368,9 @@ gicv3_cpu_init(struct pic_softc *pic, st
 	struct gicv3_softc * const sc = PICTOSOFTC(pic);
 	uint32_t icc_sre, icc_ctlr, gicr_waker;
 
+	evcnt_attach_dynamic(&ci->ci_intr_preempt, EVCNT_TYPE_MISC, NULL,
+	    ci->ci_cpuname, "intr preempt");
+
 	ci->ci_gic_redist = gicv3_find_redist(sc);
 	ci->ci_gic_sgir = gicv3_sgir(sc);
 
@@ -734,10 +737,15 @@ gicv3_irq_handler(void *frame)
 			isb();
 		}
 
+		const int64_t nintr = ci->ci_data.cpu_nintr;
+
 		cpsie(I32_bit);
 		pic_dispatch(is, frame);
 		cpsid(I32_bit);
 
+		if (nintr != ci->ci_data.cpu_nintr)
+			ci->ci_intr_preempt.ev_count++;
+
 		if (!early_eoi) {
 			icc_eoi1r_write(iar);
 			isb();

Reply via email to