Increment an interrupt depth counter in non-clock interrupt cases

so that we can get time spent in interrupt statistics.
This commit is contained in:
thorpej 2000-06-04 03:40:03 +00:00
parent 0da76771e9
commit df4a5a7f43
2 changed files with 23 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: interrupt.c,v 1.46 2000/06/03 20:47:36 thorpej Exp $ */
/* $NetBSD: interrupt.c,v 1.47 2000/06/04 03:40:03 thorpej Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@ -79,7 +79,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.46 2000/06/03 20:47:36 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.47 2000/06/04 03:40:03 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -166,6 +166,8 @@ interrupt(unsigned long a0, unsigned long a1, unsigned long a2,
{
u_long pending_ipis, bit;
atomic_add_ulong(&ci->ci_intrdepth, 1);
#if 0
printf("CPU %lu got IPI\n", cpu_id);
#endif
@ -190,6 +192,8 @@ interrupt(unsigned long a0, unsigned long a1, unsigned long a2,
if (ci->ci_cpuid == hwrpb->rpb_primary_cpu_id &&
hwrpb->rpb_txrdy != 0)
cpu_iccb_receive();
atomic_sub_ulong(&ci->ci_intrdepth, 1);
}
#else
printf("WARNING: received interprocessor interrupt!\n");
@ -197,6 +201,12 @@ interrupt(unsigned long a0, unsigned long a1, unsigned long a2,
break;
case ALPHA_INTR_CLOCK: /* clock interrupt */
/*
* We don't increment the interrupt depth for the
* clock interrupt, since it is *sampled* from
* the clock interrupt, so if we did, all system
* time would be counted as interrupt time.
*/
#if defined(MULTIPROCESSOR)
/* XXX XXX XXX */
if (CPU_IS_PRIMARY(ci) == 0)
@ -223,11 +233,13 @@ interrupt(unsigned long a0, unsigned long a1, unsigned long a2,
break;
case ALPHA_INTR_ERROR: /* Machine Check or Correctable Error */
atomic_add_ulong(&ci->ci_intrdepth, 1);
a0 = alpha_pal_rdmces();
if (platform.mcheck_handler)
(*platform.mcheck_handler)(a0, framep, a1, a2);
else
machine_check(a0, framep, a1, a2);
atomic_sub_ulong(&ci->ci_intrdepth, 1);
break;
case ALPHA_INTR_DEVICE: /* I/O device interrupt */
@ -236,9 +248,11 @@ interrupt(unsigned long a0, unsigned long a1, unsigned long a2,
if (CPU_IS_PRIMARY(ci) == 0)
return;
#endif
atomic_add_ulong(&ci->ci_intrdepth, 1);
uvmexp.intrs++;
if (platform.iointr)
(*platform.iointr)(framep, a1);
atomic_sub_ulong(&ci->ci_intrdepth, 1);
break;
case ALPHA_INTR_PERF: /* performance counter interrupt */

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu.h,v 1.41 2000/06/03 20:47:40 thorpej Exp $ */
/* $NetBSD: cpu.h,v 1.42 2000/06/04 03:40:04 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
@ -128,6 +128,7 @@ struct cpu_info {
struct device *ci_dev; /* pointer to our device */
u_long ci_want_resched; /* preempt current process */
u_long ci_astpending; /* AST is pending */
u_long ci_intrdepth; /* interrupt trap depth */
#if defined(MULTIPROCESSOR)
u_long ci_flags; /* flags; see below */
u_long ci_ipis; /* interprocessor interrupts pending */
@ -179,11 +180,13 @@ struct clockframe {
#define CLKF_BASEPRI(framep) \
(((framep)->cf_tf.tf_regs[FRAME_PS] & ALPHA_PSL_IPL_MASK) == 0)
#define CLKF_PC(framep) ((framep)->cf_tf.tf_regs[FRAME_PC])
/*
* XXX No way to accurately tell if we were in interrupt mode before taking
* clock interrupt.
* This isn't perfect; if the clock interrupt comes in before the
* r/m/w cycle is complete, we won't be counted... but it's not
* like this stastic has to be extremely accurate.
*/
#define CLKF_INTR(framep) (0)
#define CLKF_INTR(framep) (curcpu()->ci_intrdepth)
/*
* Preempt the current process if in interrupt from user mode,