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();