/* Allocate enough pages to cover @size from the page level allocator with @gfp_mask flags. Map them into contiguous kernel virtual space, using a pagetable protection of @prot.  */
static void * __vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask, pgprot_t prot, int node, void *caller)
/* Allocate enough pages to cover @size from the page level allocator with @gfp_mask flags. Map them into contiguous kernel virtual space, using a pagetable protection of @prot.  */
static void * __vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask, pgprot_t prot, int node, void *caller)
{
	struct vm_struct *area;
	void *addr;
	unsigned long real_size = size;
	size = PAGE_ALIGN(size);
	if (!size || (size >> PAGE_SHIFT) > totalram_pages)
		return NULL;
	area = __get_vm_area_node(size, align, VM_ALLOC, VMALLOC_START,
				  VMALLOC_END, node, gfp_mask, caller);
	if (!area)
		return NULL;
	addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller);
	kmemleak_alloc(addr, real_size, 3, gfp_mask);
	return addr;
}