PERFORCE change 146105 for review
John Baldwin
jhb at FreeBSD.org
Mon Jul 28 12:24:34 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=146105
Change 146105 by jhb at jhb_zion on 2008/07/28 12:23:33
Grrrr, fork() clears td_flags after sched_fork() is called, so the
TDF_AFFINITY flag was getting lost for new child processes. Move
the flag into a new ts_flags field instead.
Affected files ...
.. //depot/projects/smpng/sys/kern/sched_4bsd.c#82 edit
Differences ...
==== //depot/projects/smpng/sys/kern/sched_4bsd.c#82 (text+ko) ====
@@ -91,13 +91,16 @@
fixpt_t ts_pctcpu; /* (j) %cpu during p_swtime. */
int ts_cpticks; /* (j) Ticks of cpu time. */
int ts_slptime; /* (j) Seconds !RUNNING. */
+ int ts_flags;
struct runq *ts_runq; /* runq the thread is currently on */
};
/* flags kept in td_flags */
#define TDF_DIDRUN TDF_SCHED0 /* thread actually ran. */
#define TDF_BOUND TDF_SCHED1 /* Bound to one CPU. */
-#define TDF_AFFINITY TDF_SCHED2 /* Has a non-"full" CPU set. */
+
+/* flags kept in ts_flags */
+#define TSF_AFFINITY 0x0001 /* Has a non-"full" CPU set. */
#define SKE_RUNQ_PCPU(ts) \
((ts)->ts_runq != 0 && (ts)->ts_runq != &runq)
@@ -738,9 +741,9 @@
childtd->td_estcpu = td->td_estcpu;
childtd->td_lock = &sched_lock;
childtd->td_cpuset = cpuset_ref(td->td_cpuset);
- childtd->td_flags |= (td->td_flags & TDF_AFFINITY);
ts = childtd->td_sched;
bzero(ts, sizeof(*ts));
+ ts->ts_flags |= (td->td_sched->ts_flags & TSF_AFFINITY);
}
void
@@ -1232,7 +1235,7 @@
single_cpu = 1;
CTR3(KTR_RUNQ,
"sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, td, cpu);
- } else if (td->td_flags & TDF_AFFINITY) {
+ } else if (ts->ts_flags & TSF_AFFINITY) {
/* Find a valid CPU for our cpuset */
cpu = sched_pickcpu(td);
ts->ts_runq = &runq_pcpu[cpu];
@@ -1576,15 +1579,15 @@
THREAD_LOCK_ASSERT(td, MA_OWNED);
/*
- * Set the TDF_AFFINITY flag if there is at least one CPU this
+ * Set the TSF_AFFINITY flag if there is at least one CPU this
* thread can't run on.
*/
- td->td_flags &= ~TDF_AFFINITY;
+ ts->ts_flags &= ~TSF_AFFINITY;
for (cpu = 0; cpu <= mp_maxid; cpu++) {
if (CPU_ABSENT(cpu))
continue;
if (!THREAD_CAN_SCHED(td, cpu)) {
- td->td_flags |= TDF_AFFINITY;
+ ts->ts_flags |= TSF_AFFINITY;
break;
}
}
@@ -1592,7 +1595,7 @@
/*
* If this thread can run on all CPUs, nothing else to do.
*/
- if (!(td->td_flags & TDF_AFFINITY))
+ if (!(ts->ts_flags & TSF_AFFINITY))
return;
/* Pinned threads and bound threads should be left alone. */
More information about the p4-projects
mailing list