diff mbox series

[bpf-next,8/9] libbpf: introduce bpf_map_lookup_elem_flags()

Message ID 20190116050830.1881316-9-ast@kernel.org
State Changes Requested
Delegated to: BPF Maintainers
Headers show
Series introduce bpf_spin_lock | expand

Commit Message

Alexei Starovoitov Jan. 16, 2019, 5:08 a.m. UTC
Introduce
int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags)
helper to lookup array/hash/cgroup_local_storage elements with BPF_F_LOCK flag.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 tools/lib/bpf/bpf.c      |  13 ++
 tools/lib/bpf/bpf.h      |   2 +
 tools/lib/bpf/libbpf.map |   4 +
 tools/lib/bpf/tags       | 254 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 273 insertions(+)
 create mode 100644 tools/lib/bpf/tags

Comments

Yonghong Song Jan. 16, 2019, 6:18 a.m. UTC | #1
On 1/15/19 9:08 PM, Alexei Starovoitov wrote:
> Introduce
> int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags)
> helper to lookup array/hash/cgroup_local_storage elements with BPF_F_LOCK flag.
> 
> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
> ---
>   tools/lib/bpf/bpf.c      |  13 ++
>   tools/lib/bpf/bpf.h      |   2 +
>   tools/lib/bpf/libbpf.map |   4 +
>   tools/lib/bpf/tags       | 254 +++++++++++++++++++++++++++++++++++++++

I think this tools/lib/bpf/tags is not needed and accidentally slipped 
in due to cscope?

>   4 files changed, 273 insertions(+)
>   create mode 100644 tools/lib/bpf/tags
> 
> diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
> index 3caaa3428774..d55a77a05d5f 100644
> --- a/tools/lib/bpf/bpf.c
> +++ b/tools/lib/bpf/bpf.c
> @@ -357,6 +357,19 @@ int bpf_map_lookup_elem(int fd, const void *key, void *value)
>   	return sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
>   }
>   
> +int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags)
> +{
> +	union bpf_attr attr;
> +
> +	bzero(&attr, sizeof(attr));
> +	attr.map_fd = fd;
> +	attr.key = ptr_to_u64(key);
> +	attr.value = ptr_to_u64(value);
> +	attr.flags = flags;
> +
> +	return sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
> +}
> +
>   int bpf_map_lookup_and_delete_elem(int fd, const void *key, void *value)
>   {
>   	union bpf_attr attr;
> diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
> index 8f09de482839..ed09eed2dc3b 100644
> --- a/tools/lib/bpf/bpf.h
> +++ b/tools/lib/bpf/bpf.h
> @@ -110,6 +110,8 @@ LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value,
>   				   __u64 flags);
>   
>   LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value);
> +LIBBPF_API int bpf_map_lookup_elem_flags(int fd, const void *key, void *value,
> +					 __u64 flags);
>   LIBBPF_API int bpf_map_lookup_and_delete_elem(int fd, const void *key,
>   					      void *value);
>   LIBBPF_API int bpf_map_delete_elem(int fd, const void *key);
> diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
> index cd02cd4e2cc3..ca5155409a15 100644
> --- a/tools/lib/bpf/libbpf.map
> +++ b/tools/lib/bpf/libbpf.map
> @@ -124,3 +124,7 @@ LIBBPF_0.0.1 {
>   	local:
>   		*;
>   };
> +LIBBPF_0.0.2 {
> +	global:
> +		bpf_map_lookup_elem_flags;
> +} LIBBPF_0.0.1;
> diff --git a/tools/lib/bpf/tags b/tools/lib/bpf/tags
> new file mode 100644
> index 000000000000..be30548a028e
> --- /dev/null
> +++ b/tools/lib/bpf/tags
> @@ -0,0 +1,254 @@
> +!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
> +!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
> +!_TAG_PROGRAM_AUTHOR	Darren Hiebert	/dhiebert@users.sourceforge.net/
> +!_TAG_PROGRAM_NAME	Exuberant Ctags	//
> +!_TAG_PROGRAM_URL	http://ctags.sourceforge.net	/official site/
> +!_TAG_PROGRAM_VERSION	5.8	//
> +BPF_EXTRAVERSION	Makefile	/^BPF_EXTRAVERSION = 1$/;"	m
> +BPF_FS_MAGIC	libbpf.c	52;"	d	file:
> +BPF_IN	Makefile	/^BPF_IN    := $(OUTPUT)libbpf-in.o$/;"	m
> +BPF_LOG_BUF_SIZE	bpf.h	43;"	d
> +BPF_PATCHLEVEL	Makefile	/^BPF_PATCHLEVEL = 0$/;"	m
> +BPF_PROG_TYPE_FNS	libbpf.c	1702;"	d	file:
> +BPF_VERSION	Makefile	/^BPF_VERSION = 0$/;"	m
> +CFLAGS	Makefile	/^  CFLAGS := $(EXTRA_CFLAGS)$/;"	m
> +CFLAGS	Makefile	/^  CFLAGS := -g -Wall$/;"	m
> +CHECK_ERR	libbpf.c	140;"	d	file:
> +CMD_TARGETS	Makefile	/^CMD_TARGETS = $(LIB_FILE)$/;"	m
> +DESTDIR	Makefile	/^DESTDIR ?=$/;"	m
> +DESTDIR_SQ	Makefile	/^DESTDIR_SQ = '$(subst ','\\'',$(DESTDIR))'$/;"	m
> +EM_BPF	libbpf.c	48;"	d	file:
> +ERRCODE_OFFSET	libbpf.c	95;"	d	file:
> +ERRNO_OFFSET	libbpf.c	94;"	d	file:
> +EXTRAVERSION	Makefile	/^EXTRAVERSION	= $(BPF_EXTRAVERSION)$/;"	m
> +FEATURE_CHECK_CFLAGS-bpf	Makefile	/^FEATURE_CHECK_CFLAGS-bpf = $(INCLUDES)$/;"	m
> +FEATURE_DISPLAY	Makefile	/^FEATURE_DISPLAY = libelf bpf$/;"	m
> +FEATURE_TESTS	Makefile	/^FEATURE_TESTS = libelf libelf-getphdrnum libelf-mmap bpf$/;"	m
> +FEATURE_USER	Makefile	/^FEATURE_USER = .libbpf$/;"	m
> +INCLUDES	Makefile	/^INCLUDES = -I. -I$(srctree)\/tools\/include -I$(srctree)\/tools\/arch\/$(ARCH)\/include\/uapi -I$(srctree)\/tools\/include\/uapi$/;"	m
> +INSTALL	Makefile	/^INSTALL = install$/;"	m
> +LIBBPF_ELF_C_READ_MMAP	libbpf.c	162;"	d	file:
> +LIBBPF_ELF_C_READ_MMAP	libbpf.c	164;"	d	file:
> +LIBBPF_ERRNO__ENDIAN	libbpf.h	/^	LIBBPF_ERRNO__ENDIAN,	\/* Endian mismatch *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__FORMAT	libbpf.h	/^	LIBBPF_ERRNO__FORMAT,	\/* BPF object format invalid *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__INTERNAL	libbpf.h	/^	LIBBPF_ERRNO__INTERNAL,	\/* Internal error in libbpf *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__KVER	libbpf.h	/^	LIBBPF_ERRNO__KVER,	\/* Incorrect kernel version *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__KVERSION	libbpf.h	/^	LIBBPF_ERRNO__KVERSION,	\/* Incorrect or no 'version' section *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__LIBELF	libbpf.h	/^	LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START,$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__LOAD	libbpf.h	/^	LIBBPF_ERRNO__LOAD,	\/* Load program failure for unknown reason *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__PROG2BIG	libbpf.h	/^	LIBBPF_ERRNO__PROG2BIG,	\/* Program too big *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__PROGTYPE	libbpf.h	/^	LIBBPF_ERRNO__PROGTYPE,	\/* Kernel doesn't support this program type *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__RELOC	libbpf.h	/^	LIBBPF_ERRNO__RELOC,	\/* Relocation failed *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_ERRNO__VERIFY	libbpf.h	/^	LIBBPF_ERRNO__VERIFY,	\/* Kernel verifier blocks program loading *\/$/;"	e	enum:libbpf_errno
> +LIBBPF_VERSION	Makefile	/^LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION)$/;"	m
> +LIB_FILE	Makefile	/^LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))$/;"	m
> +LIB_FILE	Makefile	/^LIB_FILE = libbpf.a libbpf.so$/;"	m
> +MAKEOVERRIDES	Makefile	/^MAKEOVERRIDES=$/;"	m
> +N	Makefile	/^N		=$/;"	m
> +NON_CHECK_FEAT_TARGETS	Makefile	/^NON_CHECK_FEAT_TARGETS := clean TAGS tags cscope help$/;"	m
> +NR_ERRNO	libbpf.c	96;"	d	file:
> +OBJ	Makefile	/^OBJ		= $@$/;"	m
> +PATCHLEVEL	Makefile	/^PATCHLEVEL	= $(BPF_PATCHLEVEL)$/;"	m
> +Q	Makefile	/^  Q = @$/;"	m
> +Q	Makefile	/^  Q =$/;"	m
> +STRERR_BUFSIZE	libbpf.c	92;"	d	file:
> +TARGETS	Makefile	/^TARGETS = $(CMD_TARGETS)$/;"	m
> +VERBOSE	Makefile	/^  VERBOSE = $(V)$/;"	m
> +VERBOSE	Makefile	/^  VERBOSE = 0$/;"	m
> +VERSION	Makefile	/^VERSION		= $(BPF_VERSION)$/;"	m
> +__BPF_BPF_H	bpf.h	22;"	d
> +__BPF_LIBBPF_H	libbpf.h	22;"	d
> +__LIBBPF_ERRNO__END	libbpf.h	/^	__LIBBPF_ERRNO__END,$/;"	e	enum:libbpf_errno
> +__LIBBPF_ERRNO__START	libbpf.h	/^	__LIBBPF_ERRNO__START = 4000,$/;"	e	enum:libbpf_errno
> +__NR_bpf	bpf.c	35;"	d	file:
> +__NR_bpf	bpf.c	37;"	d	file:
> +__NR_bpf	bpf.c	39;"	d	file:
> +__NR_bpf	bpf.c	41;"	d	file:
> +__NR_bpf	bpf.c	43;"	d	file:
> +__base_pr	libbpf.c	/^static int __base_pr(const char *format, ...)$/;"	f	file:
> +__bpf_object__open	libbpf.c	/^__bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz)$/;"	f	file:
> +__pr	libbpf.c	73;"	d	file:
> +__pr_debug	libbpf.c	/^static __printf(1, 2) libbpf_print_fn_t __pr_debug;$/;"	v
> +__pr_info	libbpf.c	/^static __printf(1, 2) libbpf_print_fn_t __pr_info = __base_pr;$/;"	v
> +__pr_warning	libbpf.c	/^static __printf(1, 2) libbpf_print_fn_t __pr_warning = __base_pr;$/;"	v
> +__printf	libbpf.c	55;"	d	file:
> +allow-override	Makefile	/^define allow-override$/;"	m
> +bpf_create_map	bpf.c	/^int bpf_create_map(enum bpf_map_type map_type, int key_size,$/;"	f
> +bpf_create_map_in_map	bpf.c	/^int bpf_create_map_in_map(enum bpf_map_type map_type, const char *name,$/;"	f
> +bpf_create_map_in_map_node	bpf.c	/^int bpf_create_map_in_map_node(enum bpf_map_type map_type, const char *name,$/;"	f
> +bpf_create_map_name	bpf.c	/^int bpf_create_map_name(enum bpf_map_type map_type, const char *name,$/;"	f
> +bpf_create_map_node	bpf.c	/^int bpf_create_map_node(enum bpf_map_type map_type, const char *name,$/;"	f
> +bpf_load_program	bpf.c	/^int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,$/;"	f
> +bpf_load_program_name	bpf.c	/^int bpf_load_program_name(enum bpf_prog_type type, const char *name,$/;"	f
> +bpf_map	libbpf.c	/^struct bpf_map {$/;"	s	file:
> +bpf_map__def	libbpf.c	/^const struct bpf_map_def *bpf_map__def(struct bpf_map *map)$/;"	f
> +bpf_map__fd	libbpf.c	/^int bpf_map__fd(struct bpf_map *map)$/;"	f
> +bpf_map__for_each	libbpf.h	230;"	d
> +bpf_map__name	libbpf.c	/^const char *bpf_map__name(struct bpf_map *map)$/;"	f
> +bpf_map__next	libbpf.c	/^bpf_map__next(struct bpf_map *prev, struct bpf_object *obj)$/;"	f
> +bpf_map__pin	libbpf.c	/^int bpf_map__pin(struct bpf_map *map, const char *path)$/;"	f
> +bpf_map__priv	libbpf.c	/^void *bpf_map__priv(struct bpf_map *map)$/;"	f
> +bpf_map__set_priv	libbpf.c	/^int bpf_map__set_priv(struct bpf_map *map, void *priv,$/;"	f
> +bpf_map_clear_priv_t	libbpf.h	/^typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *);$/;"	t
> +bpf_map_def	libbpf.h	/^struct bpf_map_def {$/;"	s
> +bpf_map_delete_elem	bpf.c	/^int bpf_map_delete_elem(int fd, const void *key)$/;"	f
> +bpf_map_get_fd_by_id	bpf.c	/^int bpf_map_get_fd_by_id(__u32 id)$/;"	f
> +bpf_map_get_next_id	bpf.c	/^int bpf_map_get_next_id(__u32 start_id, __u32 *next_id)$/;"	f
> +bpf_map_get_next_key	bpf.c	/^int bpf_map_get_next_key(int fd, const void *key, void *next_key)$/;"	f
> +bpf_map_lookup_elem	bpf.c	/^int bpf_map_lookup_elem(int fd, const void *key, void *value)$/;"	f
> +bpf_map_update_elem	bpf.c	/^int bpf_map_update_elem(int fd, const void *key, const void *value,$/;"	f
> +bpf_obj_get	bpf.c	/^int bpf_obj_get(const char *pathname)$/;"	f
> +bpf_obj_get_info_by_fd	bpf.c	/^int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len)$/;"	f
> +bpf_obj_pin	bpf.c	/^int bpf_obj_pin(int fd, const char *pathname)$/;"	f
> +bpf_object	libbpf.c	/^struct bpf_object {$/;"	s	file:
> +bpf_object__add_program	libbpf.c	/^bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,$/;"	f	file:
> +bpf_object__check_endianness	libbpf.c	/^bpf_object__check_endianness(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__close	libbpf.c	/^void bpf_object__close(struct bpf_object *obj)$/;"	f
> +bpf_object__collect_reloc	libbpf.c	/^static int bpf_object__collect_reloc(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__create_maps	libbpf.c	/^bpf_object__create_maps(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__elf_collect	libbpf.c	/^static int bpf_object__elf_collect(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__elf_finish	libbpf.c	/^static void bpf_object__elf_finish(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__elf_init	libbpf.c	/^static int bpf_object__elf_init(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__find_map_by_name	libbpf.c	/^bpf_object__find_map_by_name(struct bpf_object *obj, const char *name)$/;"	f
> +bpf_object__find_map_by_offset	libbpf.c	/^bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset)$/;"	f
> +bpf_object__find_prog_by_idx	libbpf.c	/^bpf_object__find_prog_by_idx(struct bpf_object *obj, int idx)$/;"	f	file:
> +bpf_object__for_each_program	libbpf.h	95;"	d
> +bpf_object__for_each_safe	libbpf.h	79;"	d
> +bpf_object__init_kversion	libbpf.c	/^bpf_object__init_kversion(struct bpf_object *obj,$/;"	f	file:
> +bpf_object__init_license	libbpf.c	/^bpf_object__init_license(struct bpf_object *obj,$/;"	f	file:
> +bpf_object__init_maps	libbpf.c	/^bpf_object__init_maps(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__init_prog_names	libbpf.c	/^bpf_object__init_prog_names(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__kversion	libbpf.c	/^unsigned int bpf_object__kversion(struct bpf_object *obj)$/;"	f
> +bpf_object__load	libbpf.c	/^int bpf_object__load(struct bpf_object *obj)$/;"	f
> +bpf_object__load_progs	libbpf.c	/^bpf_object__load_progs(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__name	libbpf.c	/^const char *bpf_object__name(struct bpf_object *obj)$/;"	f
> +bpf_object__new	libbpf.c	/^static struct bpf_object *bpf_object__new(const char *path,$/;"	f	file:
> +bpf_object__next	libbpf.c	/^bpf_object__next(struct bpf_object *prev)$/;"	f
> +bpf_object__open	libbpf.c	/^struct bpf_object *bpf_object__open(const char *path)$/;"	f
> +bpf_object__open_buffer	libbpf.c	/^struct bpf_object *bpf_object__open_buffer(void *obj_buf,$/;"	f
> +bpf_object__pin	libbpf.c	/^int bpf_object__pin(struct bpf_object *obj, const char *path)$/;"	f
> +bpf_object__priv	libbpf.c	/^void *bpf_object__priv(struct bpf_object *obj)$/;"	f
> +bpf_object__relocate	libbpf.c	/^bpf_object__relocate(struct bpf_object *obj)$/;"	f	file:
> +bpf_object__set_priv	libbpf.c	/^int bpf_object__set_priv(struct bpf_object *obj, void *priv,$/;"	f
> +bpf_object__unload	libbpf.c	/^int bpf_object__unload(struct bpf_object *obj)$/;"	f
> +bpf_object__validate	libbpf.c	/^static int bpf_object__validate(struct bpf_object *obj)$/;"	f	file:
> +bpf_object_clear_priv_t	libbpf.h	/^typedef void (*bpf_object_clear_priv_t)(struct bpf_object *, void *);$/;"	t
> +bpf_prog_attach	bpf.c	/^int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type,$/;"	f
> +bpf_prog_detach	bpf.c	/^int bpf_prog_detach(int target_fd, enum bpf_attach_type type)$/;"	f
> +bpf_prog_detach2	bpf.c	/^int bpf_prog_detach2(int prog_fd, int target_fd, enum bpf_attach_type type)$/;"	f
> +bpf_prog_get_fd_by_id	bpf.c	/^int bpf_prog_get_fd_by_id(__u32 id)$/;"	f
> +bpf_prog_get_next_id	bpf.c	/^int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id)$/;"	f
> +bpf_prog_load	libbpf.c	/^int bpf_prog_load(const char *file, enum bpf_prog_type type,$/;"	f
> +bpf_prog_prep_result	libbpf.h	/^struct bpf_prog_prep_result {$/;"	s
> +bpf_prog_query	bpf.c	/^int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,$/;"	f
> +bpf_prog_test_run	bpf.c	/^int bpf_prog_test_run(int prog_fd, int repeat, void *data, __u32 size,$/;"	f
> +bpf_program	libbpf.c	/^struct bpf_program {$/;"	s	file:
> +bpf_program__collect_reloc	libbpf.c	/^bpf_program__collect_reloc(struct bpf_program *prog,$/;"	f	file:
> +bpf_program__exit	libbpf.c	/^static void bpf_program__exit(struct bpf_program *prog)$/;"	f	file:
> +bpf_program__fd	libbpf.c	/^int bpf_program__fd(struct bpf_program *prog)$/;"	f
> +bpf_program__init	libbpf.c	/^bpf_program__init(void *data, size_t size, char *section_name, int idx,$/;"	f	file:
> +bpf_program__is_type	libbpf.c	/^static bool bpf_program__is_type(struct bpf_program *prog,$/;"	f	file:
> +bpf_program__load	libbpf.c	/^bpf_program__load(struct bpf_program *prog,$/;"	f	file:
> +bpf_program__next	libbpf.c	/^bpf_program__next(struct bpf_program *prev, struct bpf_object *obj)$/;"	f
> +bpf_program__nth_fd	libbpf.c	/^int bpf_program__nth_fd(struct bpf_program *prog, int n)$/;"	f
> +bpf_program__pin	libbpf.c	/^int bpf_program__pin(struct bpf_program *prog, const char *path)$/;"	f
> +bpf_program__pin_instance	libbpf.c	/^int bpf_program__pin_instance(struct bpf_program *prog, const char *path,$/;"	f
> +bpf_program__priv	libbpf.c	/^void *bpf_program__priv(struct bpf_program *prog)$/;"	f
> +bpf_program__relocate	libbpf.c	/^bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj)$/;"	f	file:
> +bpf_program__set_prep	libbpf.c	/^int bpf_program__set_prep(struct bpf_program *prog, int nr_instances,$/;"	f
> +bpf_program__set_priv	libbpf.c	/^int bpf_program__set_priv(struct bpf_program *prog, void *priv,$/;"	f
> +bpf_program__set_type	libbpf.c	/^void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type)$/;"	f
> +bpf_program__title	libbpf.c	/^const char *bpf_program__title(struct bpf_program *prog, bool needs_copy)$/;"	f
> +bpf_program__unload	libbpf.c	/^static void bpf_program__unload(struct bpf_program *prog)$/;"	f	file:
> +bpf_program_clear_priv_t	libbpf.h	/^typedef void (*bpf_program_clear_priv_t)(struct bpf_program *,$/;"	t
> +bpf_program_prep_t	libbpf.h	/^typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,$/;"	t
> +bpf_verify_program	bpf.c	/^int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,$/;"	f
> +check_feat	Makefile	/^  check_feat := 0$/;"	m
> +check_feat	Makefile	/^check_feat := 1$/;"	m
> +check_path	libbpf.c	/^static int check_path(const char *path)$/;"	f	file:
> +clear_priv	libbpf.c	/^	bpf_map_clear_priv_t clear_priv;$/;"	m	struct:bpf_map	file:
> +clear_priv	libbpf.c	/^	bpf_object_clear_priv_t clear_priv;$/;"	m	struct:bpf_object	file:
> +clear_priv	libbpf.c	/^	bpf_program_clear_priv_t clear_priv;$/;"	m	struct:bpf_program	file:
> +compare_bpf_map	libbpf.c	/^static int compare_bpf_map(const void *_a, const void *_b)$/;"	f	file:
> +data	libbpf.c	/^			Elf_Data *data;$/;"	m	struct:bpf_object::__anon3::__anon4	file:
> +def	libbpf.c	/^	struct bpf_map_def def;$/;"	m	struct:bpf_map	typeref:struct:bpf_map::bpf_map_def	file:
> +do_install	Makefile	/^define do_install$/;"	m
> +efile	libbpf.c	/^	} efile;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::__anon3	file:
> +ehdr	libbpf.c	/^		GElf_Ehdr ehdr;$/;"	m	struct:bpf_object::__anon3	file:
> +elf	libbpf.c	/^		Elf *elf;$/;"	m	struct:bpf_object::__anon3	file:
> +fd	libbpf.c	/^		int fd;$/;"	m	struct:bpf_object::__anon3	file:
> +fd	libbpf.c	/^	int fd;$/;"	m	struct:bpf_map	file:
> +fds	libbpf.c	/^		int *fds;$/;"	m	struct:bpf_program::__anon2	file:
> +idx	libbpf.c	/^	int idx;$/;"	m	struct:bpf_program	file:
> +insn_idx	libbpf.c	/^		int insn_idx;$/;"	m	struct:bpf_program::__anon1	file:
> +insns	libbpf.c	/^	struct bpf_insn *insns;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::bpf_insn	file:
> +insns_cnt	libbpf.c	/^	size_t insns_cnt;$/;"	m	struct:bpf_program	file:
> +instances	libbpf.c	/^	} instances;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::__anon2	file:
> +kern_version	libbpf.c	/^	u32 kern_version;$/;"	m	struct:bpf_object	file:
> +key_size	libbpf.h	/^	unsigned int key_size;$/;"	m	struct:bpf_map_def
> +libbpf_errno	libbpf.h	/^enum libbpf_errno {$/;"	g
> +libbpf_get_error	libbpf.c	/^long libbpf_get_error(const void *ptr)$/;"	f
> +libbpf_print_fn_t	libbpf.h	/^typedef int (*libbpf_print_fn_t)(const char *, ...)$/;"	t
> +libbpf_set_print	libbpf.c	/^void libbpf_set_print(libbpf_print_fn_t warn,$/;"	f
> +libbpf_strerror	libbpf.c	/^int libbpf_strerror(int err, char *buf, size_t size)$/;"	f
> +libbpf_strerror_table	libbpf.c	/^static const char *libbpf_strerror_table[NR_ERRNO] = {$/;"	v	file:
> +libdir	Makefile	/^libdir = $(prefix)\/$(libdir_relative)$/;"	m
> +libdir_SQ	Makefile	/^libdir_SQ = $(subst ','\\'',$(libdir))$/;"	m
> +libdir_relative	Makefile	/^  libdir_relative = lib$/;"	m
> +libdir_relative	Makefile	/^  libdir_relative = lib64$/;"	m
> +libdir_relative_SQ	Makefile	/^libdir_relative_SQ = $(subst ','\\'',$(libdir_relative))$/;"	m
> +license	libbpf.c	/^	char license[64];$/;"	m	struct:bpf_object	file:
> +list	libbpf.c	/^	struct list_head list;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::list_head	file:
> +load_program	libbpf.c	/^load_program(enum bpf_prog_type type, const char *name, struct bpf_insn *insns,$/;"	f	file:
> +loaded	libbpf.c	/^	bool loaded;$/;"	m	struct:bpf_object	file:
> +make_dir	libbpf.c	/^static int make_dir(const char *path)$/;"	f	file:
> +man_dir	Makefile	/^man_dir = $(prefix)\/share\/man$/;"	m
> +man_dir_SQ	Makefile	/^man_dir_SQ = '$(subst ','\\'',$(man_dir))'$/;"	m
> +map_flags	libbpf.h	/^	unsigned int map_flags;$/;"	m	struct:bpf_map_def
> +map_idx	libbpf.c	/^		int map_idx;$/;"	m	struct:bpf_program::__anon1	file:
> +maps	libbpf.c	/^	struct bpf_map *maps;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::bpf_map	file:
> +maps_shndx	libbpf.c	/^		int maps_shndx;$/;"	m	struct:bpf_object::__anon3	file:
> +max_entries	libbpf.h	/^	unsigned int max_entries;$/;"	m	struct:bpf_map_def
> +min	bpf.c	49;"	d	file:
> +name	libbpf.c	/^	char *name;$/;"	m	struct:bpf_map	file:
> +name	libbpf.c	/^	char *name;$/;"	m	struct:bpf_program	file:
> +new_insn_cnt	libbpf.h	/^	int new_insn_cnt;$/;"	m	struct:bpf_prog_prep_result
> +new_insn_ptr	libbpf.h	/^	struct bpf_insn *new_insn_ptr;$/;"	m	struct:bpf_prog_prep_result	typeref:struct:bpf_prog_prep_result::bpf_insn
> +nr	libbpf.c	/^		int nr;$/;"	m	struct:bpf_program::__anon2	file:
> +nr_maps	libbpf.c	/^	size_t nr_maps;$/;"	m	struct:bpf_object	file:
> +nr_programs	libbpf.c	/^	size_t nr_programs;$/;"	m	struct:bpf_object	file:
> +nr_reloc	libbpf.c	/^		int nr_reloc;$/;"	m	struct:bpf_object::__anon3	file:
> +nr_reloc	libbpf.c	/^	int nr_reloc;$/;"	m	struct:bpf_program	file:
> +obj	libbpf.c	/^	struct bpf_object *obj;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::bpf_object	file:
> +obj_buf	libbpf.c	/^		void *obj_buf;$/;"	m	struct:bpf_object::__anon3	file:
> +obj_buf_sz	libbpf.c	/^		size_t obj_buf_sz;$/;"	m	struct:bpf_object::__anon3	file:
> +obj_elf_valid	libbpf.c	250;"	d	file:
> +offset	libbpf.c	/^	size_t offset;$/;"	m	struct:bpf_map	file:
> +path	libbpf.c	/^	char path[];$/;"	m	struct:bpf_object	file:
> +pfd	libbpf.h	/^	int *pfd;$/;"	m	struct:bpf_prog_prep_result
> +plugin_dir_SQ	Makefile	/^plugin_dir_SQ = $(subst ','\\'',$(plugin_dir))$/;"	m
> +pr_debug	libbpf.c	81;"	d	file:
> +pr_info	libbpf.c	80;"	d	file:
> +pr_warning	libbpf.c	79;"	d	file:
> +prefix	Makefile	/^prefix ?= \/usr\/local$/;"	m
> +preprocessor	libbpf.c	/^	bpf_program_prep_t preprocessor;$/;"	m	struct:bpf_program	file:
> +priv	libbpf.c	/^	void *priv;$/;"	m	struct:bpf_map	file:
> +priv	libbpf.c	/^	void *priv;$/;"	m	struct:bpf_object	file:
> +priv	libbpf.c	/^	void *priv;$/;"	m	struct:bpf_program	file:
> +programs	libbpf.c	/^	struct bpf_program *programs;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::bpf_program	file:
> +ptr_to_u64	bpf.c	/^static inline __u64 ptr_to_u64(const void *ptr)$/;"	f	file:
> +reloc	libbpf.c	/^		} *reloc;$/;"	m	struct:bpf_object::__anon3	typeref:struct:bpf_object::__anon3::__anon4	file:
> +reloc_desc	libbpf.c	/^	} *reloc_desc;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::__anon1	file:
> +section_name	libbpf.c	/^	char *section_name;$/;"	m	struct:bpf_program	file:
> +shdr	libbpf.c	/^			GElf_Shdr shdr;$/;"	m	struct:bpf_object::__anon3::__anon4	file:
> +srctree	Makefile	/^srctree := $(patsubst %\/,%,$(dir $(CURDIR)))$/;"	m
> +srctree	Makefile	/^srctree := $(patsubst %\/,%,$(dir $(srctree)))$/;"	m
> +strtabidx	libbpf.c	/^		size_t strtabidx;$/;"	m	struct:bpf_object::__anon3	file:
> +symbols	libbpf.c	/^		Elf_Data *symbols;$/;"	m	struct:bpf_object::__anon3	file:
> +sys_bpf	bpf.c	/^static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr,$/;"	f	file:
> +type	libbpf.c	/^	enum bpf_prog_type type;$/;"	m	struct:bpf_program	typeref:enum:bpf_program::bpf_prog_type	file:
> +type	libbpf.h	/^	unsigned int type;$/;"	m	struct:bpf_map_def
> +update_dir	Makefile	/^define update_dir$/;"	m
> +value_size	libbpf.h	/^	unsigned int value_size;$/;"	m	struct:bpf_map_def
> +zclose	libbpf.c	153;"	d	file:
> +zfree	libbpf.c	149;"	d	file:
>
Alexei Starovoitov Jan. 16, 2019, 6:28 a.m. UTC | #2
On Wed, Jan 16, 2019 at 06:18:30AM +0000, Yonghong Song wrote:
> 
> 
> On 1/15/19 9:08 PM, Alexei Starovoitov wrote:
> > Introduce
> > int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags)
> > helper to lookup array/hash/cgroup_local_storage elements with BPF_F_LOCK flag.
> > 
> > Signed-off-by: Alexei Starovoitov <ast@kernel.org>
> > ---
> >   tools/lib/bpf/bpf.c      |  13 ++
> >   tools/lib/bpf/bpf.h      |   2 +
> >   tools/lib/bpf/libbpf.map |   4 +
> >   tools/lib/bpf/tags       | 254 +++++++++++++++++++++++++++++++++++++++
> 
> I think this tools/lib/bpf/tags is not needed and accidentally slipped 
> in due to cscope?

Oops.
Funny how checkpatch.pl commented about it:
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#69:
new file mode 100644

it didn't mention the file by name, so I ignored that warning.

Please continue reviewing. I will respin.
diff mbox series

Patch

diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
index 3caaa3428774..d55a77a05d5f 100644
--- a/tools/lib/bpf/bpf.c
+++ b/tools/lib/bpf/bpf.c
@@ -357,6 +357,19 @@  int bpf_map_lookup_elem(int fd, const void *key, void *value)
 	return sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
 }
 
+int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags)
+{
+	union bpf_attr attr;
+
+	bzero(&attr, sizeof(attr));
+	attr.map_fd = fd;
+	attr.key = ptr_to_u64(key);
+	attr.value = ptr_to_u64(value);
+	attr.flags = flags;
+
+	return sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
+}
+
 int bpf_map_lookup_and_delete_elem(int fd, const void *key, void *value)
 {
 	union bpf_attr attr;
diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
index 8f09de482839..ed09eed2dc3b 100644
--- a/tools/lib/bpf/bpf.h
+++ b/tools/lib/bpf/bpf.h
@@ -110,6 +110,8 @@  LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value,
 				   __u64 flags);
 
 LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value);
+LIBBPF_API int bpf_map_lookup_elem_flags(int fd, const void *key, void *value,
+					 __u64 flags);
 LIBBPF_API int bpf_map_lookup_and_delete_elem(int fd, const void *key,
 					      void *value);
 LIBBPF_API int bpf_map_delete_elem(int fd, const void *key);
diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
index cd02cd4e2cc3..ca5155409a15 100644
--- a/tools/lib/bpf/libbpf.map
+++ b/tools/lib/bpf/libbpf.map
@@ -124,3 +124,7 @@  LIBBPF_0.0.1 {
 	local:
 		*;
 };
+LIBBPF_0.0.2 {
+	global:
+		bpf_map_lookup_elem_flags;
+} LIBBPF_0.0.1;
diff --git a/tools/lib/bpf/tags b/tools/lib/bpf/tags
new file mode 100644
index 000000000000..be30548a028e
--- /dev/null
+++ b/tools/lib/bpf/tags
@@ -0,0 +1,254 @@ 
+!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
+!_TAG_PROGRAM_AUTHOR	Darren Hiebert	/dhiebert@users.sourceforge.net/
+!_TAG_PROGRAM_NAME	Exuberant Ctags	//
+!_TAG_PROGRAM_URL	http://ctags.sourceforge.net	/official site/
+!_TAG_PROGRAM_VERSION	5.8	//
+BPF_EXTRAVERSION	Makefile	/^BPF_EXTRAVERSION = 1$/;"	m
+BPF_FS_MAGIC	libbpf.c	52;"	d	file:
+BPF_IN	Makefile	/^BPF_IN    := $(OUTPUT)libbpf-in.o$/;"	m
+BPF_LOG_BUF_SIZE	bpf.h	43;"	d
+BPF_PATCHLEVEL	Makefile	/^BPF_PATCHLEVEL = 0$/;"	m
+BPF_PROG_TYPE_FNS	libbpf.c	1702;"	d	file:
+BPF_VERSION	Makefile	/^BPF_VERSION = 0$/;"	m
+CFLAGS	Makefile	/^  CFLAGS := $(EXTRA_CFLAGS)$/;"	m
+CFLAGS	Makefile	/^  CFLAGS := -g -Wall$/;"	m
+CHECK_ERR	libbpf.c	140;"	d	file:
+CMD_TARGETS	Makefile	/^CMD_TARGETS = $(LIB_FILE)$/;"	m
+DESTDIR	Makefile	/^DESTDIR ?=$/;"	m
+DESTDIR_SQ	Makefile	/^DESTDIR_SQ = '$(subst ','\\'',$(DESTDIR))'$/;"	m
+EM_BPF	libbpf.c	48;"	d	file:
+ERRCODE_OFFSET	libbpf.c	95;"	d	file:
+ERRNO_OFFSET	libbpf.c	94;"	d	file:
+EXTRAVERSION	Makefile	/^EXTRAVERSION	= $(BPF_EXTRAVERSION)$/;"	m
+FEATURE_CHECK_CFLAGS-bpf	Makefile	/^FEATURE_CHECK_CFLAGS-bpf = $(INCLUDES)$/;"	m
+FEATURE_DISPLAY	Makefile	/^FEATURE_DISPLAY = libelf bpf$/;"	m
+FEATURE_TESTS	Makefile	/^FEATURE_TESTS = libelf libelf-getphdrnum libelf-mmap bpf$/;"	m
+FEATURE_USER	Makefile	/^FEATURE_USER = .libbpf$/;"	m
+INCLUDES	Makefile	/^INCLUDES = -I. -I$(srctree)\/tools\/include -I$(srctree)\/tools\/arch\/$(ARCH)\/include\/uapi -I$(srctree)\/tools\/include\/uapi$/;"	m
+INSTALL	Makefile	/^INSTALL = install$/;"	m
+LIBBPF_ELF_C_READ_MMAP	libbpf.c	162;"	d	file:
+LIBBPF_ELF_C_READ_MMAP	libbpf.c	164;"	d	file:
+LIBBPF_ERRNO__ENDIAN	libbpf.h	/^	LIBBPF_ERRNO__ENDIAN,	\/* Endian mismatch *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__FORMAT	libbpf.h	/^	LIBBPF_ERRNO__FORMAT,	\/* BPF object format invalid *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__INTERNAL	libbpf.h	/^	LIBBPF_ERRNO__INTERNAL,	\/* Internal error in libbpf *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__KVER	libbpf.h	/^	LIBBPF_ERRNO__KVER,	\/* Incorrect kernel version *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__KVERSION	libbpf.h	/^	LIBBPF_ERRNO__KVERSION,	\/* Incorrect or no 'version' section *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__LIBELF	libbpf.h	/^	LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START,$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__LOAD	libbpf.h	/^	LIBBPF_ERRNO__LOAD,	\/* Load program failure for unknown reason *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__PROG2BIG	libbpf.h	/^	LIBBPF_ERRNO__PROG2BIG,	\/* Program too big *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__PROGTYPE	libbpf.h	/^	LIBBPF_ERRNO__PROGTYPE,	\/* Kernel doesn't support this program type *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__RELOC	libbpf.h	/^	LIBBPF_ERRNO__RELOC,	\/* Relocation failed *\/$/;"	e	enum:libbpf_errno
+LIBBPF_ERRNO__VERIFY	libbpf.h	/^	LIBBPF_ERRNO__VERIFY,	\/* Kernel verifier blocks program loading *\/$/;"	e	enum:libbpf_errno
+LIBBPF_VERSION	Makefile	/^LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION)$/;"	m
+LIB_FILE	Makefile	/^LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))$/;"	m
+LIB_FILE	Makefile	/^LIB_FILE = libbpf.a libbpf.so$/;"	m
+MAKEOVERRIDES	Makefile	/^MAKEOVERRIDES=$/;"	m
+N	Makefile	/^N		=$/;"	m
+NON_CHECK_FEAT_TARGETS	Makefile	/^NON_CHECK_FEAT_TARGETS := clean TAGS tags cscope help$/;"	m
+NR_ERRNO	libbpf.c	96;"	d	file:
+OBJ	Makefile	/^OBJ		= $@$/;"	m
+PATCHLEVEL	Makefile	/^PATCHLEVEL	= $(BPF_PATCHLEVEL)$/;"	m
+Q	Makefile	/^  Q = @$/;"	m
+Q	Makefile	/^  Q =$/;"	m
+STRERR_BUFSIZE	libbpf.c	92;"	d	file:
+TARGETS	Makefile	/^TARGETS = $(CMD_TARGETS)$/;"	m
+VERBOSE	Makefile	/^  VERBOSE = $(V)$/;"	m
+VERBOSE	Makefile	/^  VERBOSE = 0$/;"	m
+VERSION	Makefile	/^VERSION		= $(BPF_VERSION)$/;"	m
+__BPF_BPF_H	bpf.h	22;"	d
+__BPF_LIBBPF_H	libbpf.h	22;"	d
+__LIBBPF_ERRNO__END	libbpf.h	/^	__LIBBPF_ERRNO__END,$/;"	e	enum:libbpf_errno
+__LIBBPF_ERRNO__START	libbpf.h	/^	__LIBBPF_ERRNO__START = 4000,$/;"	e	enum:libbpf_errno
+__NR_bpf	bpf.c	35;"	d	file:
+__NR_bpf	bpf.c	37;"	d	file:
+__NR_bpf	bpf.c	39;"	d	file:
+__NR_bpf	bpf.c	41;"	d	file:
+__NR_bpf	bpf.c	43;"	d	file:
+__base_pr	libbpf.c	/^static int __base_pr(const char *format, ...)$/;"	f	file:
+__bpf_object__open	libbpf.c	/^__bpf_object__open(const char *path, void *obj_buf, size_t obj_buf_sz)$/;"	f	file:
+__pr	libbpf.c	73;"	d	file:
+__pr_debug	libbpf.c	/^static __printf(1, 2) libbpf_print_fn_t __pr_debug;$/;"	v
+__pr_info	libbpf.c	/^static __printf(1, 2) libbpf_print_fn_t __pr_info = __base_pr;$/;"	v
+__pr_warning	libbpf.c	/^static __printf(1, 2) libbpf_print_fn_t __pr_warning = __base_pr;$/;"	v
+__printf	libbpf.c	55;"	d	file:
+allow-override	Makefile	/^define allow-override$/;"	m
+bpf_create_map	bpf.c	/^int bpf_create_map(enum bpf_map_type map_type, int key_size,$/;"	f
+bpf_create_map_in_map	bpf.c	/^int bpf_create_map_in_map(enum bpf_map_type map_type, const char *name,$/;"	f
+bpf_create_map_in_map_node	bpf.c	/^int bpf_create_map_in_map_node(enum bpf_map_type map_type, const char *name,$/;"	f
+bpf_create_map_name	bpf.c	/^int bpf_create_map_name(enum bpf_map_type map_type, const char *name,$/;"	f
+bpf_create_map_node	bpf.c	/^int bpf_create_map_node(enum bpf_map_type map_type, const char *name,$/;"	f
+bpf_load_program	bpf.c	/^int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,$/;"	f
+bpf_load_program_name	bpf.c	/^int bpf_load_program_name(enum bpf_prog_type type, const char *name,$/;"	f
+bpf_map	libbpf.c	/^struct bpf_map {$/;"	s	file:
+bpf_map__def	libbpf.c	/^const struct bpf_map_def *bpf_map__def(struct bpf_map *map)$/;"	f
+bpf_map__fd	libbpf.c	/^int bpf_map__fd(struct bpf_map *map)$/;"	f
+bpf_map__for_each	libbpf.h	230;"	d
+bpf_map__name	libbpf.c	/^const char *bpf_map__name(struct bpf_map *map)$/;"	f
+bpf_map__next	libbpf.c	/^bpf_map__next(struct bpf_map *prev, struct bpf_object *obj)$/;"	f
+bpf_map__pin	libbpf.c	/^int bpf_map__pin(struct bpf_map *map, const char *path)$/;"	f
+bpf_map__priv	libbpf.c	/^void *bpf_map__priv(struct bpf_map *map)$/;"	f
+bpf_map__set_priv	libbpf.c	/^int bpf_map__set_priv(struct bpf_map *map, void *priv,$/;"	f
+bpf_map_clear_priv_t	libbpf.h	/^typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *);$/;"	t
+bpf_map_def	libbpf.h	/^struct bpf_map_def {$/;"	s
+bpf_map_delete_elem	bpf.c	/^int bpf_map_delete_elem(int fd, const void *key)$/;"	f
+bpf_map_get_fd_by_id	bpf.c	/^int bpf_map_get_fd_by_id(__u32 id)$/;"	f
+bpf_map_get_next_id	bpf.c	/^int bpf_map_get_next_id(__u32 start_id, __u32 *next_id)$/;"	f
+bpf_map_get_next_key	bpf.c	/^int bpf_map_get_next_key(int fd, const void *key, void *next_key)$/;"	f
+bpf_map_lookup_elem	bpf.c	/^int bpf_map_lookup_elem(int fd, const void *key, void *value)$/;"	f
+bpf_map_update_elem	bpf.c	/^int bpf_map_update_elem(int fd, const void *key, const void *value,$/;"	f
+bpf_obj_get	bpf.c	/^int bpf_obj_get(const char *pathname)$/;"	f
+bpf_obj_get_info_by_fd	bpf.c	/^int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len)$/;"	f
+bpf_obj_pin	bpf.c	/^int bpf_obj_pin(int fd, const char *pathname)$/;"	f
+bpf_object	libbpf.c	/^struct bpf_object {$/;"	s	file:
+bpf_object__add_program	libbpf.c	/^bpf_object__add_program(struct bpf_object *obj, void *data, size_t size,$/;"	f	file:
+bpf_object__check_endianness	libbpf.c	/^bpf_object__check_endianness(struct bpf_object *obj)$/;"	f	file:
+bpf_object__close	libbpf.c	/^void bpf_object__close(struct bpf_object *obj)$/;"	f
+bpf_object__collect_reloc	libbpf.c	/^static int bpf_object__collect_reloc(struct bpf_object *obj)$/;"	f	file:
+bpf_object__create_maps	libbpf.c	/^bpf_object__create_maps(struct bpf_object *obj)$/;"	f	file:
+bpf_object__elf_collect	libbpf.c	/^static int bpf_object__elf_collect(struct bpf_object *obj)$/;"	f	file:
+bpf_object__elf_finish	libbpf.c	/^static void bpf_object__elf_finish(struct bpf_object *obj)$/;"	f	file:
+bpf_object__elf_init	libbpf.c	/^static int bpf_object__elf_init(struct bpf_object *obj)$/;"	f	file:
+bpf_object__find_map_by_name	libbpf.c	/^bpf_object__find_map_by_name(struct bpf_object *obj, const char *name)$/;"	f
+bpf_object__find_map_by_offset	libbpf.c	/^bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset)$/;"	f
+bpf_object__find_prog_by_idx	libbpf.c	/^bpf_object__find_prog_by_idx(struct bpf_object *obj, int idx)$/;"	f	file:
+bpf_object__for_each_program	libbpf.h	95;"	d
+bpf_object__for_each_safe	libbpf.h	79;"	d
+bpf_object__init_kversion	libbpf.c	/^bpf_object__init_kversion(struct bpf_object *obj,$/;"	f	file:
+bpf_object__init_license	libbpf.c	/^bpf_object__init_license(struct bpf_object *obj,$/;"	f	file:
+bpf_object__init_maps	libbpf.c	/^bpf_object__init_maps(struct bpf_object *obj)$/;"	f	file:
+bpf_object__init_prog_names	libbpf.c	/^bpf_object__init_prog_names(struct bpf_object *obj)$/;"	f	file:
+bpf_object__kversion	libbpf.c	/^unsigned int bpf_object__kversion(struct bpf_object *obj)$/;"	f
+bpf_object__load	libbpf.c	/^int bpf_object__load(struct bpf_object *obj)$/;"	f
+bpf_object__load_progs	libbpf.c	/^bpf_object__load_progs(struct bpf_object *obj)$/;"	f	file:
+bpf_object__name	libbpf.c	/^const char *bpf_object__name(struct bpf_object *obj)$/;"	f
+bpf_object__new	libbpf.c	/^static struct bpf_object *bpf_object__new(const char *path,$/;"	f	file:
+bpf_object__next	libbpf.c	/^bpf_object__next(struct bpf_object *prev)$/;"	f
+bpf_object__open	libbpf.c	/^struct bpf_object *bpf_object__open(const char *path)$/;"	f
+bpf_object__open_buffer	libbpf.c	/^struct bpf_object *bpf_object__open_buffer(void *obj_buf,$/;"	f
+bpf_object__pin	libbpf.c	/^int bpf_object__pin(struct bpf_object *obj, const char *path)$/;"	f
+bpf_object__priv	libbpf.c	/^void *bpf_object__priv(struct bpf_object *obj)$/;"	f
+bpf_object__relocate	libbpf.c	/^bpf_object__relocate(struct bpf_object *obj)$/;"	f	file:
+bpf_object__set_priv	libbpf.c	/^int bpf_object__set_priv(struct bpf_object *obj, void *priv,$/;"	f
+bpf_object__unload	libbpf.c	/^int bpf_object__unload(struct bpf_object *obj)$/;"	f
+bpf_object__validate	libbpf.c	/^static int bpf_object__validate(struct bpf_object *obj)$/;"	f	file:
+bpf_object_clear_priv_t	libbpf.h	/^typedef void (*bpf_object_clear_priv_t)(struct bpf_object *, void *);$/;"	t
+bpf_prog_attach	bpf.c	/^int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type,$/;"	f
+bpf_prog_detach	bpf.c	/^int bpf_prog_detach(int target_fd, enum bpf_attach_type type)$/;"	f
+bpf_prog_detach2	bpf.c	/^int bpf_prog_detach2(int prog_fd, int target_fd, enum bpf_attach_type type)$/;"	f
+bpf_prog_get_fd_by_id	bpf.c	/^int bpf_prog_get_fd_by_id(__u32 id)$/;"	f
+bpf_prog_get_next_id	bpf.c	/^int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id)$/;"	f
+bpf_prog_load	libbpf.c	/^int bpf_prog_load(const char *file, enum bpf_prog_type type,$/;"	f
+bpf_prog_prep_result	libbpf.h	/^struct bpf_prog_prep_result {$/;"	s
+bpf_prog_query	bpf.c	/^int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,$/;"	f
+bpf_prog_test_run	bpf.c	/^int bpf_prog_test_run(int prog_fd, int repeat, void *data, __u32 size,$/;"	f
+bpf_program	libbpf.c	/^struct bpf_program {$/;"	s	file:
+bpf_program__collect_reloc	libbpf.c	/^bpf_program__collect_reloc(struct bpf_program *prog,$/;"	f	file:
+bpf_program__exit	libbpf.c	/^static void bpf_program__exit(struct bpf_program *prog)$/;"	f	file:
+bpf_program__fd	libbpf.c	/^int bpf_program__fd(struct bpf_program *prog)$/;"	f
+bpf_program__init	libbpf.c	/^bpf_program__init(void *data, size_t size, char *section_name, int idx,$/;"	f	file:
+bpf_program__is_type	libbpf.c	/^static bool bpf_program__is_type(struct bpf_program *prog,$/;"	f	file:
+bpf_program__load	libbpf.c	/^bpf_program__load(struct bpf_program *prog,$/;"	f	file:
+bpf_program__next	libbpf.c	/^bpf_program__next(struct bpf_program *prev, struct bpf_object *obj)$/;"	f
+bpf_program__nth_fd	libbpf.c	/^int bpf_program__nth_fd(struct bpf_program *prog, int n)$/;"	f
+bpf_program__pin	libbpf.c	/^int bpf_program__pin(struct bpf_program *prog, const char *path)$/;"	f
+bpf_program__pin_instance	libbpf.c	/^int bpf_program__pin_instance(struct bpf_program *prog, const char *path,$/;"	f
+bpf_program__priv	libbpf.c	/^void *bpf_program__priv(struct bpf_program *prog)$/;"	f
+bpf_program__relocate	libbpf.c	/^bpf_program__relocate(struct bpf_program *prog, struct bpf_object *obj)$/;"	f	file:
+bpf_program__set_prep	libbpf.c	/^int bpf_program__set_prep(struct bpf_program *prog, int nr_instances,$/;"	f
+bpf_program__set_priv	libbpf.c	/^int bpf_program__set_priv(struct bpf_program *prog, void *priv,$/;"	f
+bpf_program__set_type	libbpf.c	/^void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type)$/;"	f
+bpf_program__title	libbpf.c	/^const char *bpf_program__title(struct bpf_program *prog, bool needs_copy)$/;"	f
+bpf_program__unload	libbpf.c	/^static void bpf_program__unload(struct bpf_program *prog)$/;"	f	file:
+bpf_program_clear_priv_t	libbpf.h	/^typedef void (*bpf_program_clear_priv_t)(struct bpf_program *,$/;"	t
+bpf_program_prep_t	libbpf.h	/^typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,$/;"	t
+bpf_verify_program	bpf.c	/^int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,$/;"	f
+check_feat	Makefile	/^  check_feat := 0$/;"	m
+check_feat	Makefile	/^check_feat := 1$/;"	m
+check_path	libbpf.c	/^static int check_path(const char *path)$/;"	f	file:
+clear_priv	libbpf.c	/^	bpf_map_clear_priv_t clear_priv;$/;"	m	struct:bpf_map	file:
+clear_priv	libbpf.c	/^	bpf_object_clear_priv_t clear_priv;$/;"	m	struct:bpf_object	file:
+clear_priv	libbpf.c	/^	bpf_program_clear_priv_t clear_priv;$/;"	m	struct:bpf_program	file:
+compare_bpf_map	libbpf.c	/^static int compare_bpf_map(const void *_a, const void *_b)$/;"	f	file:
+data	libbpf.c	/^			Elf_Data *data;$/;"	m	struct:bpf_object::__anon3::__anon4	file:
+def	libbpf.c	/^	struct bpf_map_def def;$/;"	m	struct:bpf_map	typeref:struct:bpf_map::bpf_map_def	file:
+do_install	Makefile	/^define do_install$/;"	m
+efile	libbpf.c	/^	} efile;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::__anon3	file:
+ehdr	libbpf.c	/^		GElf_Ehdr ehdr;$/;"	m	struct:bpf_object::__anon3	file:
+elf	libbpf.c	/^		Elf *elf;$/;"	m	struct:bpf_object::__anon3	file:
+fd	libbpf.c	/^		int fd;$/;"	m	struct:bpf_object::__anon3	file:
+fd	libbpf.c	/^	int fd;$/;"	m	struct:bpf_map	file:
+fds	libbpf.c	/^		int *fds;$/;"	m	struct:bpf_program::__anon2	file:
+idx	libbpf.c	/^	int idx;$/;"	m	struct:bpf_program	file:
+insn_idx	libbpf.c	/^		int insn_idx;$/;"	m	struct:bpf_program::__anon1	file:
+insns	libbpf.c	/^	struct bpf_insn *insns;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::bpf_insn	file:
+insns_cnt	libbpf.c	/^	size_t insns_cnt;$/;"	m	struct:bpf_program	file:
+instances	libbpf.c	/^	} instances;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::__anon2	file:
+kern_version	libbpf.c	/^	u32 kern_version;$/;"	m	struct:bpf_object	file:
+key_size	libbpf.h	/^	unsigned int key_size;$/;"	m	struct:bpf_map_def
+libbpf_errno	libbpf.h	/^enum libbpf_errno {$/;"	g
+libbpf_get_error	libbpf.c	/^long libbpf_get_error(const void *ptr)$/;"	f
+libbpf_print_fn_t	libbpf.h	/^typedef int (*libbpf_print_fn_t)(const char *, ...)$/;"	t
+libbpf_set_print	libbpf.c	/^void libbpf_set_print(libbpf_print_fn_t warn,$/;"	f
+libbpf_strerror	libbpf.c	/^int libbpf_strerror(int err, char *buf, size_t size)$/;"	f
+libbpf_strerror_table	libbpf.c	/^static const char *libbpf_strerror_table[NR_ERRNO] = {$/;"	v	file:
+libdir	Makefile	/^libdir = $(prefix)\/$(libdir_relative)$/;"	m
+libdir_SQ	Makefile	/^libdir_SQ = $(subst ','\\'',$(libdir))$/;"	m
+libdir_relative	Makefile	/^  libdir_relative = lib$/;"	m
+libdir_relative	Makefile	/^  libdir_relative = lib64$/;"	m
+libdir_relative_SQ	Makefile	/^libdir_relative_SQ = $(subst ','\\'',$(libdir_relative))$/;"	m
+license	libbpf.c	/^	char license[64];$/;"	m	struct:bpf_object	file:
+list	libbpf.c	/^	struct list_head list;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::list_head	file:
+load_program	libbpf.c	/^load_program(enum bpf_prog_type type, const char *name, struct bpf_insn *insns,$/;"	f	file:
+loaded	libbpf.c	/^	bool loaded;$/;"	m	struct:bpf_object	file:
+make_dir	libbpf.c	/^static int make_dir(const char *path)$/;"	f	file:
+man_dir	Makefile	/^man_dir = $(prefix)\/share\/man$/;"	m
+man_dir_SQ	Makefile	/^man_dir_SQ = '$(subst ','\\'',$(man_dir))'$/;"	m
+map_flags	libbpf.h	/^	unsigned int map_flags;$/;"	m	struct:bpf_map_def
+map_idx	libbpf.c	/^		int map_idx;$/;"	m	struct:bpf_program::__anon1	file:
+maps	libbpf.c	/^	struct bpf_map *maps;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::bpf_map	file:
+maps_shndx	libbpf.c	/^		int maps_shndx;$/;"	m	struct:bpf_object::__anon3	file:
+max_entries	libbpf.h	/^	unsigned int max_entries;$/;"	m	struct:bpf_map_def
+min	bpf.c	49;"	d	file:
+name	libbpf.c	/^	char *name;$/;"	m	struct:bpf_map	file:
+name	libbpf.c	/^	char *name;$/;"	m	struct:bpf_program	file:
+new_insn_cnt	libbpf.h	/^	int new_insn_cnt;$/;"	m	struct:bpf_prog_prep_result
+new_insn_ptr	libbpf.h	/^	struct bpf_insn *new_insn_ptr;$/;"	m	struct:bpf_prog_prep_result	typeref:struct:bpf_prog_prep_result::bpf_insn
+nr	libbpf.c	/^		int nr;$/;"	m	struct:bpf_program::__anon2	file:
+nr_maps	libbpf.c	/^	size_t nr_maps;$/;"	m	struct:bpf_object	file:
+nr_programs	libbpf.c	/^	size_t nr_programs;$/;"	m	struct:bpf_object	file:
+nr_reloc	libbpf.c	/^		int nr_reloc;$/;"	m	struct:bpf_object::__anon3	file:
+nr_reloc	libbpf.c	/^	int nr_reloc;$/;"	m	struct:bpf_program	file:
+obj	libbpf.c	/^	struct bpf_object *obj;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::bpf_object	file:
+obj_buf	libbpf.c	/^		void *obj_buf;$/;"	m	struct:bpf_object::__anon3	file:
+obj_buf_sz	libbpf.c	/^		size_t obj_buf_sz;$/;"	m	struct:bpf_object::__anon3	file:
+obj_elf_valid	libbpf.c	250;"	d	file:
+offset	libbpf.c	/^	size_t offset;$/;"	m	struct:bpf_map	file:
+path	libbpf.c	/^	char path[];$/;"	m	struct:bpf_object	file:
+pfd	libbpf.h	/^	int *pfd;$/;"	m	struct:bpf_prog_prep_result
+plugin_dir_SQ	Makefile	/^plugin_dir_SQ = $(subst ','\\'',$(plugin_dir))$/;"	m
+pr_debug	libbpf.c	81;"	d	file:
+pr_info	libbpf.c	80;"	d	file:
+pr_warning	libbpf.c	79;"	d	file:
+prefix	Makefile	/^prefix ?= \/usr\/local$/;"	m
+preprocessor	libbpf.c	/^	bpf_program_prep_t preprocessor;$/;"	m	struct:bpf_program	file:
+priv	libbpf.c	/^	void *priv;$/;"	m	struct:bpf_map	file:
+priv	libbpf.c	/^	void *priv;$/;"	m	struct:bpf_object	file:
+priv	libbpf.c	/^	void *priv;$/;"	m	struct:bpf_program	file:
+programs	libbpf.c	/^	struct bpf_program *programs;$/;"	m	struct:bpf_object	typeref:struct:bpf_object::bpf_program	file:
+ptr_to_u64	bpf.c	/^static inline __u64 ptr_to_u64(const void *ptr)$/;"	f	file:
+reloc	libbpf.c	/^		} *reloc;$/;"	m	struct:bpf_object::__anon3	typeref:struct:bpf_object::__anon3::__anon4	file:
+reloc_desc	libbpf.c	/^	} *reloc_desc;$/;"	m	struct:bpf_program	typeref:struct:bpf_program::__anon1	file:
+section_name	libbpf.c	/^	char *section_name;$/;"	m	struct:bpf_program	file:
+shdr	libbpf.c	/^			GElf_Shdr shdr;$/;"	m	struct:bpf_object::__anon3::__anon4	file:
+srctree	Makefile	/^srctree := $(patsubst %\/,%,$(dir $(CURDIR)))$/;"	m
+srctree	Makefile	/^srctree := $(patsubst %\/,%,$(dir $(srctree)))$/;"	m
+strtabidx	libbpf.c	/^		size_t strtabidx;$/;"	m	struct:bpf_object::__anon3	file:
+symbols	libbpf.c	/^		Elf_Data *symbols;$/;"	m	struct:bpf_object::__anon3	file:
+sys_bpf	bpf.c	/^static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr,$/;"	f	file:
+type	libbpf.c	/^	enum bpf_prog_type type;$/;"	m	struct:bpf_program	typeref:enum:bpf_program::bpf_prog_type	file:
+type	libbpf.h	/^	unsigned int type;$/;"	m	struct:bpf_map_def
+update_dir	Makefile	/^define update_dir$/;"	m
+value_size	libbpf.h	/^	unsigned int value_size;$/;"	m	struct:bpf_map_def
+zclose	libbpf.c	153;"	d	file:
+zfree	libbpf.c	149;"	d	file: