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