diff options
Diffstat (limited to 'kernel/bpf/cpumap.c')
-rw-r--r-- | kernel/bpf/cpumap.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c index cf727d77c6c6..b31a71909307 100644 --- a/kernel/bpf/cpumap.c +++ b/kernel/bpf/cpumap.c | |||
@@ -106,12 +106,9 @@ static struct bpf_map *cpu_map_alloc(union bpf_attr *attr) | |||
106 | /* make sure page count doesn't overflow */ | 106 | /* make sure page count doesn't overflow */ |
107 | cost = (u64) cmap->map.max_entries * sizeof(struct bpf_cpu_map_entry *); | 107 | cost = (u64) cmap->map.max_entries * sizeof(struct bpf_cpu_map_entry *); |
108 | cost += cpu_map_bitmap_size(attr) * num_possible_cpus(); | 108 | cost += cpu_map_bitmap_size(attr) * num_possible_cpus(); |
109 | if (cost >= U32_MAX - PAGE_SIZE) | ||
110 | goto free_cmap; | ||
111 | cmap->map.pages = round_up(cost, PAGE_SIZE) >> PAGE_SHIFT; | ||
112 | 109 | ||
113 | /* Notice returns -EPERM on if map size is larger than memlock limit */ | 110 | /* Notice returns -EPERM on if map size is larger than memlock limit */ |
114 | ret = bpf_map_precharge_memlock(cmap->map.pages); | 111 | ret = bpf_map_charge_init(&cmap->map.memory, cost); |
115 | if (ret) { | 112 | if (ret) { |
116 | err = ret; | 113 | err = ret; |
117 | goto free_cmap; | 114 | goto free_cmap; |
@@ -121,7 +118,7 @@ static struct bpf_map *cpu_map_alloc(union bpf_attr *attr) | |||
121 | cmap->flush_needed = __alloc_percpu(cpu_map_bitmap_size(attr), | 118 | cmap->flush_needed = __alloc_percpu(cpu_map_bitmap_size(attr), |
122 | __alignof__(unsigned long)); | 119 | __alignof__(unsigned long)); |
123 | if (!cmap->flush_needed) | 120 | if (!cmap->flush_needed) |
124 | goto free_cmap; | 121 | goto free_charge; |
125 | 122 | ||
126 | /* Alloc array for possible remote "destination" CPUs */ | 123 | /* Alloc array for possible remote "destination" CPUs */ |
127 | cmap->cpu_map = bpf_map_area_alloc(cmap->map.max_entries * | 124 | cmap->cpu_map = bpf_map_area_alloc(cmap->map.max_entries * |
@@ -133,6 +130,8 @@ static struct bpf_map *cpu_map_alloc(union bpf_attr *attr) | |||
133 | return &cmap->map; | 130 | return &cmap->map; |
134 | free_percpu: | 131 | free_percpu: |
135 | free_percpu(cmap->flush_needed); | 132 | free_percpu(cmap->flush_needed); |
133 | free_charge: | ||
134 | bpf_map_charge_finish(&cmap->map.memory); | ||
136 | free_cmap: | 135 | free_cmap: |
137 | kfree(cmap); | 136 | kfree(cmap); |
138 | return ERR_PTR(err); | 137 | return ERR_PTR(err); |