On Wed, May 29, 2019 at 6:05 PM Roman Gushchin <guro@xxxxxx> wrote: > > Cgroup local storage maps lack the memlock precharge check, > which is performed before the memory allocation for > most other bpf map types. > > Let's add it in order to unify all map types. > > Signed-off-by: Roman Gushchin <guro@xxxxxx> Acked-by: Song Liu <songliubraving@xxxxxx> > --- > kernel/bpf/local_storage.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/kernel/bpf/local_storage.c b/kernel/bpf/local_storage.c > index 980e8f1f6cb5..e48302ecb389 100644 > --- a/kernel/bpf/local_storage.c > +++ b/kernel/bpf/local_storage.c > @@ -272,6 +272,8 @@ static struct bpf_map *cgroup_storage_map_alloc(union bpf_attr *attr) > { > int numa_node = bpf_map_attr_numa_node(attr); > struct bpf_cgroup_storage_map *map; > + u32 pages; > + int ret; > > if (attr->key_size != sizeof(struct bpf_cgroup_storage_key)) > return ERR_PTR(-EINVAL); > @@ -290,13 +292,18 @@ static struct bpf_map *cgroup_storage_map_alloc(union bpf_attr *attr) > /* max_entries is not used and enforced to be 0 */ > return ERR_PTR(-EINVAL); > > + pages = round_up(sizeof(struct bpf_cgroup_storage_map), PAGE_SIZE) >> > + PAGE_SHIFT; > + ret = bpf_map_precharge_memlock(pages); > + if (ret < 0) > + return ERR_PTR(ret); > + > map = kmalloc_node(sizeof(struct bpf_cgroup_storage_map), > __GFP_ZERO | GFP_USER, numa_node); > if (!map) > return ERR_PTR(-ENOMEM); > > - map->map.pages = round_up(sizeof(struct bpf_cgroup_storage_map), > - PAGE_SIZE) >> PAGE_SHIFT; > + map->map.pages = pages; > > /* copy mandatory map attributes */ > bpf_map_init_from_attr(&map->map, attr); > -- > 2.20.1 >