diff options
Diffstat (limited to 'kernel/bpf/devmap.c')
-rw-r--r-- | kernel/bpf/devmap.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index 1e525d70f833..5ae7cce5ef16 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c | |||
@@ -108,13 +108,9 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr) | |||
108 | /* make sure page count doesn't overflow */ | 108 | /* make sure page count doesn't overflow */ |
109 | cost = (u64) dtab->map.max_entries * sizeof(struct bpf_dtab_netdev *); | 109 | cost = (u64) dtab->map.max_entries * sizeof(struct bpf_dtab_netdev *); |
110 | cost += dev_map_bitmap_size(attr) * num_possible_cpus(); | 110 | cost += dev_map_bitmap_size(attr) * num_possible_cpus(); |
111 | if (cost >= U32_MAX - PAGE_SIZE) | ||
112 | goto free_dtab; | ||
113 | |||
114 | dtab->map.pages = round_up(cost, PAGE_SIZE) >> PAGE_SHIFT; | ||
115 | 111 | ||
116 | /* if map size is larger than memlock limit, reject it early */ | 112 | /* if map size is larger than memlock limit, reject it */ |
117 | err = bpf_map_precharge_memlock(dtab->map.pages); | 113 | err = bpf_map_charge_init(&dtab->map.memory, cost); |
118 | if (err) | 114 | if (err) |
119 | goto free_dtab; | 115 | goto free_dtab; |
120 | 116 | ||
@@ -125,19 +121,21 @@ static struct bpf_map *dev_map_alloc(union bpf_attr *attr) | |||
125 | __alignof__(unsigned long), | 121 | __alignof__(unsigned long), |
126 | GFP_KERNEL | __GFP_NOWARN); | 122 | GFP_KERNEL | __GFP_NOWARN); |
127 | if (!dtab->flush_needed) | 123 | if (!dtab->flush_needed) |
128 | goto free_dtab; | 124 | goto free_charge; |
129 | 125 | ||
130 | dtab->netdev_map = bpf_map_area_alloc(dtab->map.max_entries * | 126 | dtab->netdev_map = bpf_map_area_alloc(dtab->map.max_entries * |
131 | sizeof(struct bpf_dtab_netdev *), | 127 | sizeof(struct bpf_dtab_netdev *), |
132 | dtab->map.numa_node); | 128 | dtab->map.numa_node); |
133 | if (!dtab->netdev_map) | 129 | if (!dtab->netdev_map) |
134 | goto free_dtab; | 130 | goto free_charge; |
135 | 131 | ||
136 | spin_lock(&dev_map_lock); | 132 | spin_lock(&dev_map_lock); |
137 | list_add_tail_rcu(&dtab->list, &dev_map_list); | 133 | list_add_tail_rcu(&dtab->list, &dev_map_list); |
138 | spin_unlock(&dev_map_lock); | 134 | spin_unlock(&dev_map_lock); |
139 | 135 | ||
140 | return &dtab->map; | 136 | return &dtab->map; |
137 | free_charge: | ||
138 | bpf_map_charge_finish(&dtab->map.memory); | ||
141 | free_dtab: | 139 | free_dtab: |
142 | free_percpu(dtab->flush_needed); | 140 | free_percpu(dtab->flush_needed); |
143 | kfree(dtab); | 141 | kfree(dtab); |