lkml.org 
[lkml]   [2018]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH bpf-next 1/3] bpf: pass struct btf pointer to the map_check_btf() callback
    Date
    If key_type or value_type are of non-trivial data types
    (e.g. structure or typedef), it's not possible to check them without
    the additional information, which can't be obtained without a pointer
    to the btf structure.

    So, let's pass btf pointer to the map_check_btf() callbacks.

    Signed-off-by: Roman Gushchin <guro@fb.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    ---
    include/linux/bpf.h | 3 +++
    kernel/bpf/arraymap.c | 1 +
    kernel/bpf/lpm_trie.c | 1 +
    kernel/bpf/syscall.c | 3 ++-
    4 files changed, 7 insertions(+), 1 deletion(-)

    diff --git a/include/linux/bpf.h b/include/linux/bpf.h
    index e82b7039fc66..128d93540b23 100644
    --- a/include/linux/bpf.h
    +++ b/include/linux/bpf.h
    @@ -23,6 +23,7 @@ struct bpf_prog;
    struct bpf_map;
    struct sock;
    struct seq_file;
    +struct btf;
    struct btf_type;

    /* map is generic key/value storage optionally accesible by eBPF programs */
    @@ -52,6 +53,7 @@ struct bpf_map_ops {
    void (*map_seq_show_elem)(struct bpf_map *map, void *key,
    struct seq_file *m);
    int (*map_check_btf)(const struct bpf_map *map,
    + const struct btf *btf,
    const struct btf_type *key_type,
    const struct btf_type *value_type);
    };
    @@ -126,6 +128,7 @@ static inline bool bpf_map_support_seq_show(const struct bpf_map *map)
    }

    int map_check_no_btf(const struct bpf_map *map,
    + const struct btf *btf,
    const struct btf_type *key_type,
    const struct btf_type *value_type);

    diff --git a/kernel/bpf/arraymap.c b/kernel/bpf/arraymap.c
    index 24583da9ffd1..25632a75d630 100644
    --- a/kernel/bpf/arraymap.c
    +++ b/kernel/bpf/arraymap.c
    @@ -382,6 +382,7 @@ static void percpu_array_map_seq_show_elem(struct bpf_map *map, void *key,
    }

    static int array_map_check_btf(const struct bpf_map *map,
    + const struct btf *btf,
    const struct btf_type *key_type,
    const struct btf_type *value_type)
    {
    diff --git a/kernel/bpf/lpm_trie.c b/kernel/bpf/lpm_trie.c
    index bfd4882e1106..abf1002080df 100644
    --- a/kernel/bpf/lpm_trie.c
    +++ b/kernel/bpf/lpm_trie.c
    @@ -728,6 +728,7 @@ static int trie_get_next_key(struct bpf_map *map, void *_key, void *_next_key)
    }

    static int trie_check_btf(const struct bpf_map *map,
    + const struct btf *btf,
    const struct btf_type *key_type,
    const struct btf_type *value_type)
    {
    diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
    index aa05aa38f4a8..7c2e8ab03a34 100644
    --- a/kernel/bpf/syscall.c
    +++ b/kernel/bpf/syscall.c
    @@ -456,6 +456,7 @@ static int bpf_obj_name_cpy(char *dst, const char *src)
    }

    int map_check_no_btf(const struct bpf_map *map,
    + const struct btf *btf,
    const struct btf_type *key_type,
    const struct btf_type *value_type)
    {
    @@ -478,7 +479,7 @@ static int map_check_btf(const struct bpf_map *map, const struct btf *btf,
    return -EINVAL;

    if (map->ops->map_check_btf)
    - ret = map->ops->map_check_btf(map, key_type, value_type);
    + ret = map->ops->map_check_btf(map, btf, key_type, value_type);

    return ret;
    }
    --
    2.19.2
    \
     
     \ /
      Last update: 2018-12-08 01:54    [W:2.661 / U:0.300 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site