diff mbox

[v2,2/2] mm: vmalloc: Pass proper vm_start into debugobjects

Message ID 20180503144222.bcb5c63bb96309bc3b37fb6f@linux-foundation.org
State New, archived
Headers show

Commit Message

Andrew Morton May 3, 2018, 9:42 p.m. UTC
On Tue, 17 Apr 2018 16:13:48 +0530 Chintan Pandya <cpandya@codeaurora.org> wrote:

> Client can call vunmap with some intermediate 'addr'
> which may not be the start of the VM area. Entire
> unmap code works with vm->vm_start which is proper
> but debug object API is called with 'addr'. This
> could be a problem within debug objects.
> 
> Pass proper start address into debug object API.
> 
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -1124,15 +1124,15 @@ void vm_unmap_ram(const void *mem, unsigned int count)
>  	BUG_ON(addr > VMALLOC_END);
>  	BUG_ON(!PAGE_ALIGNED(addr));
>  
> -	debug_check_no_locks_freed(mem, size);
> -
>  	if (likely(count <= VMAP_MAX_ALLOC)) {
> +		debug_check_no_locks_freed(mem, size);
>  		vb_free(mem, size);
>  		return;
>  	}
>  
>  	va = find_vmap_area(addr);
>  	BUG_ON(!va);
> +	debug_check_no_locks_freed(va->va_start, (va->va_end - va->va_start));
>  	free_unmap_vmap_area(va);
>  }
>  EXPORT_SYMBOL(vm_unmap_ram);

hm, how did this sneak through?

mm/vmalloc.c:1139:29: warning: passing argument 1 of debug_check_no_locks_freed makes pointer from integer without a cast [-Wint-conversion]
  debug_check_no_locks_freed(va->va_start, (va->va_end - va->va_start));

Comments

Chintan Pandya May 4, 2018, 5:55 a.m. UTC | #1
On 5/4/2018 3:12 AM, Andrew Morton wrote:
> On Tue, 17 Apr 2018 16:13:48 +0530 Chintan Pandya <cpandya@codeaurora.org> wrote:
> 
>> Client can call vunmap with some intermediate 'addr'
>> which may not be the start of the VM area. Entire
>> unmap code works with vm->vm_start which is proper
>> but debug object API is called with 'addr'. This
>> could be a problem within debug objects.
>>
>> Pass proper start address into debug object API.
>>
>> --- a/mm/vmalloc.c
>> +++ b/mm/vmalloc.c
>> @@ -1124,15 +1124,15 @@ void vm_unmap_ram(const void *mem, unsigned int count)
>>   	BUG_ON(addr > VMALLOC_END);
>>   	BUG_ON(!PAGE_ALIGNED(addr));
>>   
>> -	debug_check_no_locks_freed(mem, size);
>> -
>>   	if (likely(count <= VMAP_MAX_ALLOC)) {
>> +		debug_check_no_locks_freed(mem, size);
>>   		vb_free(mem, size);
>>   		return;
>>   	}
>>   
>>   	va = find_vmap_area(addr);
>>   	BUG_ON(!va);
>> +	debug_check_no_locks_freed(va->va_start, (va->va_end - va->va_start));
>>   	free_unmap_vmap_area(va);
>>   }
>>   EXPORT_SYMBOL(vm_unmap_ram);
> 
> hm, how did this sneak through?
My bad. I had tested them but missed bringing these compile fixes to the
patch file. Will be careful next time.

> 
> mm/vmalloc.c:1139:29: warning: passing argument 1 of debug_check_no_locks_freed makes pointer from integer without a cast [-Wint-conversion]
>    debug_check_no_locks_freed(va->va_start, (va->va_end - va->va_start));
> 
> --- a/mm/vmalloc.c~mm-vmalloc-pass-proper-vm_start-into-debugobjects-fix
> +++ a/mm/vmalloc.c
> @@ -1136,7 +1136,8 @@ void vm_unmap_ram(const void *mem, unsig
>   
>   	va = find_vmap_area(addr);
>   	BUG_ON(!va);
> -	debug_check_no_locks_freed(va->va_start, (va->va_end - va->va_start));
> +	debug_check_no_locks_freed((void *)va->va_start,
> +				    (va->va_end - va->va_start));
>   	free_unmap_vmap_area(va);
>   }
>   EXPORT_SYMBOL(vm_unmap_ram);
> 

Chintan
diff mbox

Patch

--- a/mm/vmalloc.c~mm-vmalloc-pass-proper-vm_start-into-debugobjects-fix
+++ a/mm/vmalloc.c
@@ -1136,7 +1136,8 @@  void vm_unmap_ram(const void *mem, unsig
 
 	va = find_vmap_area(addr);
 	BUG_ON(!va);
-	debug_check_no_locks_freed(va->va_start, (va->va_end - va->va_start));
+	debug_check_no_locks_freed((void *)va->va_start,
+				    (va->va_end - va->va_start));
 	free_unmap_vmap_area(va);
 }
 EXPORT_SYMBOL(vm_unmap_ram);