aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorNick Piggin <nickpiggin@yahoo.com.au>2005-06-25 17:57:19 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-25 19:24:42 -0400
commit147cbb4bbe991452698f0772d8292f22825710ba (patch)
treecb86550d7e440e7dfbe22b0af6d2cfc991cb76cf /include/linux
parentcafb20c1f9976a70d633bb1e1c8c24eab00e4e80 (diff)
[PATCH] sched: balance on fork
Reimplement the balance on exec balancing to be sched-domains aware. Use this to also do balance on fork balancing. Make x86_64 do balance on fork over the NUMA domain. The problem that the non sched domains aware blancing became apparent on dual core, multi socket opterons. What we want is for the new tasks to be sent to a different socket, but more often than not, we would first load up our sibling core, or fill two cores of a single remote socket before selecting a new one. This gives large improvements to STREAM on such systems. Signed-off-by: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/sched.h10
-rw-r--r--include/linux/topology.h2
2 files changed, 8 insertions, 4 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 664981ac1fb6..613491d3a875 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -460,10 +460,11 @@ enum idle_type
460#define SD_LOAD_BALANCE 1 /* Do load balancing on this domain. */ 460#define SD_LOAD_BALANCE 1 /* Do load balancing on this domain. */
461#define SD_BALANCE_NEWIDLE 2 /* Balance when about to become idle */ 461#define SD_BALANCE_NEWIDLE 2 /* Balance when about to become idle */
462#define SD_BALANCE_EXEC 4 /* Balance on exec */ 462#define SD_BALANCE_EXEC 4 /* Balance on exec */
463#define SD_WAKE_IDLE 8 /* Wake to idle CPU on task wakeup */ 463#define SD_BALANCE_FORK 8 /* Balance on fork, clone */
464#define SD_WAKE_AFFINE 16 /* Wake task to waking CPU */ 464#define SD_WAKE_IDLE 16 /* Wake to idle CPU on task wakeup */
465#define SD_WAKE_BALANCE 32 /* Perform balancing at task wakeup */ 465#define SD_WAKE_AFFINE 32 /* Wake task to waking CPU */
466#define SD_SHARE_CPUPOWER 64 /* Domain members share cpu power */ 466#define SD_WAKE_BALANCE 64 /* Perform balancing at task wakeup */
467#define SD_SHARE_CPUPOWER 128 /* Domain members share cpu power */
467 468
468struct sched_group { 469struct sched_group {
469 struct sched_group *next; /* Must be a circular list */ 470 struct sched_group *next; /* Must be a circular list */
@@ -492,6 +493,7 @@ struct sched_domain {
492 unsigned int idle_idx; 493 unsigned int idle_idx;
493 unsigned int newidle_idx; 494 unsigned int newidle_idx;
494 unsigned int wake_idx; 495 unsigned int wake_idx;
496 unsigned int forkexec_idx;
495 int flags; /* See SD_* */ 497 int flags; /* See SD_* */
496 498
497 /* Runtime fields. */ 499 /* Runtime fields. */
diff --git a/include/linux/topology.h b/include/linux/topology.h
index b23ec64df7f1..665597207def 100644
--- a/include/linux/topology.h
+++ b/include/linux/topology.h
@@ -93,6 +93,7 @@
93 .idle_idx = 0, \ 93 .idle_idx = 0, \
94 .newidle_idx = 0, \ 94 .newidle_idx = 0, \
95 .wake_idx = 0, \ 95 .wake_idx = 0, \
96 .forkexec_idx = 0, \
96 .flags = SD_LOAD_BALANCE \ 97 .flags = SD_LOAD_BALANCE \
97 | SD_BALANCE_NEWIDLE \ 98 | SD_BALANCE_NEWIDLE \
98 | SD_BALANCE_EXEC \ 99 | SD_BALANCE_EXEC \
@@ -123,6 +124,7 @@
123 .idle_idx = 0, \ 124 .idle_idx = 0, \
124 .newidle_idx = 1, \ 125 .newidle_idx = 1, \
125 .wake_idx = 1, \ 126 .wake_idx = 1, \
127 .forkexec_idx = 0, \
126 .flags = SD_LOAD_BALANCE \ 128 .flags = SD_LOAD_BALANCE \
127 | SD_BALANCE_NEWIDLE \ 129 | SD_BALANCE_NEWIDLE \
128 | SD_BALANCE_EXEC \ 130 | SD_BALANCE_EXEC \