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 @@ | |||
12 | #include <linux/bpf.h> | 12 | #include <linux/bpf.h> |
13 | #include <linux/syscalls.h> | 13 | #include <linux/syscalls.h> |
14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
15 | #include <linux/vmalloc.h> | ||
16 | #include <linux/mmzone.h> | ||
15 | #include <linux/anon_inodes.h> | 17 | #include <linux/anon_inodes.h> |
16 | #include <linux/file.h> | 18 | #include <linux/file.h> |
17 | #include <linux/license.h> | 19 | #include <linux/license.h> |
@@ -49,6 +51,30 @@ void bpf_register_map_type(struct bpf_map_type_list *tl) | |||
49 | list_add(&tl->list_node, &bpf_map_types); | 51 | list_add(&tl->list_node, &bpf_map_types); |
50 | } | 52 | } |
51 | 53 | ||
54 | void *bpf_map_area_alloc(size_t size) | ||
55 | { | ||
56 | /* We definitely need __GFP_NORETRY, so OOM killer doesn't | ||
57 | * trigger under memory pressure as we really just want to | ||
58 | * fail instead. | ||
59 | */ | ||
60 | const gfp_t flags = __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO; | ||
61 | void *area; | ||
62 | |||
63 | if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) { | ||
64 | area = kmalloc(size, GFP_USER | flags); | ||
65 | if (area != NULL) | ||
66 | return area; | ||
67 | } | ||
68 | |||
69 | return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | flags, | ||
70 | PAGE_KERNEL); | ||
71 | } | ||
72 | |||
73 | void bpf_map_area_free(void *area) | ||
74 | { | ||
75 | kvfree(area); | ||
76 | } | ||
77 | |||
52 | int bpf_map_precharge_memlock(u32 pages) | 78 | int bpf_map_precharge_memlock(u32 pages) |
53 | { | 79 | { |
54 | struct user_struct *user = get_current_user(); | 80 | struct user_struct *user = get_current_user(); |