summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-11-15 21:56:50 +0000
committerjhb <jhb@FreeBSD.org>2000-11-15 21:56:50 +0000
commit9ced7fb074609785a6a918a21021e867427eef23 (patch)
tree1083860e541c3ec11639ad1e7d2b33aafc8ee5a1 /sys
parent3fd4aa4c2305f5f76ab44d34d5cb5488f0acc8a0 (diff)
downloadFreeBSD-src-9ced7fb074609785a6a918a21021e867427eef23.zip
FreeBSD-src-9ced7fb074609785a6a918a21021e867427eef23.tar.gz
- Don't acquire/release Giant during an interrupt context for machine
checks, clock interrupts, and device interrupts. - Assert that Giant is not owned during the main loop of ithd_loop().
Diffstat (limited to 'sys')
-rw-r--r--sys/alpha/alpha/interrupt.c11
1 files changed, 1 insertions, 10 deletions
diff --git a/sys/alpha/alpha/interrupt.c b/sys/alpha/alpha/interrupt.c
index a95564a..4d3ddc9 100644
--- a/sys/alpha/alpha/interrupt.c
+++ b/sys/alpha/alpha/interrupt.c
@@ -99,7 +99,6 @@ interrupt(a0, a1, a2, framep)
struct proc *p = curproc;
if (!p) p = &proc0;
if ((caddr_t) framep < (caddr_t) p->p_addr + 1024) {
- mtx_enter(&Giant, MTX_DEF);
panic("possible stack overflow\n");
}
}
@@ -121,33 +120,25 @@ interrupt(a0, a1, a2, framep)
return;
}
- mtx_enter(&Giant, MTX_DEF);
alpha_clock_interrupt(framep);
- mtx_exit(&Giant, MTX_DEF);
break;
case ALPHA_INTR_ERROR: /* Machine Check or Correctable Error */
- mtx_enter(&Giant, MTX_DEF);
a0 = alpha_pal_rdmces();
if (platform.mcheck_handler)
(*platform.mcheck_handler)(a0, framep, a1, a2);
else
machine_check(a0, framep, a1, a2);
- mtx_exit(&Giant, MTX_DEF);
break;
case ALPHA_INTR_DEVICE: /* I/O device interrupt */
- mtx_enter(&Giant, MTX_DEF);
cnt.v_intr++;
if (platform.iointr)
(*platform.iointr)(framep, a1);
- mtx_exit(&Giant, MTX_DEF);
break;
case ALPHA_INTR_PERF: /* interprocessor interrupt */
- mtx_enter(&Giant, MTX_DEF);
perf_irq(a1, framep);
- mtx_exit(&Giant, MTX_DEF);
break;
case ALPHA_INTR_PASSIVE:
@@ -157,7 +148,6 @@ interrupt(a0, a1, a2, framep)
break;
default:
- mtx_enter(&Giant, MTX_DEF);
panic("unexpected interrupt: type 0x%lx vec 0x%lx a2 0x%lx\n",
a0, a1, a2);
/* NOTREACHED */
@@ -638,6 +628,7 @@ ithd_loop(void *dummy)
* lock. This may take a while and it_need may get
* set again, so we have to check it again.
*/
+ mtx_assert(&Giant, MA_NOTOWNED);
mtx_enter(&sched_lock, MTX_SPIN);
if (!ithd->it_need) {
ithd->it_proc->p_stat = SWAIT; /* we're idle */
OpenPOWER on IntegriCloud