lkml.org 
[lkml]   [2020]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH bpf-next v7 33/34] bpf: eliminate rlimit-based memory accounting for bpf progs
    Date
    Do not use rlimit-based memory accounting for bpf progs. It has been
    replaced with memcg-based memory accounting.

    Signed-off-by: Roman Gushchin <guro@fb.com>
    Acked-by: Song Liu <songliubraving@fb.com>
    ---
    include/linux/bpf.h | 11 ------
    kernel/bpf/core.c | 12 ++-----
    kernel/bpf/syscall.c | 86 ++++++--------------------------------------
    3 files changed, 12 insertions(+), 97 deletions(-)

    diff --git a/include/linux/bpf.h b/include/linux/bpf.h
    index c9322adedd50..df5d5a8763db 100644
    --- a/include/linux/bpf.h
    +++ b/include/linux/bpf.h
    @@ -1201,8 +1201,6 @@ void bpf_prog_sub(struct bpf_prog *prog, int i);
    void bpf_prog_inc(struct bpf_prog *prog);
    struct bpf_prog * __must_check bpf_prog_inc_not_zero(struct bpf_prog *prog);
    void bpf_prog_put(struct bpf_prog *prog);
    -int __bpf_prog_charge(struct user_struct *user, u32 pages);
    -void __bpf_prog_uncharge(struct user_struct *user, u32 pages);
    void __bpf_free_used_maps(struct bpf_prog_aux *aux,
    struct bpf_map **used_maps, u32 len);

    @@ -1504,15 +1502,6 @@ bpf_prog_inc_not_zero(struct bpf_prog *prog)
    return ERR_PTR(-EOPNOTSUPP);
    }

    -static inline int __bpf_prog_charge(struct user_struct *user, u32 pages)
    -{
    - return 0;
    -}
    -
    -static inline void __bpf_prog_uncharge(struct user_struct *user, u32 pages)
    -{
    -}
    -
    static inline void bpf_link_init(struct bpf_link *link, enum bpf_link_type type,
    const struct bpf_link_ops *ops,
    struct bpf_prog *prog)
    diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
    index 2921f58c03a8..261f8692d0d2 100644
    --- a/kernel/bpf/core.c
    +++ b/kernel/bpf/core.c
    @@ -221,23 +221,15 @@ struct bpf_prog *bpf_prog_realloc(struct bpf_prog *fp_old, unsigned int size,
    {
    gfp_t gfp_flags = GFP_KERNEL_ACCOUNT | __GFP_ZERO | gfp_extra_flags;
    struct bpf_prog *fp;
    - u32 pages, delta;
    - int ret;
    + u32 pages;

    size = round_up(size, PAGE_SIZE);
    pages = size / PAGE_SIZE;
    if (pages <= fp_old->pages)
    return fp_old;

    - delta = pages - fp_old->pages;
    - ret = __bpf_prog_charge(fp_old->aux->user, delta);
    - if (ret)
    - return NULL;
    -
    fp = __vmalloc(size, gfp_flags);
    - if (fp == NULL) {
    - __bpf_prog_uncharge(fp_old->aux->user, delta);
    - } else {
    + if (fp) {
    memcpy(fp, fp_old, fp_old->pages * PAGE_SIZE);
    fp->pages = pages;
    fp->aux->prog = fp;
    diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
    index f065121d6ffa..2f0597978389 100644
    --- a/kernel/bpf/syscall.c
    +++ b/kernel/bpf/syscall.c
    @@ -343,23 +343,6 @@ void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr)
    map->numa_node = bpf_map_attr_numa_node(attr);
    }

    -static int bpf_charge_memlock(struct user_struct *user, u32 pages)
    -{
    - unsigned long memlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
    -
    - if (atomic_long_add_return(pages, &user->locked_vm) > memlock_limit) {
    - atomic_long_sub(pages, &user->locked_vm);
    - return -EPERM;
    - }
    - return 0;
    -}
    -
    -static void bpf_uncharge_memlock(struct user_struct *user, u32 pages)
    -{
    - if (user)
    - atomic_long_sub(pages, &user->locked_vm);
    -}
    -
    static int bpf_map_alloc_id(struct bpf_map *map)
    {
    int id;
    @@ -1645,51 +1628,6 @@ static void bpf_audit_prog(const struct bpf_prog *prog, unsigned int op)
    audit_log_end(ab);
    }

    -int __bpf_prog_charge(struct user_struct *user, u32 pages)
    -{
    - unsigned long memlock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
    - unsigned long user_bufs;
    -
    - if (user) {
    - user_bufs = atomic_long_add_return(pages, &user->locked_vm);
    - if (user_bufs > memlock_limit) {
    - atomic_long_sub(pages, &user->locked_vm);
    - return -EPERM;
    - }
    - }
    -
    - return 0;
    -}
    -
    -void __bpf_prog_uncharge(struct user_struct *user, u32 pages)
    -{
    - if (user)
    - atomic_long_sub(pages, &user->locked_vm);
    -}
    -
    -static int bpf_prog_charge_memlock(struct bpf_prog *prog)
    -{
    - struct user_struct *user = get_current_user();
    - int ret;
    -
    - ret = __bpf_prog_charge(user, prog->pages);
    - if (ret) {
    - free_uid(user);
    - return ret;
    - }
    -
    - prog->aux->user = user;
    - return 0;
    -}
    -
    -static void bpf_prog_uncharge_memlock(struct bpf_prog *prog)
    -{
    - struct user_struct *user = prog->aux->user;
    -
    - __bpf_prog_uncharge(user, prog->pages);
    - free_uid(user);
    -}
    -
    static int bpf_prog_alloc_id(struct bpf_prog *prog)
    {
    int id;
    @@ -1739,7 +1677,7 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)

    kvfree(aux->func_info);
    kfree(aux->func_info_aux);
    - bpf_prog_uncharge_memlock(aux->prog);
    + free_uid(aux->user);
    security_bpf_prog_free(aux);
    bpf_prog_free(aux->prog);
    }
    @@ -2177,7 +2115,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
    dst_prog = bpf_prog_get(attr->attach_prog_fd);
    if (IS_ERR(dst_prog)) {
    err = PTR_ERR(dst_prog);
    - goto free_prog_nouncharge;
    + goto free_prog;
    }
    prog->aux->dst_prog = dst_prog;
    }
    @@ -2187,18 +2125,15 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)

    err = security_bpf_prog_alloc(prog->aux);
    if (err)
    - goto free_prog_nouncharge;
    -
    - err = bpf_prog_charge_memlock(prog);
    - if (err)
    - goto free_prog_sec;
    + goto free_prog;

    + prog->aux->user = get_current_user();
    prog->len = attr->insn_cnt;

    err = -EFAULT;
    if (copy_from_user(prog->insns, u64_to_user_ptr(attr->insns),
    bpf_prog_insn_size(prog)) != 0)
    - goto free_prog;
    + goto free_prog_sec;

    prog->orig_prog = NULL;
    prog->jited = 0;
    @@ -2209,19 +2144,19 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
    if (bpf_prog_is_dev_bound(prog->aux)) {
    err = bpf_prog_offload_init(prog, attr);
    if (err)
    - goto free_prog;
    + goto free_prog_sec;
    }

    /* find program type: socket_filter vs tracing_filter */
    err = find_prog_type(type, prog);
    if (err < 0)
    - goto free_prog;
    + goto free_prog_sec;

    prog->aux->load_time = ktime_get_boottime_ns();
    err = bpf_obj_name_cpy(prog->aux->name, attr->prog_name,
    sizeof(attr->prog_name));
    if (err < 0)
    - goto free_prog;
    + goto free_prog_sec;

    /* run eBPF verifier */
    err = bpf_check(&prog, attr, uattr);
    @@ -2266,11 +2201,10 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr)
    */
    __bpf_prog_put_noref(prog, prog->aux->func_cnt);
    return err;
    -free_prog:
    - bpf_prog_uncharge_memlock(prog);
    free_prog_sec:
    + free_uid(prog->aux->user);
    security_bpf_prog_free(prog->aux);
    -free_prog_nouncharge:
    +free_prog:
    bpf_prog_free(prog);
    return err;
    }
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-11-19 19:09    [W:2.943 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site