Skip to content

Commit

Permalink
[PATCH] sched: filter affine wakeups
Browse files Browse the repository at this point in the history
)

From: Nick Piggin <nickpiggin@yahoo.com.au>

Track the last waker CPU, and only consider wakeup-balancing if there's a
match between current waker CPU and the previous waker CPU.  This ensures
that there is some correlation between two subsequent wakeup events before
we move the task.  Should help random-wakeup workloads on large SMP
systems, by reducing the migration attempts by a factor of nr_cpus.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
akpm@osdl.org authored and Linus Torvalds committed Jan 12, 2006
1 parent 198e2f1 commit d7102e9
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
5 changes: 4 additions & 1 deletion include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -696,8 +696,11 @@ struct task_struct {

int lock_depth; /* BKL lock depth */

#if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW)
#if defined(CONFIG_SMP)
int last_waker_cpu; /* CPU that last woke this task up */
#if defined(__ARCH_WANT_UNLOCKED_CTXSW)
int oncpu;
#endif
#endif
int prio, static_prio;
struct list_head run_list;
Expand Down
10 changes: 9 additions & 1 deletion kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1290,6 +1290,9 @@ static int try_to_wake_up(task_t *p, unsigned int state, int sync)
}
}

if (p->last_waker_cpu != this_cpu)
goto out_set_cpu;

if (unlikely(!cpu_isset(this_cpu, p->cpus_allowed)))
goto out_set_cpu;

Expand Down Expand Up @@ -1360,6 +1363,8 @@ static int try_to_wake_up(task_t *p, unsigned int state, int sync)
cpu = task_cpu(p);
}

p->last_waker_cpu = this_cpu;

out_activate:
#endif /* CONFIG_SMP */
if (old_state == TASK_UNINTERRUPTIBLE) {
Expand Down Expand Up @@ -1441,9 +1446,12 @@ void fastcall sched_fork(task_t *p, int clone_flags)
#ifdef CONFIG_SCHEDSTATS
memset(&p->sched_info, 0, sizeof(p->sched_info));
#endif
#if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW)
#if defined(CONFIG_SMP)
p->last_waker_cpu = cpu;
#if defined(__ARCH_WANT_UNLOCKED_CTXSW)
p->oncpu = 0;
#endif
#endif
#ifdef CONFIG_PREEMPT
/* Want to start with kernel preemption disabled. */
task_thread_info(p)->preempt_count = 1;
Expand Down

0 comments on commit d7102e9

Please sign in to comment.