sched/core: Make sched_ttwu_pending() atomic in time
authorPeter Zijlstra <peterz@infradead.org>
Tue, 21 Feb 2017 13:36:23 +0000 (14:36 +0100)
committerIngo Molnar <mingo@kernel.org>
Thu, 16 Mar 2017 08:46:24 +0000 (09:46 +0100)
Since all tasks on the wake_list are woken under a single rq->lock
avoid calling update_rq_clock() for each task.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/core.c

index 247d0a0c319e19e83e618c9086a713ed9c150a66..dead90d680fd9aca3873c175d59b7aa8aea2e1a6 100644 (file)
@@ -1685,7 +1685,7 @@ static void
 ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags,
                 struct rq_flags *rf)
 {
-       int en_flags = ENQUEUE_WAKEUP;
+       int en_flags = ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK;
 
        lockdep_assert_held(&rq->lock);
 
@@ -1737,6 +1737,7 @@ void sched_ttwu_pending(void)
                return;
 
        rq_lock_irqsave(rq, &rf);
+       update_rq_clock(rq);
 
        while (llist) {
                int wake_flags = 0;
@@ -1849,6 +1850,7 @@ static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags)
 #endif
 
        rq_lock(rq, &rf);
+       update_rq_clock(rq);
        ttwu_do_activate(rq, p, wake_flags, &rf);
        rq_unlock(rq, &rf);
 }