All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yong Zhang <yong.zhang0@gmail.com>
To: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@elte.hu>, Peter Zijlstra <pzijlstr@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Bharata B Rao <bharata.rao@in.ibm.com>
Subject: Re: [BUGFIX][PATCH] Fix sched rt group scheduling when hierachy is enabled
Date: Thu, 3 Mar 2011 22:05:51 +0800	[thread overview]
Message-ID: <20110303140551.GA20677@zhy> (raw)
In-Reply-To: <20110303113435.GA2868@balbir.in.ibm.com>

On Thu, Mar 03, 2011 at 05:04:35PM +0530, Balbir Singh wrote:
> Fix hierarchical scheduling in sched rt group
> 
> From: Balbir Singh <balbir@linux.vnet.ibm.com>
> 
> The current sched rt code is broken when it comes to hierarchical
> scheduling, this patch fixes two problems
> 
> 1. It adds redundant enqueuing (harmless) when it finds a queue
>    has tasks enqueued, but it has no run time and it is not
>    throttled.

You say redundant here, so in fact we don't need it, right?

> 2. The most important change is in sched_rt_rq_enqueue/dequeue.
>    The code just picks the rt_rq belonging to the current cpu
>    on which the period timer runs, the patch fixes it, so that
>    the correct rt_se is enqueued/dequeued.

Ah, this is true. It is also needed for stable-2.6.33+

Thanks,
Yong

> 
> Tested with a simple hierarchy
> 
> /c/d, c and d assigned similar runtimes of 50,000 and a while
> 1 loop runs within "d". Both c and d get throttled, without
> the patch, the task just stops running and never runs (depends
> on where the sched_rt b/w timer runs). With the patch, the
> task is throttled and runs as expected.
> 
> [bharata, suggestions on how to pick the rt_se belong to the rt_rq
> and correct cpu]
> 
> Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
> Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> ---
>  kernel/sched_rt.c |   14 +++++++++-----
>  1 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
> index ad62677..01f75a5 100644
> --- a/kernel/sched_rt.c
> +++ b/kernel/sched_rt.c
> @@ -210,11 +210,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se);
>  
>  static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
>  {
> -	int this_cpu = smp_processor_id();
>  	struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
>  	struct sched_rt_entity *rt_se;
>  
> -	rt_se = rt_rq->tg->rt_se[this_cpu];
> +	int cpu = cpu_of(rq_of_rt_rq(rt_rq));
> +
> +	rt_se = rt_rq->tg->rt_se[cpu];
>  
>  	if (rt_rq->rt_nr_running) {
>  		if (rt_se && !on_rt_rq(rt_se))
> @@ -226,10 +227,10 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
>  
>  static void sched_rt_rq_dequeue(struct rt_rq *rt_rq)
>  {
> -	int this_cpu = smp_processor_id();
>  	struct sched_rt_entity *rt_se;
> +	int cpu = cpu_of(rq_of_rt_rq(rt_rq));
>  
> -	rt_se = rt_rq->tg->rt_se[this_cpu];
> +	rt_se = rt_rq->tg->rt_se[cpu];
>  
>  	if (rt_se && on_rt_rq(rt_se))
>  		dequeue_rt_entity(rt_se);
> @@ -565,8 +566,11 @@ static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun)
>  			if (rt_rq->rt_time || rt_rq->rt_nr_running)
>  				idle = 0;
>  			raw_spin_unlock(&rt_rq->rt_runtime_lock);
> -		} else if (rt_rq->rt_nr_running)
> +		} else if (rt_rq->rt_nr_running) {
>  			idle = 0;
> +			if (!rt_rq_throttled(rt_rq))
> +				enqueue = 1;
> +		}
>  
>  		if (enqueue)
>  			sched_rt_rq_enqueue(rt_rq);
> 
> -- 
> 	Three Cheers,
> 	Balbir
> --
> 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/

  reply	other threads:[~2011-03-03 14:06 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-03 11:34 [BUGFIX][PATCH] Fix sched rt group scheduling when hierachy is enabled Balbir Singh
2011-03-03 14:05 ` Yong Zhang [this message]
2011-03-03 15:29   ` Balbir Singh
2011-03-04  3:43     ` Yong Zhang
2011-03-04  7:25       ` Balbir Singh
2011-03-04  8:32         ` Yong Zhang
2011-03-04  8:35           ` Balbir Singh
2011-03-04  8:52             ` Yong Zhang
2011-03-04  8:59               ` Balbir Singh
2011-03-04  9:30                 ` Yong Zhang
2011-03-04 12:11                   ` Balbir Singh
2011-03-07  7:00                     ` Yong Zhang
2011-03-08  8:42                       ` Yong Zhang
2011-03-08 18:34                         ` Balbir Singh
2011-03-04 11:49 ` [tip:sched/core] sched: " tip-bot for Balbir Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110303140551.GA20677@zhy \
    --to=yong.zhang0@gmail.com \
    --cc=balbir@linux.vnet.ibm.com \
    --cc=bharata.rao@in.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=pzijlstr@redhat.com \
    --cc=vatsa@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.