diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 1d6b29e4e2c3..19b6129eab23 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -12,6 +12,8 @@  #include <linux/bpf.h>  #include <linux/syscalls.h>  #include <linux/slab.h> +#include <linux/vmalloc.h> +#include <linux/mmzone.h>  #include <linux/anon_inodes.h>  #include <linux/file.h>  #include <linux/license.h> @@ -49,6 +51,30 @@ void bpf_register_map_type(struct bpf_map_type_list *tl)  	list_add(&tl->list_node, &bpf_map_types);  } +void *bpf_map_area_alloc(size_t size) +{ +	/* We definitely need __GFP_NORETRY, so OOM killer doesn't +	 * trigger under memory pressure as we really just want to +	 * fail instead. +	 */ +	const gfp_t flags = __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO; +	void *area; + +	if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) { +		area = kmalloc(size, GFP_USER | flags); +		if (area != NULL) +			return area; +	} + +	return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | flags, +			 PAGE_KERNEL); +} + +void bpf_map_area_free(void *area) +{ +	kvfree(area); +} +  int bpf_map_precharge_memlock(u32 pages)  {  	struct user_struct *user = get_current_user(); | 
