summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2001-01-21 19:25:07 +0000
committerjake <jake@FreeBSD.org>2001-01-21 19:25:07 +0000
commit937122ae6dc02a639d13dd06132201548bd7364f (patch)
tree75b59a2832d9f622680ddf91bb405ee9b1f761d4 /sys/ia64
parentd326c51b74ea24afabc190774a1b7721c3e6d1e8 (diff)
downloadFreeBSD-src-937122ae6dc02a639d13dd06132201548bd7364f.zip
FreeBSD-src-937122ae6dc02a639d13dd06132201548bd7364f.tar.gz
Make intr_nesting_level per-process, rather than per-cpu. Setup
interrupt threads to run with it always >= 1, so that malloc can detect M_WAITOK from "interrupt" context. This is also necessary in order to context switch from sched_ithd() directly. Reviewed By: peter
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/interrupt.c6
-rw-r--r--sys/ia64/ia64/mp_machdep.c2
-rw-r--r--sys/ia64/include/cpu.h2
-rw-r--r--sys/ia64/include/globaldata.h1
-rw-r--r--sys/ia64/include/pcpu.h1
5 files changed, 6 insertions, 6 deletions
diff --git a/sys/ia64/ia64/interrupt.c b/sys/ia64/ia64/interrupt.c
index 698b46c..fc2f84a 100644
--- a/sys/ia64/ia64/interrupt.c
+++ b/sys/ia64/ia64/interrupt.c
@@ -78,8 +78,10 @@ static u_int schedclk2;
void
interrupt(u_int64_t vector, struct trapframe *framep)
{
- atomic_add_int(PCPU_PTR(intr_nesting_level), 1);
+ struct proc *p;
+ p = curproc;
+ atomic_add_int(&p->p_intr_nesting_level, 1);
switch (vector) {
case 240: /* clock interrupt */
CTR0(KTR_INTR, "clock interrupt");
@@ -104,7 +106,7 @@ interrupt(u_int64_t vector, struct trapframe *framep)
panic("unexpected interrupt: vec %ld\n", vector);
/* NOTREACHED */
}
- atomic_subtract_int(PCPU_PTR(intr_nesting_level), 1);
+ atomic_subtract_int(&p->p_intr_nesting_level, 1);
}
diff --git a/sys/ia64/ia64/mp_machdep.c b/sys/ia64/ia64/mp_machdep.c
index 486d0aa..aa42156 100644
--- a/sys/ia64/ia64/mp_machdep.c
+++ b/sys/ia64/ia64/mp_machdep.c
@@ -772,7 +772,7 @@ smp_handle_ipi(struct trapframe *frame)
if ((frame->tf_cr_ipsr & IA64_PSR_CPL)
== IA64_PSR_CPL_USER)
checkstate_cpustate[cpuno] = CHECKSTATE_USER;
- else if (PCPU_GET(intr_nesting_level) == 1)
+ else if (curproc->p_intr_nesting_level == 1)
checkstate_cpustate[cpuno] = CHECKSTATE_SYS;
else
checkstate_cpustate[cpuno] = CHECKSTATE_INTR;
diff --git a/sys/ia64/include/cpu.h b/sys/ia64/include/cpu.h
index d581447..ff36f05 100644
--- a/sys/ia64/include/cpu.h
+++ b/sys/ia64/include/cpu.h
@@ -67,7 +67,7 @@ struct clockframe {
#define CLKF_BASEPRI(framep) \
(((framep)->cf_tf.tf_cr_ipsr & IA64_PSR_I) == 0)
#define CLKF_PC(framep) ((framep)->cf_tf.tf_cr_iip)
-#define CLKF_INTR(framep) (PCPU_GET(intr_nesting_level) >= 2)
+#define CLKF_INTR(framep) (curproc->p_intr_nesting_level >= 2)
/*
* Preempt the current process if in interrupt from user mode,
diff --git a/sys/ia64/include/globaldata.h b/sys/ia64/include/globaldata.h
index 6068bd1..91c7fff 100644
--- a/sys/ia64/include/globaldata.h
+++ b/sys/ia64/include/globaldata.h
@@ -56,7 +56,6 @@ struct globaldata {
struct pmap *gd_current_pmap; /* which pmap is active */
u_int32_t gd_next_asn; /* next ASN to allocate */
u_int32_t gd_current_asngen; /* ASN rollover check */
- u_int32_t gd_intr_nesting_level; /* interrupt recursion */
u_int gd_astpending;
SLIST_ENTRY(globaldata) gd_allcpu;
diff --git a/sys/ia64/include/pcpu.h b/sys/ia64/include/pcpu.h
index 6068bd1..91c7fff 100644
--- a/sys/ia64/include/pcpu.h
+++ b/sys/ia64/include/pcpu.h
@@ -56,7 +56,6 @@ struct globaldata {
struct pmap *gd_current_pmap; /* which pmap is active */
u_int32_t gd_next_asn; /* next ASN to allocate */
u_int32_t gd_current_asngen; /* ASN rollover check */
- u_int32_t gd_intr_nesting_level; /* interrupt recursion */
u_int gd_astpending;
SLIST_ENTRY(globaldata) gd_allcpu;
OpenPOWER on IntegriCloud