socsvn commit: r224057 - soc2011/rudot/kern
rudot at FreeBSD.org
rudot at FreeBSD.org
Fri Jul 8 19:08:45 UTC 2011
Author: rudot
Date: Fri Jul 8 19:08:42 2011
New Revision: 224057
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224057
Log:
added cpu topology information
Modified:
soc2011/rudot/kern/sched_fbfs.c
Modified: soc2011/rudot/kern/sched_fbfs.c
==============================================================================
--- soc2011/rudot/kern/sched_fbfs.c Fri Jul 8 18:06:53 2011 (r224056)
+++ soc2011/rudot/kern/sched_fbfs.c Fri Jul 8 19:08:42 2011 (r224057)
@@ -91,6 +91,9 @@
#endif
};
+static struct cpu_group * cpu_top;
+static struct cpu_group * cpu_topology[MAXCPU];
+
/* flags kept in td_flags */
#define TDF_DIDRUN TDF_SCHED0 /* thread actually ran. */
#define TDF_BOUND TDF_SCHED1 /* Bound to one CPU. */
@@ -186,6 +189,15 @@
{
int i;
+ cpu_top = smp_topo();
+ for (i = 0; i < MAXCPU; i++) {
+ if (CPU_ABSENT(i))
+ continue;
+ cpu_topology[i] = smp_topo_find(cpu_top, i);
+ if (cpu_topology[i] == NULL)
+ panic("Can't find cpu group for %d\n", i);
+ }
+
realstathz = hz;
sched_slice = (realstathz/10);
@@ -609,7 +621,7 @@
pcpu = pcpu_find(c);
if (pcpu->pc_curthread == pcpu->pc_idlethread) {
if (PCPU_GET(cpuid) != c)
- ipi_cpu(c, IPI_AST);
+ ipi_cpu(c, IPI_PREEMPT);
return (1);
}
cpri = pcpu->pc_curthread->td_priority;
@@ -676,6 +688,7 @@
{
struct td_sched *ts;
struct thread *thr_worst;
+ struct cpu_group *cg;
cpumask_t dontuse, map, me;
u_char c;
@@ -696,16 +709,26 @@
*/
if (preempt_lastcpu(td)) {
if (map)
- ipi_selected(map, IPI_AST);
+ ipi_selected(map, IPI_PREEMPT);
return;
}
-
+ /*
+ * Is there any idle cpu ?
+ */
if (map) {
- ipi_selected(map, IPI_AST);
+ cg = cpu_topology[td->td_lastcpu];
+ while ((cg != NULL) && ((map & cg->cg_mask) == 0))
+ cg = cg->cg_parent;
+ if (map & cg->cg_mask) {
+ ipi_selected(map & cg->cg_mask, IPI_PREEMPT);
+ return;
+ }
+ ipi_selected(map, IPI_PREEMPT);
return;
}
-
- /* We did not wake lastcpu and there is no suitable idle cpu */
+ /*
+ * We did not wake lastcpu and there is no suitable idle cpu
+ */
thr_worst = worst_running_thread();
c = thr_worst->td_oncpu;
if (thr_worst->td_priority < td->td_priority)
@@ -716,8 +739,9 @@
ipi_cpu(c, IPI_AST);
return;
}
-
- /* thr_worst->td_priority == td->td_priority */
+ /*
+ * thr_worst->td_priority == td->td_priority
+ */
if (ts->ts_vdeadline < thr_worst->td_sched->ts_vdeadline) {
thr_worst->td_flags |= TDF_NEEDRESCHED;
if ((thr_worst != curthread) && (c != NOCPU))
More information about the svn-soc-all
mailing list