All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: miaox@cn.fujitsu.com
Cc: Ingo Molnar <mingo@elte.hu>, Linux-Kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] sched: fair-group: fix a Div0 error of the fair group scheduler
Date: Mon, 28 Apr 2008 10:34:03 +0200	[thread overview]
Message-ID: <1209371643.13978.3.camel@twins> (raw)
In-Reply-To: <481558A0.9020803@cn.fujitsu.com>

On Mon, 2008-04-28 at 12:54 +0800, Miao Xie wrote:
> When I echoed 0 into the "cpu.shares" file, a Div0 error occured.
> 
> We found it is caused by the following calling.
> 
>    sched_group_set_shares(tg, shares)
>        set_se_shares(tg->se[i], shares/nr_cpu_ids)
>            __set_se_shares(se, shares)
>                div64_64((1ULL<<32), shares)
> 
> When the echoed value was less than the number of processores, the result of the
> sentence "shares/nr_cpu_ids" was 0, and then the system called div64() to divide
> the result, the Div0 error occured.
> 
> It is unnecessary that the shares value is divided by nr_cpu_ids, I think.
> Because in the function  __update_group_shares_cpu() and init_tg_cfs_entry(),
> the shares value isn't divided by nr_cpu_ids when setting shares of the sched
> entity.
> 
> This patch fixes this bug. And echoing ULONG_MAX value into cpu.shares also
> causes Div0 error, so we set a macro MAX_SHARES to limit the max value of
> shares.
> 
> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>

Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>

> ---
>   kernel/sched.c |   17 +++++++++++------
>   1 files changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 740fb40..aa1bb81 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -318,7 +318,13 @@ static DEFINE_MUTEX(doms_cur_mutex);
>   # define INIT_TASK_GROUP_LOAD	NICE_0_LOAD
>   #endif
> 
> +/*
> + * A weight of 0, 1 or ULONG_MAX can cause arithmetics problems.
> + * (The default weight is 1024 - so there's no practical
> + *  limitation from this.)
> + */
>   #define MIN_SHARES	2
> +#define MAX_SHARES	(ULONG_MAX - 1)
> 
>   static int init_task_group_load = INIT_TASK_GROUP_LOAD;
>   #endif
> @@ -1748,6 +1754,8 @@ __update_group_shares_cpu(struct task_group *tg, struct sched_domain *sd,
> 
>   	if (shares < MIN_SHARES)
>   		shares = MIN_SHARES;
> +	else if (shares > MAX_SHARES)
> +		shares = MAX_SHARES;
> 
>   	__set_se_shares(tg->se[tcpu], shares);
>   }
> @@ -8722,13 +8730,10 @@ int sched_group_set_shares(struct task_group *tg, unsigned long shares)
>   	if (!tg->se[0])
>   		return -EINVAL;
> 
> -	/*
> -	 * A weight of 0 or 1 can cause arithmetics problems.
> -	 * (The default weight is 1024 - so there's no practical
> -	 *  limitation from this.)
> -	 */
>   	if (shares < MIN_SHARES)
>   		shares = MIN_SHARES;
> +	else if (shares > MAX_SHARES)
> +		shares = MAX_SHARES;
> 
>   	mutex_lock(&shares_mutex);
>   	if (tg->shares == shares)
> @@ -8753,7 +8758,7 @@ int sched_group_set_shares(struct task_group *tg, unsigned long shares)
>   		 * force a rebalance
>   		 */
>   		cfs_rq_set_shares(tg->cfs_rq[i], 0);
> -		set_se_shares(tg->se[i], shares/nr_cpu_ids);
> +		set_se_shares(tg->se[i], shares);
>   	}
> 
>   	/*


  parent reply	other threads:[~2008-04-28  8:34 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-28  4:54 [PATCH] sched: fair-group: fix a Div0 error of the fair group scheduler Miao Xie
2008-04-28  5:45 ` Peter Zijlstra
2008-04-28  8:27   ` Miao Xie
2008-04-28  8:33     ` Peter Zijlstra
2008-04-28  8:34 ` Peter Zijlstra [this message]
2008-04-28 12:51 ` Ingo Molnar

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=1209371643.13978.3.camel@twins \
    --to=a.p.zijlstra@chello.nl \
    --cc=linux-kernel@vger.kernel.org \
    --cc=miaox@cn.fujitsu.com \
    --cc=mingo@elte.hu \
    /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.