lkml.org 
[lkml]   [2018]   [Jul]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 bpf-next 03/14] bpf: pass a pointer to a cgroup storage using pcpu variable
    Date
    This commit introduces the bpf_cgroup_storage_set() helper,
    which will be used to pass a pointer to a cgroup storage
    to the bpf helper.

    Signed-off-by: Roman Gushchin <guro@fb.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Martin KaFai Lau <kafai@fb.com>
    ---
    include/linux/bpf-cgroup.h | 15 +++++++++++++++
    kernel/bpf/local_storage.c | 2 ++
    2 files changed, 17 insertions(+)

    diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h
    index 6b0e7bd4b154..ce77a6dffb6d 100644
    --- a/include/linux/bpf-cgroup.h
    +++ b/include/linux/bpf-cgroup.h
    @@ -3,6 +3,7 @@
    #define _BPF_CGROUP_H

    #include <linux/jump_label.h>
    +#include <linux/percpu-defs.h>
    #include <linux/rbtree.h>
    #include <uapi/linux/bpf.h>

    @@ -20,6 +21,8 @@ struct bpf_cgroup_storage;
    extern struct static_key_false cgroup_bpf_enabled_key;
    #define cgroup_bpf_enabled static_branch_unlikely(&cgroup_bpf_enabled_key)

    +DECLARE_PER_CPU(void*, bpf_cgroup_storage);
    +
    struct bpf_cgroup_storage_map;

    struct bpf_storage_buffer {
    @@ -96,6 +99,17 @@ int __cgroup_bpf_run_filter_sock_ops(struct sock *sk,
    int __cgroup_bpf_check_dev_permission(short dev_type, u32 major, u32 minor,
    short access, enum bpf_attach_type type);

    +static inline void bpf_cgroup_storage_set(struct bpf_cgroup_storage *storage)
    +{
    + struct bpf_storage_buffer *buf;
    +
    + if (!storage)
    + return;
    +
    + buf = rcu_dereference(storage->buf);
    + this_cpu_write(bpf_cgroup_storage, &buf->data[0]);
    +}
    +
    struct bpf_cgroup_storage *bpf_cgroup_storage_alloc(struct bpf_prog *prog);
    void bpf_cgroup_storage_free(struct bpf_cgroup_storage *storage);
    void bpf_cgroup_storage_link(struct bpf_cgroup_storage *storage,
    @@ -249,6 +263,7 @@ static inline int cgroup_bpf_prog_query(const union bpf_attr *attr,
    return -EINVAL;
    }

    +static inline void bpf_cgroup_storage_set(struct bpf_cgroup_storage *storage) {}
    static inline int bpf_cgroup_storage_assign(struct bpf_prog *prog,
    struct bpf_map *map) { return 0; }
    static inline void bpf_cgroup_storage_release(struct bpf_prog *prog,
    diff --git a/kernel/bpf/local_storage.c b/kernel/bpf/local_storage.c
    index 940889eda2c7..38810a712971 100644
    --- a/kernel/bpf/local_storage.c
    +++ b/kernel/bpf/local_storage.c
    @@ -7,6 +7,8 @@
    #include <linux/rbtree.h>
    #include <linux/slab.h>

    +DEFINE_PER_CPU(void*, bpf_cgroup_storage);
    +
    #ifdef CONFIG_CGROUP_BPF

    struct bpf_cgroup_storage_map {
    --
    2.14.4
    \
     
     \ /
      Last update: 2018-07-05 22:57    [W:4.050 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site