2023-06-15 08:22:58

by Wang Ming

[permalink] [raw]
Subject: [PATCH v1] mm:Using div64_ul replaces do_div() function

Fix the following coccicheck warning:

mm/mm_init.c:2492:2-8: WARNING: do_div() does a
64-by-32 division, please consider using div64_ul instead.

Signed-off-by: Wang Ming <[email protected]>
---
mm/mm_init.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/mm_init.c b/mm/mm_init.c
index d39363159..d92de78fb 100644
--- a/mm/mm_init.c
+++ b/mm/mm_init.c
@@ -2508,7 +2508,7 @@ void *__init alloc_large_system_hash(const char *tablename,
/* limit allocation size to 1/16 total memory by default */
if (max == 0) {
max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4;
- do_div(max, bucketsize);
+ div64_ul(max, bucketsize);
}
max = min(max, 0x80000000ULL);

--
2.25.1


________________________________
本邮件及其附件内容可能含有机密和/或隐私信息,仅供指定个人或机构使用。若您非发件人指定收件人或其代理人,请勿使用、传播、复制或存储此邮件之任何内容或其附件。如您误收本邮件,请即以回复或电话方式通知发件人,并将原始邮件、附件及其所有复本删除。谢谢。
The contents of this message and any attachments may contain confidential and/or privileged information and are intended exclusively for the addressee(s). If you are not the intended recipient of this message or their agent, please note that any use, dissemination, copying, or storage of this message or its attachments is not allowed. If you receive this message in error, please notify the sender by reply the message or phone and delete this message, any attachments and any copies immediately.
Thank you


2023-06-16 20:29:38

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH v1] mm:Using div64_ul replaces do_div() function

On Thu, 15 Jun 2023 15:51:14 +0800 Wang Ming <[email protected]> wrote:

> Fix the following coccicheck warning:
>
> mm/mm_init.c:2492:2-8: WARNING: do_div() does a
> 64-by-32 division, please consider using div64_ul instead.

I guess coccicheck was fooled by the incorrect comment over do_div().
do_div() returns an unsigned long.

alloc_large_system_hash() should be using a u64 for `max'. Nobody uses
unsigned long long any more.

> --- a/mm/mm_init.c
> +++ b/mm/mm_init.c
> @@ -2508,7 +2508,7 @@ void *__init alloc_large_system_hash(const char *tablename,
> /* limit allocation size to 1/16 total memory by default */
> if (max == 0) {
> max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4;
> - do_div(max, bucketsize);
> + div64_ul(max, bucketsize);
> }
> max = min(max, 0x80000000ULL);


2023-06-20 10:58:31

by David Laight

[permalink] [raw]
Subject: RE: [PATCH v1] mm:Using div64_ul replaces do_div() function

From: Andrew Morton
> Sent: 16 June 2023 20:52
>
> On Thu, 15 Jun 2023 15:51:14 +0800 Wang Ming <[email protected]> wrote:
>
> > Fix the following coccicheck warning:
> >
> > mm/mm_init.c:2492:2-8: WARNING: do_div() does a
> > 64-by-32 division, please consider using div64_ul instead.
>
> I guess coccicheck was fooled by the incorrect comment over do_div().
> do_div() returns an unsigned long.

IIRC do_div() does an in-place update, but div64_ul() returns the result.
So the 'fixed' code is entirely broken.

The coccicheck message should really be 'check the domain/type of the divisor'.

> alloc_large_system_hash() should be using a u64 for `max'. Nobody uses
> unsigned long long any more.

Probably makes no difference.
The issue is with 'buckesize' - probably 'long' so 64bit on 64bit systems.

I guess 'max' can overflow 'long' on 32bit PAE.
Although using min(nr_all_pages, 0x80000000UL >> PAGE_SHIFT >> 4)
and doing everything as 'unsigned long' might be better.

David

>
> > --- a/mm/mm_init.c
> > +++ b/mm/mm_init.c
> > @@ -2508,7 +2508,7 @@ void *__init alloc_large_system_hash(const char *tablename,
> > /* limit allocation size to 1/16 total memory by default */
> > if (max == 0) {
> > max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4;
> > - do_div(max, bucketsize);
> > + div64_ul(max, bucketsize);
> > }
> > max = min(max, 0x80000000ULL);

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)