[Intel-gfx] [PATCH] drm_calloc_large: check right size, check integer overflow, use GFP_ZERO

Kristian Høgsberg krh at bitplanet.net
Thu Jun 11 23:25:41 CEST 2009


Eric, can you pick this one up?  I've seen several cases of rendering
corruption with higher order allocation errors coming from
drm_calloc_large() in dmesg.

thanks,
Kristian

On Mon, Jun 8, 2009 at 8:18 PM, Jesse Barnes<jbarnes at virtuousgeek.org> wrote:
> On Mon,  8 Jun 2009 11:50:41 -0400
> Kristian Høgsberg <krh at bitplanet.net> wrote:
>
>> From: Kristian Høgsberg <krh at redhat.com>
>>
>> Previously we would check size instead of size * nmemb, and so would
>> never hit the vmalloc path.  Also add integer overflow check as in
>> kcalloc, and allocate GFP_ZERO pages instead of memset()ing them.
>>
>> Signed-off-by: Kristian Høgsberg <krh at redhat.com>
>> ---
>>
>> Oops...
>>
>>  include/drm/drmP.h |   12 ++++--------
>>  1 files changed, 4 insertions(+), 8 deletions(-)
>>
>> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
>> index b84d8ae..4660e46 100644
>> --- a/include/drm/drmP.h
>> +++ b/include/drm/drmP.h
>> @@ -1522,18 +1522,14 @@ static __inline__ void *drm_calloc(size_t
>> nmemb, size_t size, int area)
>>  static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
>>  {
>> -     u8 *addr;
>> -
>> -     if (size <= PAGE_SIZE)
>> +     if (size * nmemb <= PAGE_SIZE)
>>           return kcalloc(nmemb, size, GFP_KERNEL);
>>
>> -     addr = vmalloc(nmemb * size);
>> -     if (!addr)
>> +     if (size != 0 && nmemb > ULONG_MAX / size)
>>               return NULL;
>>
>> -     memset(addr, 0, nmemb * size);
>> -
>> -     return addr;
>> +     return __vmalloc(size * nmemb,
>> +                      GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO,
>> PAGE_KERNEL); }
>>
>>  static __inline void drm_free_large(void *ptr)
>
> I fail at calloc.  Thanks Kristian.  Now has someone actually tested
> and found that this removes the "order N allocation failure" messages
> from their logs this time?
>
> Acked-by: Jesse Barnes <jbarnes at virtuousgeek.org>
>



More information about the Intel-gfx mailing list