socsvn commit: r224644 - soc2011/rudot/kern
rudot at FreeBSD.org
rudot at FreeBSD.org
Tue Jul 26 11:17:57 UTC 2011
Author: rudot
Date: Tue Jul 26 11:17:54 2011
New Revision: 224644
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224644
Log:
check if the per-cpu current thread ptr is a valid pointer. If not then do not use it.
Modified:
soc2011/rudot/kern/sched_fbfs.c
Modified: soc2011/rudot/kern/sched_fbfs.c
==============================================================================
--- soc2011/rudot/kern/sched_fbfs.c Tue Jul 26 10:50:33 2011 (r224643)
+++ soc2011/rudot/kern/sched_fbfs.c Tue Jul 26 11:17:54 2011 (r224644)
@@ -149,7 +149,6 @@
SYSCTL_INT(_kern_sched, OID_AUTO, slice, CTLFLAG_RW, &sched_slice, 0,
"Slice size for timeshare threads");
-
static __inline void
sched_load_add(void)
{
@@ -613,28 +612,32 @@
struct pcpu * pcpu;
struct td_sched *ts;
struct td_sched *tsc;
+ struct thread *pcpu_thr;
u_char c;
c = td->td_lastcpu;
if (c == NOCPU)
return (0);
pcpu = pcpu_find(c);
- if (pcpu->pc_curthread == pcpu->pc_idlethread) {
+ pcpu_thr = pcpu->pc_curthread;
+ if (pcpu_thr == NULL)
+ return (0);
+ if (pcpu_thr == pcpu->pc_idlethread) {
if (PCPU_GET(cpuid) != c)
ipi_cpu(c, IPI_AST);
return (1);
}
- cpri = pcpu->pc_curthread->td_priority;
+ cpri = pcpu_thr->td_priority;
if (cpri < td->td_priority)
return (0);
if (cpri > td->td_priority) {
- pcpu->pc_curthread->td_flags |= TDF_NEEDRESCHED;
+ pcpu_thr->td_flags |= TDF_NEEDRESCHED;
if (PCPU_GET(cpuid) != c)
ipi_cpu(c, IPI_AST);
return (1);
}
ts = td->td_sched;
- tsc = pcpu->pc_curthread->td_sched;
+ tsc = pcpu_thr->td_sched;
if ((td->td_pri_class == PRI_TIMESHARE) ||
(td->td_pri_class == PRI_IDLE)) {
if (ts->ts_vdeadline >= tsc->ts_vdeadline)
@@ -647,7 +650,7 @@
* Further, the virtual deadline of td is lower. Therefore we
* reschedule the td_lastcpu.
*/
- pcpu->pc_curthread->td_flags |= TDF_NEEDRESCHED;
+ pcpu_thr->td_flags |= TDF_NEEDRESCHED;
if (PCPU_GET(cpuid) != c)
ipi_cpu(c, IPI_AST);
@@ -667,6 +670,9 @@
ts = max_thread->td_sched;
SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
cthr = pc->pc_curthread;
+ if (cthr == NULL) {
+ continue;
+ }
if (max_prio < cthr->td_priority) {
max_thread = cthr;
max_prio = max_thread->td_priority;
More information about the svn-soc-all
mailing list