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