From: Maxim Patlasov <mpatlasov@parallels.com>
To: Michal Hocko <mhocko@suse.cz>
Cc: Rik van Riel <riel@redhat.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
sandeen@redhat.com, akpm@linux-foundation.org,
jweiner@redhat.com, kosaki.motohiro@jp.fujitsu.com,
fengguang.wu@intel.com
Subject: Re: [PATCH] mm,writeback: fix divide by zero in pos_ratio_polynom
Date: Wed, 30 Apr 2014 12:34:45 +0400 [thread overview]
Message-ID: <5360B5A5.5060101@parallels.com> (raw)
In-Reply-To: <20140430081256.GA4357@dhcp22.suse.cz>
On 04/30/2014 12:12 PM, Michal Hocko wrote:
> On Wed 30-04-14 12:04:04, Maxim Patlasov wrote:
>> Hi Rik!
>>
>> On 04/29/2014 11:19 PM, Rik van Riel wrote:
>>> It is possible for "limit - setpoint + 1" to equal zero, leading to a
>>> divide by zero error. Blindly adding 1 to "limit - setpoint" is not
>>> working, so we need to actually test the divisor before calling div64.
>> The patch looks correct, but I'm afraid it can hide an actual bug in a
>> caller of pos_ratio_polynom(). The latter is not intended for setpoint >
>> limit. All callers take pains to ensure that setpoint <= limit. Look, for
>> example, at global_dirty_limits():
> The bug might trigger even if setpoint < limit because the result is
> trucated to s32 and I guess this is what is going on here?
> Is (limit - setpoint + 1) > 4G possible?
Yes, you are right. Probably the problem came from s32 overflow.
>
>>> if (background >= dirty)
>>> background = dirty / 2;
>> If you ever encountered "limit - setpoint + 1" equal zero, it may be worthy
>> to investigate how you came to setpoint greater than limit.
>>
>> Thanks,
>> Maxim
>>
>>> Signed-off-by: Rik van Riel <riel@redhat.com>
>>> Cc: stable@vger.kernel.org
>>> ---
>>> mm/page-writeback.c | 7 ++++++-
>>> 1 file changed, 6 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/mm/page-writeback.c b/mm/page-writeback.c
>>> index ef41349..2682516 100644
>>> --- a/mm/page-writeback.c
>>> +++ b/mm/page-writeback.c
>>> @@ -597,11 +597,16 @@ static inline long long pos_ratio_polynom(unsigned long setpoint,
>>> unsigned long dirty,
>>> unsigned long limit)
>>> {
>>> + unsigned int divisor;
>>> long long pos_ratio;
>>> long x;
>>> + divisor = limit - setpoint;
>>> + if (!divisor)
>>> + divisor = 1;
>>> +
>>> x = div_s64(((s64)setpoint - (s64)dirty) << RATELIMIT_CALC_SHIFT,
>>> - limit - setpoint + 1);
>>> + divisor);
>>> pos_ratio = x;
>>> pos_ratio = pos_ratio * x >> RATELIMIT_CALC_SHIFT;
>>> pos_ratio = pos_ratio * x >> RATELIMIT_CALC_SHIFT;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
WARNING: multiple messages have this Message-ID (diff)
From: Maxim Patlasov <mpatlasov@parallels.com>
To: Michal Hocko <mhocko@suse.cz>
Cc: Rik van Riel <riel@redhat.com>, <linux-kernel@vger.kernel.org>,
<linux-mm@kvack.org>, <sandeen@redhat.com>,
<akpm@linux-foundation.org>, <jweiner@redhat.com>,
<kosaki.motohiro@jp.fujitsu.com>, <fengguang.wu@intel.com>
Subject: Re: [PATCH] mm,writeback: fix divide by zero in pos_ratio_polynom
Date: Wed, 30 Apr 2014 12:34:45 +0400 [thread overview]
Message-ID: <5360B5A5.5060101@parallels.com> (raw)
In-Reply-To: <20140430081256.GA4357@dhcp22.suse.cz>
On 04/30/2014 12:12 PM, Michal Hocko wrote:
> On Wed 30-04-14 12:04:04, Maxim Patlasov wrote:
>> Hi Rik!
>>
>> On 04/29/2014 11:19 PM, Rik van Riel wrote:
>>> It is possible for "limit - setpoint + 1" to equal zero, leading to a
>>> divide by zero error. Blindly adding 1 to "limit - setpoint" is not
>>> working, so we need to actually test the divisor before calling div64.
>> The patch looks correct, but I'm afraid it can hide an actual bug in a
>> caller of pos_ratio_polynom(). The latter is not intended for setpoint >
>> limit. All callers take pains to ensure that setpoint <= limit. Look, for
>> example, at global_dirty_limits():
> The bug might trigger even if setpoint < limit because the result is
> trucated to s32 and I guess this is what is going on here?
> Is (limit - setpoint + 1) > 4G possible?
Yes, you are right. Probably the problem came from s32 overflow.
>
>>> if (background >= dirty)
>>> background = dirty / 2;
>> If you ever encountered "limit - setpoint + 1" equal zero, it may be worthy
>> to investigate how you came to setpoint greater than limit.
>>
>> Thanks,
>> Maxim
>>
>>> Signed-off-by: Rik van Riel <riel@redhat.com>
>>> Cc: stable@vger.kernel.org
>>> ---
>>> mm/page-writeback.c | 7 ++++++-
>>> 1 file changed, 6 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/mm/page-writeback.c b/mm/page-writeback.c
>>> index ef41349..2682516 100644
>>> --- a/mm/page-writeback.c
>>> +++ b/mm/page-writeback.c
>>> @@ -597,11 +597,16 @@ static inline long long pos_ratio_polynom(unsigned long setpoint,
>>> unsigned long dirty,
>>> unsigned long limit)
>>> {
>>> + unsigned int divisor;
>>> long long pos_ratio;
>>> long x;
>>> + divisor = limit - setpoint;
>>> + if (!divisor)
>>> + divisor = 1;
>>> +
>>> x = div_s64(((s64)setpoint - (s64)dirty) << RATELIMIT_CALC_SHIFT,
>>> - limit - setpoint + 1);
>>> + divisor);
>>> pos_ratio = x;
>>> pos_ratio = pos_ratio * x >> RATELIMIT_CALC_SHIFT;
>>> pos_ratio = pos_ratio * x >> RATELIMIT_CALC_SHIFT;
next prev parent reply other threads:[~2014-04-30 8:34 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-29 19:19 [PATCH] mm,writeback: fix divide by zero in pos_ratio_polynom Rik van Riel
2014-04-29 19:19 ` Rik van Riel
2014-04-29 19:43 ` Motohiro Kosaki
2014-04-29 19:43 ` Motohiro Kosaki
2014-04-29 22:39 ` Andrew Morton
2014-04-29 22:39 ` Andrew Morton
2014-04-29 22:48 ` Rik van Riel
2014-04-29 22:48 ` Rik van Riel
2014-04-29 22:53 ` Andrew Morton
2014-04-29 22:53 ` Andrew Morton
2014-04-30 8:04 ` Maxim Patlasov
2014-04-30 8:04 ` Maxim Patlasov
2014-04-30 8:12 ` Michal Hocko
2014-04-30 8:12 ` Michal Hocko
2014-04-30 8:34 ` Maxim Patlasov [this message]
2014-04-30 8:34 ` Maxim Patlasov
2014-04-30 10:01 ` Masayoshi Mizuma
2014-04-30 10:01 ` Masayoshi Mizuma
2014-04-30 13:30 ` [PATCH v2] " Rik van Riel
2014-04-30 13:30 ` Rik van Riel
2014-04-30 13:48 ` Michal Hocko
2014-04-30 13:48 ` Michal Hocko
2014-04-30 14:26 ` Rik van Riel
2014-04-30 14:26 ` Rik van Riel
2014-04-30 14:31 ` Rik van Riel
2014-04-30 14:31 ` Rik van Riel
2014-04-30 14:49 ` Michal Hocko
2014-04-30 14:49 ` Michal Hocko
2014-04-30 14:52 ` Rik van Riel
2014-04-30 14:52 ` Rik van Riel
2014-04-30 14:41 ` [PATCH v3] " Rik van Riel
2014-04-30 14:41 ` Rik van Riel
2014-04-30 19:00 ` Andrew Morton
2014-04-30 19:00 ` Andrew Morton
2014-04-30 19:30 ` Rik van Riel
2014-04-30 19:30 ` Rik van Riel
2014-04-30 19:35 ` Andrew Morton
2014-04-30 19:35 ` Andrew Morton
2014-04-30 20:02 ` [PATCH v4] " Rik van Riel
2014-04-30 20:02 ` Rik van Riel
2014-04-30 20:13 ` Andrew Morton
2014-04-30 20:13 ` Andrew Morton
2014-04-30 20:32 ` Rik van Riel
2014-04-30 20:32 ` Rik van Riel
2014-04-30 20:42 ` [PATCH v5] " Rik van Riel
2014-04-30 20:42 ` Rik van Riel
2014-04-30 21:00 ` Andrew Morton
2014-04-30 21:00 ` Andrew Morton
2014-04-30 21:21 ` Rik van Riel
2014-04-30 21:21 ` Rik van Riel
2014-04-30 21:32 ` Andrew Morton
2014-04-30 21:32 ` Andrew Morton
2014-05-02 9:16 ` Michal Hocko
2014-05-02 9:16 ` Michal Hocko
2014-05-08 10:17 ` Masayoshi Mizuma
2014-05-08 10:17 ` Masayoshi Mizuma
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=5360B5A5.5060101@parallels.com \
--to=mpatlasov@parallels.com \
--cc=akpm@linux-foundation.org \
--cc=fengguang.wu@intel.com \
--cc=jweiner@redhat.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.cz \
--cc=riel@redhat.com \
--cc=sandeen@redhat.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.