sched: modification of TASK_PREEMPTS_CURRENT to avoid redundant reschedules (e.g. in set_user_nice)
PATCH 1/1 sched: modification of TASK_PREEMPTS_CURRENT to avoid redundant reschedules (e.g. in set_user_nice)
From: Dmitry Adamushko <[email protected]>
o Fixed a mail client (shouldn't be white-space damaged now);
o Andrew, a patch against SD will follow.
---
o Make TASK_PREEMPTS_CURR(task, rq) return "true" only if the task's prio is higher than the current's one and the task is in the "active" array.
This ensures we don't make redundant resched_task() calls when the task is in the "expired" array (as may happen now in set_user_prio(), rt_mutex_setprio() and pull_task() ) ;
o generilise conditions for a call to resched_task() in set_user_nice(), rt_mutex_setprio() and sched_setscheduler()
Signed-off-by Dmitry Adamushko <[email protected]>
---
kernel/sched.c renamed from kernel/sched-orig.c +16 -18
@@ -168,7 +168,7 @@ unsigned long long __attribute__((weak)) (MAX_BONUS / 2 + DELTA((p)) + 1) / MAX_BONUS - 1))#define TASK_PREEMPTS_CURR (p, rq) \ - ((p)->prio < (rq)->curr->prio) + (((p)->prio < (rq)->curr->prio) && ((p)->array == (rq)->active))#define SCALE_PRIO (x, prio) \ max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO / 2), MIN_TIMESLICE)
@@ -3847,13 +3847,13 @@ void rt_mutex_setprio(struct task_structstruct prio_array *array;unsigned long flags;struct rq *rq; -int oldprio; +int delta;BUG_ON (prio <0 || prio >MAX_PRIO ); rq =task_rq_lock (p, &flags); - oldprio = p->prio; + delta = prio - p->prio; array = p->array;if (array)dequeue_task (p, array);
@@ -3869,13 +3869,11 @@ void rt_mutex_setprio(struct task_structenqueue_task (p, array);/* * Reschedule if we are currently running on this runqueue and -* our priority decreased, or if we are not currently running on -* this runqueue and our priority is higher than the current's +* our priority decreased, or if our priority became higher +* than the current's. */ -if (task_running (rq, p)) { -if (p->prio > oldprio) -resched_task (rq->curr); - }else if (TASK_PREEMPTS_CURR (p, rq)) +if (TASK_PREEMPTS_CURR (p, rq) || + (delta >0 &&task_running (rq, p)))resched_task (rq->curr); }task_rq_unlock (rq, &flags);
@@ -3923,10 +3921,12 @@ void set_user_nice(struct task_struct *penqueue_task (p, array);inc_raw_weighted_load (rq, p);/* -* If the task increased its priority or is running and -* lowered its priority, then reschedule its CPU: +* Reschedule if we are currently running on this runqueue and +* our priority decreased, or if our priority became higher +* than the current's. */ -if (delta <0 || (delta >0 &&task_running (rq, p))) +if (TASK_PREEMPTS_CURR (p, rq) || + (delta >0 &&task_running (rq, p)))resched_task (rq->curr); } out_unlock:
@@ -4153,13 +4153,11 @@ recheck:__activate_task (p, rq);/* * Reschedule if we are currently running on this runqueue and -* our priority decreased, or if we are not currently running on -* this runqueue and our priority is higher than the current's +* our priority decreased, or our priority became higher +* than the current's. */ -if (task_running (rq, p)) { -if (p->prio > oldprio) -resched_task (rq->curr); - }else if (TASK_PREEMPTS_CURR (p, rq)) +if (TASK_PREEMPTS_CURR (p, rq) || + (task_running (rq, p) && p->prio > oldprio))resched_task (rq->curr); }__task_rq_unlock (rq);