Message ID | 20210831225005.2762202-3-joannekoong@fb.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | Implement bloom filter map | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for bpf-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | fail | 9 maintainers not CCed: andrii@kernel.org daniel@iogearbox.net kpsingh@kernel.org netdev@vger.kernel.org yhs@fb.com ast@kernel.org songliubraving@fb.com kafai@fb.com john.fastabend@gmail.com |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | warning | WARNING: line length of 86 exceeds 80 columns WARNING: line length of 89 exceeds 80 columns |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
bpf/vmtest-bpf-next | fail | VM_Test |
bpf/vmtest-bpf-next-PR | fail | PR summary |
On Tue, Aug 31, 2021 at 3:51 PM Joanne Koong <joannekoong@fb.com> wrote: > > This patch adds the libbpf infrastructure that will allow the user to > specify the number of hash functions to use for the bloom filter map. > > Signed-off-by: Joanne Koong <joannekoong@fb.com> > --- > tools/lib/bpf/bpf.c | 2 ++ > tools/lib/bpf/bpf.h | 1 + > tools/lib/bpf/libbpf.c | 32 +++++++++++++++++++++++++++++++- > tools/lib/bpf/libbpf.h | 3 +++ > tools/lib/bpf/libbpf.map | 2 ++ > tools/lib/bpf/libbpf_internal.h | 4 +++- > 6 files changed, 42 insertions(+), 2 deletions(-) > [...] > __u32 bpf_map__key_size(const struct bpf_map *map) > { > return map->def.key_size; > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index f177d897c5f7..497b84772be8 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -538,6 +538,9 @@ LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); > /* get/set map if_index */ > LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); > LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); > +/* get/set nr_hashes. used for bloom filter maps */ > +LIBBPF_API __u32 bpf_map__nr_hashes(const struct bpf_map *map); > +LIBBPF_API int bpf_map__set_nr_hashes(struct bpf_map *map, __u32 nr_hashes); > > typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *); > LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv, > diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map > index bbc53bb25f68..372c2478274f 100644 > --- a/tools/lib/bpf/libbpf.map > +++ b/tools/lib/bpf/libbpf.map > @@ -385,4 +385,6 @@ LIBBPF_0.5.0 { > btf__load_vmlinux_btf; > btf_dump__dump_type_data; > libbpf_set_strict_mode; > + bpf_map__nr_hashes; > + bpf_map__set_nr_hashes; I'd really like to avoid this very niche and specific set of APIs. As I mentioned on first patch, I think nr_hash can be easily passed through map_flags property. > } LIBBPF_0.4.0; > diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h > index 533b0211f40a..501ae042980d 100644 > --- a/tools/lib/bpf/libbpf_internal.h > +++ b/tools/lib/bpf/libbpf_internal.h > @@ -171,8 +171,9 @@ enum map_def_parts { > MAP_DEF_NUMA_NODE = 0x080, > MAP_DEF_PINNING = 0x100, > MAP_DEF_INNER_MAP = 0x200, > + MAP_DEF_NR_HASHES = 0x400, > > - MAP_DEF_ALL = 0x3ff, /* combination of all above */ > + MAP_DEF_ALL = 0x7ff, /* combination of all above */ > }; > > struct btf_map_def { > @@ -186,6 +187,7 @@ struct btf_map_def { > __u32 map_flags; > __u32 numa_node; > __u32 pinning; > + __u32 nr_hashes; /* used for bloom filter maps */ we can't extend btf_map_def, it's fixed indefinitely > }; > > int parse_btf_map_def(const char *map_name, struct btf *btf, > -- > 2.30.2 >
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 2401fad090c5..cc928c5b92a4 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -100,6 +100,8 @@ int bpf_create_map_xattr(const struct bpf_create_map_attr *create_attr) if (attr.map_type == BPF_MAP_TYPE_STRUCT_OPS) attr.btf_vmlinux_value_type_id = create_attr->btf_vmlinux_value_type_id; + else if (attr.map_type == BPF_MAP_TYPE_BLOOM_FILTER) + attr.nr_hashes = create_attr->nr_hashes; else attr.inner_map_fd = create_attr->inner_map_fd; diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index 6fffb3cdf39b..ea29d6647e20 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -49,6 +49,7 @@ struct bpf_create_map_attr { union { __u32 inner_map_fd; __u32 btf_vmlinux_value_type_id; + __u32 nr_hashes; /* used for bloom filter maps */ }; }; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 88d8825fc6f6..ac03404aeb57 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -377,6 +377,7 @@ struct bpf_map { char *pin_path; bool pinned; bool reused; + __u32 nr_hashes; /* used for bloom filter maps */ }; enum extern_type { @@ -1290,6 +1291,11 @@ static bool bpf_map_type__is_map_in_map(enum bpf_map_type type) return false; } +static bool bpf_map_type__is_bloom_filter(enum bpf_map_type type) +{ + return type == BPF_MAP_TYPE_BLOOM_FILTER; +} + int bpf_object__section_size(const struct bpf_object *obj, const char *name, __u32 *size) { @@ -2080,6 +2086,10 @@ int parse_btf_map_def(const char *map_name, struct btf *btf, if (!get_map_field_int(map_name, btf, m, &map_def->map_flags)) return -EINVAL; map_def->parts |= MAP_DEF_MAP_FLAGS; + } else if (strcmp(name, "nr_hashes") == 0) { + if (!get_map_field_int(map_name, btf, m, &map_def->nr_hashes)) + return -EINVAL; + map_def->parts |= MAP_DEF_NR_HASHES; } else if (strcmp(name, "numa_node") == 0) { if (!get_map_field_int(map_name, btf, m, &map_def->numa_node)) return -EINVAL; @@ -2264,6 +2274,7 @@ static void fill_map_from_def(struct bpf_map *map, const struct btf_map_def *def map->numa_node = def->numa_node; map->btf_key_type_id = def->key_type_id; map->btf_value_type_id = def->value_type_id; + map->nr_hashes = def->nr_hashes; if (def->parts & MAP_DEF_MAP_TYPE) pr_debug("map '%s': found type = %u.\n", map->name, def->map_type); @@ -2288,6 +2299,8 @@ static void fill_map_from_def(struct bpf_map *map, const struct btf_map_def *def pr_debug("map '%s': found pinning = %u.\n", map->name, def->pinning); if (def->parts & MAP_DEF_NUMA_NODE) pr_debug("map '%s': found numa_node = %u.\n", map->name, def->numa_node); + if (def->parts & MAP_DEF_NR_HASHES) + pr_debug("map '%s': found nr_hashes = %u.\n", map->name, def->nr_hashes); if (def->parts & MAP_DEF_INNER_MAP) pr_debug("map '%s': found inner map definition.\n", map->name); @@ -3979,6 +3992,7 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd) map->btf_key_type_id = info.btf_key_type_id; map->btf_value_type_id = info.btf_value_type_id; map->reused = true; + map->nr_hashes = info.nr_hashes; return 0; @@ -4473,7 +4487,8 @@ static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd) map_info.key_size == map->def.key_size && map_info.value_size == map->def.value_size && map_info.max_entries == map->def.max_entries && - map_info.map_flags == map->def.map_flags); + map_info.map_flags == map->def.map_flags && + map_info.nr_hashes == map->nr_hashes); } static int @@ -4611,6 +4626,8 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, b } if (map->inner_map_fd >= 0) create_attr.inner_map_fd = map->inner_map_fd; + } else if (bpf_map_type__is_bloom_filter(def->type)) { + create_attr.nr_hashes = map->nr_hashes; } if (obj->gen_loader) { @@ -8560,6 +8577,19 @@ int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node) return 0; } +__u32 bpf_map__nr_hashes(const struct bpf_map *map) +{ + return map->nr_hashes; +} + +int bpf_map__set_nr_hashes(struct bpf_map *map, __u32 nr_hashes) +{ + if (map->fd >= 0) + return libbpf_err(-EBUSY); + map->nr_hashes = nr_hashes; + return 0; +} + __u32 bpf_map__key_size(const struct bpf_map *map) { return map->def.key_size; diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index f177d897c5f7..497b84772be8 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -538,6 +538,9 @@ LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); /* get/set map if_index */ LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); +/* get/set nr_hashes. used for bloom filter maps */ +LIBBPF_API __u32 bpf_map__nr_hashes(const struct bpf_map *map); +LIBBPF_API int bpf_map__set_nr_hashes(struct bpf_map *map, __u32 nr_hashes); typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *); LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv, diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index bbc53bb25f68..372c2478274f 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -385,4 +385,6 @@ LIBBPF_0.5.0 { btf__load_vmlinux_btf; btf_dump__dump_type_data; libbpf_set_strict_mode; + bpf_map__nr_hashes; + bpf_map__set_nr_hashes; } LIBBPF_0.4.0; diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h index 533b0211f40a..501ae042980d 100644 --- a/tools/lib/bpf/libbpf_internal.h +++ b/tools/lib/bpf/libbpf_internal.h @@ -171,8 +171,9 @@ enum map_def_parts { MAP_DEF_NUMA_NODE = 0x080, MAP_DEF_PINNING = 0x100, MAP_DEF_INNER_MAP = 0x200, + MAP_DEF_NR_HASHES = 0x400, - MAP_DEF_ALL = 0x3ff, /* combination of all above */ + MAP_DEF_ALL = 0x7ff, /* combination of all above */ }; struct btf_map_def { @@ -186,6 +187,7 @@ struct btf_map_def { __u32 map_flags; __u32 numa_node; __u32 pinning; + __u32 nr_hashes; /* used for bloom filter maps */ }; int parse_btf_map_def(const char *map_name, struct btf *btf,
This patch adds the libbpf infrastructure that will allow the user to specify the number of hash functions to use for the bloom filter map. Signed-off-by: Joanne Koong <joannekoong@fb.com> --- tools/lib/bpf/bpf.c | 2 ++ tools/lib/bpf/bpf.h | 1 + tools/lib/bpf/libbpf.c | 32 +++++++++++++++++++++++++++++++- tools/lib/bpf/libbpf.h | 3 +++ tools/lib/bpf/libbpf.map | 2 ++ tools/lib/bpf/libbpf_internal.h | 4 +++- 6 files changed, 42 insertions(+), 2 deletions(-)