diff options
Diffstat (limited to 'kernel/bpf/queue_stack_maps.c')
-rw-r--r-- | kernel/bpf/queue_stack_maps.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/kernel/bpf/queue_stack_maps.c b/kernel/bpf/queue_stack_maps.c index 0b140d236889..f697647ceb54 100644 --- a/kernel/bpf/queue_stack_maps.c +++ b/kernel/bpf/queue_stack_maps.c | |||
@@ -67,29 +67,28 @@ static int queue_stack_map_alloc_check(union bpf_attr *attr) | |||
67 | static struct bpf_map *queue_stack_map_alloc(union bpf_attr *attr) | 67 | static struct bpf_map *queue_stack_map_alloc(union bpf_attr *attr) |
68 | { | 68 | { |
69 | int ret, numa_node = bpf_map_attr_numa_node(attr); | 69 | int ret, numa_node = bpf_map_attr_numa_node(attr); |
70 | struct bpf_map_memory mem = {0}; | ||
70 | struct bpf_queue_stack *qs; | 71 | struct bpf_queue_stack *qs; |
71 | u64 size, queue_size, cost; | 72 | u64 size, queue_size, cost; |
72 | 73 | ||
73 | size = (u64) attr->max_entries + 1; | 74 | size = (u64) attr->max_entries + 1; |
74 | cost = queue_size = sizeof(*qs) + size * attr->value_size; | 75 | cost = queue_size = sizeof(*qs) + size * attr->value_size; |
75 | if (cost >= U32_MAX - PAGE_SIZE) | ||
76 | return ERR_PTR(-E2BIG); | ||
77 | 76 | ||
78 | cost = round_up(cost, PAGE_SIZE) >> PAGE_SHIFT; | 77 | ret = bpf_map_charge_init(&mem, cost); |
79 | |||
80 | ret = bpf_map_precharge_memlock(cost); | ||
81 | if (ret < 0) | 78 | if (ret < 0) |
82 | return ERR_PTR(ret); | 79 | return ERR_PTR(ret); |
83 | 80 | ||
84 | qs = bpf_map_area_alloc(queue_size, numa_node); | 81 | qs = bpf_map_area_alloc(queue_size, numa_node); |
85 | if (!qs) | 82 | if (!qs) { |
83 | bpf_map_charge_finish(&mem); | ||
86 | return ERR_PTR(-ENOMEM); | 84 | return ERR_PTR(-ENOMEM); |
85 | } | ||
87 | 86 | ||
88 | memset(qs, 0, sizeof(*qs)); | 87 | memset(qs, 0, sizeof(*qs)); |
89 | 88 | ||
90 | bpf_map_init_from_attr(&qs->map, attr); | 89 | bpf_map_init_from_attr(&qs->map, attr); |
91 | 90 | ||
92 | qs->map.pages = cost; | 91 | bpf_map_charge_move(&qs->map.memory, &mem); |
93 | qs->size = size; | 92 | qs->size = size; |
94 | 93 | ||
95 | raw_spin_lock_init(&qs->lock); | 94 | raw_spin_lock_init(&qs->lock); |