From: zijun_hu <zijun_hu@zoho.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: tj@kernel.org, hannes@cmpxchg.org, mhocko@kernel.org,
minchan@kernel.org, zijun_hu@htc.com, rientjes@google.com,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH] mm/vmalloc: fix align value calculation error
Date: Wed, 10 Aug 2016 13:32:59 +0800 [thread overview]
Message-ID: <57AABC8B.1040409@zoho.com> (raw)
In-Reply-To: <20160809142832.623dfdbf666c08b8fc8772d2@linux-foundation.org>
On 08/10/2016 05:28 AM, Andrew Morton wrote:
> On Fri, 5 Aug 2016 23:48:21 +0800 zijun_hu <zijun_hu@zoho.com> wrote:
>
>> From: zijun_hu <zijun_hu@htc.com>
>> Date: Fri, 5 Aug 2016 22:10:07 +0800
>> Subject: [PATCH 1/1] mm/vmalloc: fix align value calculation error
>>
>> it causes double align requirement for __get_vm_area_node() if parameter
>> size is power of 2 and VM_IOREMAP is set in parameter flags
>>
>> get_order_long() is implemented and used instead of fls_long() for
>> fixing the bug
>
> Makes sense. I think.
>
>> --- a/include/linux/bitops.h
>> +++ b/include/linux/bitops.h
>> @@ -192,6 +192,23 @@ static inline unsigned fls_long(unsigned long l)
>> }
>>
>> /**
>> + * get_order_long - get order after rounding @l up to power of 2
>> + * @l: parameter
>> + *
>> + * it is same as get_count_order() but long type parameter
>> + * or 0 is returned if @l == 0UL
>> + */
>> +static inline int get_order_long(unsigned long l)
>> +{
>> + if (l == 0UL)
>> + return 0;
>> + else if (l & (l - 1UL))
>> + return fls_long(l);
>> + else
>> + return fls_long(l) - 1;
>> +}
>> +
>> +/**
>> * __ffs64 - find first set bit in a 64 bit word
>> * @word: The 64 bit word
>> *
>> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
>> index 91f44e7..7d717f3 100644
>> --- a/mm/vmalloc.c
>> +++ b/mm/vmalloc.c
>> @@ -1360,7 +1360,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
>>
>> BUG_ON(in_interrupt());
>> if (flags & VM_IOREMAP)
>> - align = 1ul << clamp_t(int, fls_long(size),
>> + align = 1ul << clamp_t(int, get_order_long(size),
>> PAGE_SHIFT, IOREMAP_MAX_ORDER);
>>
>> size = PAGE_ALIGN(size);
>
> It would be better to call this get_count_order_long(), I think? To
> match get_count_order()?
>
yes, i agree with you to correct function name
i provide another patch called v2 based on your suggestion as shown below
it have following correction against original patch v1
1) use name get_count_order_long() instead of get_order_long()
2) return -1 if @l == 0 to consist with get_order_long()
3) cast type to int before returning from get_count_order_long()
4) move up function parameter checking for __get_vm_area_node()
5) more commit message is offered to make issue and approach clear
any comments about new patch is welcome
this new patch called patch v2 is shown below
WARNING: multiple messages have this Message-ID (diff)
From: zijun_hu <zijun_hu@zoho.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: tj@kernel.org, hannes@cmpxchg.org, mhocko@kernel.org,
minchan@kernel.org, zijun_hu@htc.com, rientjes@google.com,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH] mm/vmalloc: fix align value calculation error
Date: Wed, 10 Aug 2016 13:32:59 +0800 [thread overview]
Message-ID: <57AABC8B.1040409@zoho.com> (raw)
In-Reply-To: <20160809142832.623dfdbf666c08b8fc8772d2@linux-foundation.org>
On 08/10/2016 05:28 AM, Andrew Morton wrote:
> On Fri, 5 Aug 2016 23:48:21 +0800 zijun_hu <zijun_hu@zoho.com> wrote:
>
>> From: zijun_hu <zijun_hu@htc.com>
>> Date: Fri, 5 Aug 2016 22:10:07 +0800
>> Subject: [PATCH 1/1] mm/vmalloc: fix align value calculation error
>>
>> it causes double align requirement for __get_vm_area_node() if parameter
>> size is power of 2 and VM_IOREMAP is set in parameter flags
>>
>> get_order_long() is implemented and used instead of fls_long() for
>> fixing the bug
>
> Makes sense. I think.
>
>> --- a/include/linux/bitops.h
>> +++ b/include/linux/bitops.h
>> @@ -192,6 +192,23 @@ static inline unsigned fls_long(unsigned long l)
>> }
>>
>> /**
>> + * get_order_long - get order after rounding @l up to power of 2
>> + * @l: parameter
>> + *
>> + * it is same as get_count_order() but long type parameter
>> + * or 0 is returned if @l == 0UL
>> + */
>> +static inline int get_order_long(unsigned long l)
>> +{
>> + if (l == 0UL)
>> + return 0;
>> + else if (l & (l - 1UL))
>> + return fls_long(l);
>> + else
>> + return fls_long(l) - 1;
>> +}
>> +
>> +/**
>> * __ffs64 - find first set bit in a 64 bit word
>> * @word: The 64 bit word
>> *
>> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
>> index 91f44e7..7d717f3 100644
>> --- a/mm/vmalloc.c
>> +++ b/mm/vmalloc.c
>> @@ -1360,7 +1360,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
>>
>> BUG_ON(in_interrupt());
>> if (flags & VM_IOREMAP)
>> - align = 1ul << clamp_t(int, fls_long(size),
>> + align = 1ul << clamp_t(int, get_order_long(size),
>> PAGE_SHIFT, IOREMAP_MAX_ORDER);
>>
>> size = PAGE_ALIGN(size);
>
> It would be better to call this get_count_order_long(), I think? To
> match get_count_order()?
>
yes, i agree with you to correct function name
i provide another patch called v2 based on your suggestion as shown below
it have following correction against original patch v1
1) use name get_count_order_long() instead of get_order_long()
2) return -1 if @l == 0 to consist with get_order_long()
3) cast type to int before returning from get_count_order_long()
4) move up function parameter checking for __get_vm_area_node()
5) more commit message is offered to make issue and approach clear
any comments about new patch is welcome
this new patch called patch v2 is shown below
>From 868d3c100f41e16136eed50e47bbfb03d4a16d25 Mon Sep 17 00:00:00 2001
From: zijun_hu <zijun_hu@htc.com>
Date: Wed, 10 Aug 2016 12:13:41 +0800
Subject: [PATCH v2 1/1] mm/vmalloc: fix align value calculation error
it causes double align requirement for __get_vm_area_node() if parameter
size is power of 2 and VM_IOREMAP is set in parameter flags, for example
size=0x10000 -> fls_long(0x10000)=17 -> align=0x20000
get_count_order_long() is implemented and used instead of fls_long() for
fixing the bug, for example
size=0x10000 -> get_count_order_long(0x10000)=16 -> align=0x10000
Signed-off-by: zijun_hu <zijun_hu@htc.com>
---
include/linux/bitops.h | 16 ++++++++++++++++
mm/vmalloc.c | 8 ++++----
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/include/linux/bitops.h b/include/linux/bitops.h
index 299e76b..93a07d1 100644
--- a/include/linux/bitops.h
+++ b/include/linux/bitops.h
@@ -192,6 +192,22 @@ static inline unsigned fls_long(unsigned long l)
}
/**
+ * get_count_order_long - get order after rounding @l up to power of 2
+ * @l: parameter
+ *
+ * it is same as get_count_order() but with long type parameter
+ */
+static inline int get_count_order_long(unsigned long l)
+{
+ if (l == 0UL)
+ return -1;
+ else if (l & (l - 1UL))
+ return (int)fls_long(l);
+ else
+ return (int)fls_long(l) - 1;
+}
+
+/**
* __ffs64 - find first set bit in a 64 bit word
* @word: The 64 bit word
*
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 91f44e7..80660a0 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1359,14 +1359,14 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
struct vm_struct *area;
BUG_ON(in_interrupt());
- if (flags & VM_IOREMAP)
- align = 1ul << clamp_t(int, fls_long(size),
- PAGE_SHIFT, IOREMAP_MAX_ORDER);
-
size = PAGE_ALIGN(size);
if (unlikely(!size))
return NULL;
+ if (flags & VM_IOREMAP)
+ align = 1ul << clamp_t(int, get_count_order_long(size),
+ PAGE_SHIFT, IOREMAP_MAX_ORDER);
+
area = kzalloc_node(sizeof(*area), gfp_mask & GFP_RECLAIM_MASK, node);
if (unlikely(!area))
return NULL;
--
1.9.1
> get_count_order() is a weird name and perhaps both of these should be
> renamed to things which actually make sense. That's a separate issue.
>
okay, perhaps, another patch is applied to correct this weird name issue
in the future due to it is a separate issue now
we use get_count_order_long() to consist with get_order_long() now
next prev parent reply other threads:[~2016-08-10 5:33 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-04 8:02 [PATCH] mm/vmalloc: fix align value calculation error zijun_hu
2016-08-04 8:02 ` zijun_hu
2016-08-04 8:36 ` zijun_hu
2016-08-04 8:36 ` zijun_hu
2016-08-04 21:24 ` Andrew Morton
2016-08-04 21:24 ` Andrew Morton
2016-08-05 2:27 ` zijun_hu
2016-08-05 2:27 ` zijun_hu
2016-08-05 15:48 ` zijun_hu
2016-08-05 15:48 ` zijun_hu
2016-08-09 21:28 ` Andrew Morton
2016-08-09 21:28 ` Andrew Morton
2016-08-10 5:32 ` zijun_hu [this message]
2016-08-10 5:32 ` zijun_hu
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=57AABC8B.1040409@zoho.com \
--to=zijun_hu@zoho.com \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=minchan@kernel.org \
--cc=rientjes@google.com \
--cc=tj@kernel.org \
--cc=zijun_hu@htc.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.