sched: add rt-overload tracking

This patch adds an RT overload accounting system. When a runqueue has
more than one RT task queued, it is marked as overloaded. That is that it
is a candidate to have RT tasks pulled from it.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Steven Rostedt 2008-01-25 21:08:06 +01:00 committed by Ingo Molnar
parent e8fa136262
commit 4fd29176b7

View file

@ -3,6 +3,38 @@
* policies) * policies)
*/ */
#ifdef CONFIG_SMP
static cpumask_t rt_overload_mask;
static atomic_t rto_count;
static inline int rt_overloaded(void)
{
return atomic_read(&rto_count);
}
static inline cpumask_t *rt_overload(void)
{
return &rt_overload_mask;
}
static inline void rt_set_overload(struct rq *rq)
{
cpu_set(rq->cpu, rt_overload_mask);
/*
* Make sure the mask is visible before we set
* the overload count. That is checked to determine
* if we should look at the mask. It would be a shame
* if we looked at the mask, but the mask was not
* updated yet.
*/
wmb();
atomic_inc(&rto_count);
}
static inline void rt_clear_overload(struct rq *rq)
{
/* the order here really doesn't matter */
atomic_dec(&rto_count);
cpu_clear(rq->cpu, rt_overload_mask);
}
#endif /* CONFIG_SMP */
/* /*
* Update the current task's runtime statistics. Skip current tasks that * Update the current task's runtime statistics. Skip current tasks that
* are not in our scheduling class. * are not in our scheduling class.
@ -33,6 +65,8 @@ static inline void inc_rt_tasks(struct task_struct *p, struct rq *rq)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (p->prio < rq->rt.highest_prio) if (p->prio < rq->rt.highest_prio)
rq->rt.highest_prio = p->prio; rq->rt.highest_prio = p->prio;
if (rq->rt.rt_nr_running > 1)
rt_set_overload(rq);
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
} }
@ -54,6 +88,8 @@ static inline void dec_rt_tasks(struct task_struct *p, struct rq *rq)
} /* otherwise leave rq->highest prio alone */ } /* otherwise leave rq->highest prio alone */
} else } else
rq->rt.highest_prio = MAX_RT_PRIO; rq->rt.highest_prio = MAX_RT_PRIO;
if (rq->rt.rt_nr_running < 2)
rt_clear_overload(rq);
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
} }