sched/core: Make sched_ttwu_pending() atomic in time
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>
This commit is contained in:
Родитель
7134b3e941
Коммит
77558e4d01
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче