summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2001-02-01 03:34:20 +0000
committerjake <jake@FreeBSD.org>2001-02-01 03:34:20 +0000
commita9f4853a90e9a3d0a29707d7da60599d5cf64468 (patch)
tree84ae793f8179f0a4684d40da39573fd2b24cc4d4 /sys/i386/isa
parentde48d4010094bae98c3ed8c82cef640a182c5a75 (diff)
downloadFreeBSD-src-a9f4853a90e9a3d0a29707d7da60599d5cf64468.zip
FreeBSD-src-a9f4853a90e9a3d0a29707d7da60599d5cf64468.tar.gz
Implement preemptive scheduling of hardware interrupt threads.
- If possible, context switch to the thread directly in sched_ithd(), rather than triggering a delayed ast reschedule. - Disable interrupts while restoring fpu state in the trap handler, in order to ensure that we are not preempted in the middle, which could cause migration to another cpu. Reviewed by: peter Tested by: peter (alpha)
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/ithread.c8
-rw-r--r--sys/i386/isa/npx.c5
2 files changed, 11 insertions, 2 deletions
diff --git a/sys/i386/isa/ithread.c b/sys/i386/isa/ithread.c
index 6a59db1..5f64861 100644
--- a/sys/i386/isa/ithread.c
+++ b/sys/i386/isa/ithread.c
@@ -121,16 +121,20 @@ sched_ithd(void *cookie)
/* membar_lock(); */
ir->it_proc->p_stat = SRUN;
setrunqueue(ir->it_proc);
- aston();
+ if (!cold) {
+ if (curproc != PCPU_GET(idleproc))
+ setrunqueue(curproc);
+ mi_switch();
+ }
}
else {
CTR3(KTR_INTR, "sched_ithd %d: it_need %d, state %d",
ir->it_proc->p_pid,
ir->it_need,
ir->it_proc->p_stat );
+ need_resched();
}
mtx_exit(&sched_lock, MTX_SPIN);
- need_resched();
}
/*
diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
index 7c6c4f0..a729e0f 100644
--- a/sys/i386/isa/npx.c
+++ b/sys/i386/isa/npx.c
@@ -796,6 +796,8 @@ npx_intr(dummy)
int
npxdna()
{
+ int s;
+
if (!npx_exists)
return (0);
if (PCPU_GET(npxproc) != NULL) {
@@ -803,6 +805,8 @@ npxdna()
PCPU_GET(npxproc), curproc);
panic("npxdna");
}
+ s = save_intr();
+ disable_intr();
stop_emulating();
/*
* Record new context early in case frstor causes an IRQ13.
@@ -822,6 +826,7 @@ npxdna()
* first FPU instruction after a context switch.
*/
frstor(&PCPU_GET(curpcb)->pcb_savefpu);
+ restore_intr(s);
return (1);
}
OpenPOWER on IntegriCloud