aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/devmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/devmap.c')
-rw-r--r--kernel/bpf/devmap.c14
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;
137free_charge:
138 bpf_map_charge_finish(&dtab->map.memory);
141free_dtab: 139free_dtab:
142 free_percpu(dtab->flush_needed); 140 free_percpu(dtab->flush_needed);
143 kfree(dtab); 141 kfree(dtab);