sched, mm: Rework sched_{fork, exec} node assignment
Subsystems (4)
Commit-ID: 0ea86208345b9a41863c3929c69b7ccfbfa6275e Gitweb: http://git.kernel.org/tip/0ea86208345b9a41863c3929c69b7ccfbfa6275e Author: Peter Zijlstra <[email protected]> AuthorDate: Sat, 3 Mar 2012 16:54:42 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Fri, 18 May 2012 08:16:22 +0200
sched, mm: Rework sched_{fork,exec} node assignment
Rework the scheduler fork,exec hooks to allow home-node assignment.
In particular:
- call sched_fork() after the mm is set up and the thread group list is initialized (such that we can iterate the mm_owner thread group).
- call sched_exec() after we've got our fresh mm.
Signed-off-by Peter Zijlstra <[email protected]>
Cc Suresh Siddha <[email protected]>
Cc Paul Turner <[email protected]>
Cc Dan Smith <[email protected]>
Cc Bharata B Rao <[email protected]>
Cc Lee Schermerhorn <[email protected]>
Cc Christoph Lameter <[email protected]>
Cc Rik van Riel <[email protected]>
Cc Andrea Arcangeli <[email protected]>
Cc Andrew Morton <[email protected]>
Cc Linus Torvalds <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>
--- fs/exec.c | 4 ++-- include/linux/sched.h | 4 ++-- kernel/fork.c | 9 +++++---- kernel/sched/core.c | 7 +++++-- kernel/sched/sched.h | 5 +++++ 5 files changed, 19 insertions(+), 10 deletions(-)
fs/exec.c +2 -2
@@ -1506,8 +1506,6 @@ static int do_execve_common(const char *filename,if (IS_ERR (file)) goto out_unmark; -sched_exec (); - bprm->file = file; bprm->filename = filename; bprm->interp = filename;
@@ -1516,6 +1514,8 @@ static int do_execve_common(const char *filename,if (retval) goto out_file; +sched_exec (bprm->mm); + bprm->argc =count (argv,MAX_ARG_STRINGS );if ((retval = bprm->argc) <0 ) goto out;
include/linux/sched.h +2 -2
@@ -1966,9 +1966,9 @@ task_sched_runtime(struct task_struct *task);/* sched_exec is called by processes performing an exec */ #ifdef CONFIG_SMP -extern void sched_exec (void ); +extern void sched_exec (struct mm_struct *mm);#else -#define sched_exec () {} +#define sched_exec (mm) {}#endif extern void sched_clock_idle_sleep_event (void );
kernel/fork.c +5 -4
@@ -1302,9 +1302,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, p->memcg_batch.memcg =NULL ;#endif -/* Perform scheduler related setup. Assign this task to a CPU. */ -sched_fork (p); - retval =perf_event_init_task (p);if (retval) goto bad_fork_cleanup_policy;
@@ -1357,6 +1354,11 @@ static struct task_struct *copy_process(unsigned long clone_flags,* Clear TID on mm_release()? */ p->clear_child_tid = (clone_flags &CLONE_CHILD_CLEARTID ) ? child_tidptr :NULL ; + +INIT_LIST_HEAD (&p->thread_group); +/* Perform scheduler related setup. Assign this task to a CPU. */ +sched_fork (p); +#ifdef CONFIG_BLOCK p->plug =NULL ;#endif
@@ -1405,7 +1407,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,* We dont wake it up yet. */ p->group_leader = p; -INIT_LIST_HEAD (&p->thread_group);/* Now that the task is set up, run cgroup callbacks if * necessary. We need to run them before the task is visible
kernel/sched/core.c +5 -2
@@ -1798,8 +1798,9 @@ void sched_fork(struct task_struct *p)#ifdef CONFIG_SMP plist_node_init (&p->pushable_tasks,MAX_PRIO );#endif -put_cpu (); + +select_task_node (p, p->mm,SD_BALANCE_FORK ); }/*
@@ -2565,12 +2566,14 @@ static void update_cpu_load_active(struct rq *this_rq)* sched_exec - execve() is a valuable balancing opportunity, because at * this point the task has the smallest effective memory and cache footprint. */ -void sched_exec (void ) +void sched_exec (struct mm_struct *mm) {struct task_struct *p = current;unsigned long flags;int dest_cpu; +select_task_node (p, mm,SD_BALANCE_EXEC ); +raw_spin_lock_irqsave (&p->pi_lock, flags); dest_cpu = p->sched_class->select_task_rq (p,SD_BALANCE_EXEC ,0 );if (dest_cpu ==smp_processor_id ())
kernel/sched/sched.h +5 -0
@@ -1156,3 +1156,8 @@ enum rq_nohz_flag_bits {#define nohz_flags (cpu) (&cpu_rq(cpu)->nohz_flags)#endif + +/* +* Macro to avoid argument evaluation +*/ +#define select_task_node (p, mm, sd_flags) do { } while (0)