Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/drm/drm_mem_util.h
10814 views
1
/*
2
* Copyright © 2008 Intel Corporation
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice (including the next
12
* paragraph) shall be included in all copies or substantial portions of the
13
* Software.
14
*
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
* IN THE SOFTWARE.
22
*
23
* Authors:
24
* Jesse Barnes <[email protected]>
25
*
26
*/
27
#ifndef _DRM_MEM_UTIL_H_
28
#define _DRM_MEM_UTIL_H_
29
30
#include <linux/vmalloc.h>
31
32
static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
33
{
34
if (size != 0 && nmemb > ULONG_MAX / size)
35
return NULL;
36
37
if (size * nmemb <= PAGE_SIZE)
38
return kcalloc(nmemb, size, GFP_KERNEL);
39
40
return __vmalloc(size * nmemb,
41
GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
42
}
43
44
/* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */
45
static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size)
46
{
47
if (size != 0 && nmemb > ULONG_MAX / size)
48
return NULL;
49
50
if (size * nmemb <= PAGE_SIZE)
51
return kmalloc(nmemb * size, GFP_KERNEL);
52
53
return __vmalloc(size * nmemb,
54
GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL);
55
}
56
57
static __inline void drm_free_large(void *ptr)
58
{
59
if (!is_vmalloc_addr(ptr))
60
return kfree(ptr);
61
62
vfree(ptr);
63
}
64
65
#endif
66
67