mm: vmalloc: introduce array allocation functions
ANBZ: #9482
commit a8749a35c3
upstream.
Linux has dozens of occurrences of vmalloc(array_size()) and
vzalloc(array_size()). Allow to simplify the code by providing
vmalloc_array and vcalloc, as well as the underscored variants that let
the caller specify the GFP flags.
Acked-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alexander Ofitserov <oficerovas@altlinux.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Reviewed-by: Xu Yu <xuyu@linux.alibaba.com>
Link: https://gitee.com/anolis/cloud-kernel/pulls/3570
This commit is contained in:
parent
0270faefea
commit
4aa5bead8f
|
@ -147,6 +147,11 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
|
|||
void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask,
|
||||
int node, const void *caller);
|
||||
|
||||
extern void *__vmalloc_array(size_t n, size_t size, gfp_t flags);
|
||||
extern void *vmalloc_array(size_t n, size_t size);
|
||||
extern void *__vcalloc(size_t n, size_t size, gfp_t flags);
|
||||
extern void *vcalloc(size_t n, size_t size);
|
||||
|
||||
extern void vfree(const void *addr);
|
||||
extern void vfree_atomic(const void *addr);
|
||||
|
||||
|
|
50
mm/util.c
50
mm/util.c
|
@ -686,6 +686,56 @@ static inline void *__page_rmapping(struct page *page)
|
|||
return (void *)mapping;
|
||||
}
|
||||
|
||||
/**
|
||||
* __vmalloc_array - allocate memory for a virtually contiguous array.
|
||||
* @n: number of elements.
|
||||
* @size: element size.
|
||||
* @flags: the type of memory to allocate (see kmalloc).
|
||||
*/
|
||||
void *__vmalloc_array(size_t n, size_t size, gfp_t flags)
|
||||
{
|
||||
size_t bytes;
|
||||
|
||||
if (unlikely(check_mul_overflow(n, size, &bytes)))
|
||||
return NULL;
|
||||
return __vmalloc(bytes, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(__vmalloc_array);
|
||||
|
||||
/**
|
||||
* vmalloc_array - allocate memory for a virtually contiguous array.
|
||||
* @n: number of elements.
|
||||
* @size: element size.
|
||||
*/
|
||||
void *vmalloc_array(size_t n, size_t size)
|
||||
{
|
||||
return __vmalloc_array(n, size, GFP_KERNEL);
|
||||
}
|
||||
EXPORT_SYMBOL(vmalloc_array);
|
||||
|
||||
/**
|
||||
* __vcalloc - allocate and zero memory for a virtually contiguous array.
|
||||
* @n: number of elements.
|
||||
* @size: element size.
|
||||
* @flags: the type of memory to allocate (see kmalloc).
|
||||
*/
|
||||
void *__vcalloc(size_t n, size_t size, gfp_t flags)
|
||||
{
|
||||
return __vmalloc_array(n, size, flags | __GFP_ZERO);
|
||||
}
|
||||
EXPORT_SYMBOL(__vcalloc);
|
||||
|
||||
/**
|
||||
* vcalloc - allocate and zero memory for a virtually contiguous array.
|
||||
* @n: number of elements.
|
||||
* @size: element size.
|
||||
*/
|
||||
void *vcalloc(size_t n, size_t size)
|
||||
{
|
||||
return __vmalloc_array(n, size, GFP_KERNEL | __GFP_ZERO);
|
||||
}
|
||||
EXPORT_SYMBOL(vcalloc);
|
||||
|
||||
/* Neutral page->mapping pointer to address_space or anon_vma or other */
|
||||
void *page_rmapping(struct page *page)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue