All of lore.kernel.org
 help / color / mirror / Atom feed
From: Miao Xie <miaox@cn.fujitsu.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
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 16:27:36 +0800	[thread overview]
Message-ID: <48158A78.5010904@cn.fujitsu.com> (raw)
In-Reply-To: <1209361544.6429.4.camel@lappy>

on 2008-4-28 13:45 Peter Zijlstra wrote:
> 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.
> 
> how about:
> 
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 740fb40..b68127a 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -8025,7 +8025,7 @@ static void init_tg_cfs_entry(struct task_group *tg, struct cfs_rq *cfs_rq,
>  
>  	se->my_q = cfs_rq;
>  	se->load.weight = tg->shares;
> -	se->load.inv_weight = div64_64(1ULL<<32, se->load.weight);
> +	se->load.inv_weight = 0;
>  	se->parent = parent;
>  }
>  #endif
> @@ -8692,7 +8692,7 @@ static void __set_se_shares(struct sched_entity *se, unsigned long shares)
>  		dequeue_entity(cfs_rq, se, 0);
>  
>  	se->load.weight = shares;
> -	se->load.inv_weight = div64_64((1ULL<<32), shares);
> +	se->load.inv_weight = 0;
>  
>  	if (on_rq)
>  		enqueue_entity(cfs_rq, se, 0);
> 

I'm sorry, I didn't explained clearly.Though echoing ULONG_MAX value into
cpu.shares causes Div0 error, this error was not caused by the above code.
It is caused by the following code.

    calc_delta_mine()
        ->lw->inv_weight = (WMULT_CONST-lw->weight/2) / (lw->weight+1);

And besides, the Div0 error caused by echoing ULONG_MAX occured on the UP system
or on SMP system with only one cpu.

So this patch fixes the bug caused by echoing a number which was less than the number
of processores into the "cpu.shares" file, but doesn't fix the bug caused by echoing
ULONG_MAX.


  reply	other threads:[~2008-04-28  8:27 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 [this message]
2008-04-28  8:33     ` Peter Zijlstra
2008-04-28  8:34 ` Peter Zijlstra
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=48158A78.5010904@cn.fujitsu.com \
    --to=miaox@cn.fujitsu.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=linux-kernel@vger.kernel.org \
    --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.