diff mbox

[1/2] vmalloc: use ZERO_SIZE_PTR / ZERO_OR_NULL_PTR

Message ID 1330421640-5137-1-git-send-email-dmitry.antipov@linaro.org
State New
Headers show

Commit Message

Dmitry Antipov Feb. 28, 2012, 9:33 a.m. UTC
- Fix vmap() to return ZERO_SIZE_PTR if 0 pages are requested;
 - fix __vmalloc_node_range() to return ZERO_SIZE_PTR if 0 bytes
   are requested;
 - fix __vunmap() to check passed pointer with ZERO_OR_NULL_PTR.

Signed-off-by: Dmitry Antipov <dmitry.antipov@linaro.org>
---
 mm/vmalloc.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

Comments

Dan Carpenter Feb. 28, 2012, 9:44 a.m. UTC | #1
On Tue, Feb 28, 2012 at 01:33:59PM +0400, Dmitry Antipov wrote:
>  - Fix vmap() to return ZERO_SIZE_PTR if 0 pages are requested;
>  - fix __vmalloc_node_range() to return ZERO_SIZE_PTR if 0 bytes
>    are requested;
>  - fix __vunmap() to check passed pointer with ZERO_OR_NULL_PTR.
> 

Why?

Also patch 2/2 should go in before patch 1/2 or it breaks things.

regards,
dan carpenter
Dmitry Antipov Feb. 28, 2012, 11:59 a.m. UTC | #2
On 02/28/2012 01:44 PM, Dan Carpenter wrote:
> On Tue, Feb 28, 2012 at 01:33:59PM +0400, Dmitry Antipov wrote:
>>   - Fix vmap() to return ZERO_SIZE_PTR if 0 pages are requested;
>>   - fix __vmalloc_node_range() to return ZERO_SIZE_PTR if 0 bytes
>>     are requested;
>>   - fix __vunmap() to check passed pointer with ZERO_OR_NULL_PTR.
>>
>
> Why?

1) it was requested by the subsystem (co?)maintainer, see http://lkml.org/lkml/2012/1/27/475;
2) this looks to be a convenient way to trace/debug zero-size allocation errors (although
    I don't advocate it as a best way).

Dmitry
Dan Carpenter Feb. 28, 2012, 1:30 p.m. UTC | #3
On Tue, Feb 28, 2012 at 03:59:25PM +0400, Dmitry Antipov wrote:
> On 02/28/2012 01:44 PM, Dan Carpenter wrote:
> >On Tue, Feb 28, 2012 at 01:33:59PM +0400, Dmitry Antipov wrote:
> >>  - Fix vmap() to return ZERO_SIZE_PTR if 0 pages are requested;
> >>  - fix __vmalloc_node_range() to return ZERO_SIZE_PTR if 0 bytes
> >>    are requested;
> >>  - fix __vunmap() to check passed pointer with ZERO_OR_NULL_PTR.
> >>
> >
> >Why?
> 
> 1) it was requested by the subsystem (co?)maintainer, see http://lkml.org/lkml/2012/1/27/475;
> 2) this looks to be a convenient way to trace/debug zero-size allocation errors (although
>    I don't advocate it as a best way).

Could you include that in the changelog when the final version is
ready?

regards,
dan carpenter
Dmitry Antipov Feb. 29, 2012, 6:53 a.m. UTC | #4
On 02/28/2012 05:30 PM, Dan Carpenter wrote:

> Could you include that in the changelog when the final version is
> ready?

What changelog you're saying about?

Dmitry
Dan Carpenter Feb. 29, 2012, 7:10 a.m. UTC | #5
On Wed, Feb 29, 2012 at 10:53:13AM +0400, Dmitry Antipov wrote:
> On 02/28/2012 05:30 PM, Dan Carpenter wrote:
> 
> >Could you include that in the changelog when the final version is
> >ready?
> 
> What changelog you're saying about?
> 

The commit message to this patch.  Right now it just says "fix
vmalloc" but it doesn't say what the bug is or why the new version
is better.  You and Rusty know the reasons already but we should
write them down in the changelog so other people can follow along as
well.

regards,
dan carpenter
Amit Kucheria Feb. 29, 2012, 8:29 a.m. UTC | #6
On Wed, Feb 29, 2012 at 8:53 AM, Dmitry Antipov
<dmitry.antipov@linaro.org> wrote:
> On 02/28/2012 05:30 PM, Dan Carpenter wrote:
>
>> Could you include that in the changelog when the final version is
>> ready?
>
>
> What changelog you're saying about?

Dmitry, he means your commit log message.
diff mbox

Patch

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 86ce9a5..040a9cd 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1456,7 +1456,7 @@  static void __vunmap(const void *addr, int deallocate_pages)
 {
 	struct vm_struct *area;
 
-	if (!addr)
+	if (unlikely(ZERO_OR_NULL_PTR(addr)))
 		return;
 
 	if ((PAGE_SIZE-1) & (unsigned long)addr) {
@@ -1548,7 +1548,9 @@  void *vmap(struct page **pages, unsigned int count,
 
 	might_sleep();
 
-	if (count > totalram_pages)
+	if (unlikely(!count))
+		return ZERO_SIZE_PTR;
+	if (unlikely(count > totalram_pages))
 		return NULL;
 
 	area = get_vm_area_caller((count << PAGE_SHIFT), flags,
@@ -1648,8 +1650,10 @@  void *__vmalloc_node_range(unsigned long size, unsigned long align,
 	void *addr;
 	unsigned long real_size = size;
 
+	if (unlikely(!size))
+		return ZERO_SIZE_PTR;
 	size = PAGE_ALIGN(size);
-	if (!size || (size >> PAGE_SHIFT) > totalram_pages)
+	if (unlikely((size >> PAGE_SHIFT) > totalram_pages))
 		goto fail;
 
 	area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST,