aboutsummaryrefslogtreecommitdiffstats
path: root/include/drm
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2009-06-09 01:50:41 +1000
committerDave Airlie <airlied@redhat.com>2009-06-12 15:37:28 +1000
commitfbe0efb869efde8d847ede3a925230ef88910086 (patch)
treefb7df90bd25a77555db351a6db632e52aab311e2 /include/drm
parentdrm: Eliminate magic I2C frobbing when reading EDID (diff)
downloadlinux-dev-fbe0efb869efde8d847ede3a925230ef88910086.tar.xz
linux-dev-fbe0efb869efde8d847ede3a925230ef88910086.zip
drm_calloc_large: check right size, check integer overflow, use GFP_ZERO
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@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm')
-rw-r--r--include/drm/drmP.h12
1 files changed, 4 insertions, 8 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index afc21685230e..1cc51a0812fe 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1573,18 +1573,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)