lkml.org 
[lkml]   [2007]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 04/17] RT overloaded runqueues accounting
    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>
    ---
    kernel/sched_rt.c | 36 ++++++++++++++++++++++++++++++++++++
    1 file changed, 36 insertions(+)

    Index: linux-compile.git/kernel/sched_rt.c
    ===================================================================
    --- linux-compile.git.orig/kernel/sched_rt.c 2007-11-16 21:56:29.000000000 -0500
    +++ linux-compile.git/kernel/sched_rt.c 2007-11-16 22:12:07.000000000 -0500
    @@ -3,6 +3,38 @@
    * 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
    * are not in our scheduling class.
    @@ -32,6 +64,8 @@ static inline void inc_rt_tasks(struct t
    #ifdef CONFIG_SMP
    if (p->prio < rq->rt.highest_prio)
    rq->rt.highest_prio = p->prio;
    + if (rq->rt.rt_nr_running > 1)
    + rt_set_overload(rq);
    #endif /* CONFIG_SMP */
    }

    @@ -53,6 +87,8 @@ static inline void dec_rt_tasks(struct t
    } /* otherwise leave rq->highest prio alone */
    } else
    rq->rt.highest_prio = MAX_RT_PRIO;
    + if (rq->rt.rt_nr_running < 2)
    + rt_clear_overload(rq);
    #endif /* CONFIG_SMP */
    }

    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-11-17 07:29    [W:0.029 / U:0.072 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site