From 9dfa6a99e5eb5ab0bc3a4d6beb599ba0f2f633af Mon Sep 17 00:00:00 2001 Message-Id: <9dfa6a99e5eb5ab0bc3a4d6beb599ba0f2f633af.1392157722.git.luto@amacapital.net> From: Andy Lutomirski Date: Tue, 11 Feb 2014 14:26:46 -0800 Subject: [PATCH] sched: Try to avoid sending an IPI in ttwu_queue_remote This is an experimental patch. It should probably not be applied. Signed-off-by: Andy Lutomirski --- kernel/sched/core.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a88f4a4..fc7b048 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1475,20 +1475,23 @@ static int ttwu_remote(struct task_struct *p, int wake_flags) } #ifdef CONFIG_SMP -static void sched_ttwu_pending(void) +static void __sched_ttwu_pending(struct rq *rq) { - struct rq *rq = this_rq(); struct llist_node *llist = llist_del_all(&rq->wake_list); struct task_struct *p; - raw_spin_lock(&rq->lock); - while (llist) { p = llist_entry(llist, struct task_struct, wake_entry); llist = llist_next(llist); ttwu_do_activate(rq, p, 0); } +} +static void sched_ttwu_pending(void) +{ + struct rq *rq = this_rq(); + raw_spin_lock(&rq->lock); + __sched_ttwu_pending(rq); raw_spin_unlock(&rq->lock); } @@ -1536,8 +1539,15 @@ void scheduler_ipi(void) static void ttwu_queue_remote(struct task_struct *p, int cpu) { - if (llist_add(&p->wake_entry, &cpu_rq(cpu)->wake_list)) - smp_send_reschedule(cpu); + struct rq *rq = cpu_rq(cpu); + + if (llist_add(&p->wake_entry, &rq->wake_list)) { + unsigned long flags; + + raw_spin_lock_irqsave(&rq->lock, flags); + resched_task(cpu_curr(cpu)); + raw_spin_unlock_irqrestore(&rq->lock, flags); + } } bool cpus_share_cache(int this_cpu, int that_cpu) @@ -2525,6 +2535,8 @@ need_resched: smp_mb__before_spinlock(); raw_spin_lock_irq(&rq->lock); + __sched_ttwu_pending(rq); + switch_count = &prev->nivcsw; if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { if (unlikely(signal_pending_state(prev->state, prev))) { -- 1.8.5.3