Re: [RFC PATCH v4 15/29] bpf tools: Add bpf.c/h for common bpf operations

From: Namhyung Kim
Date: Fri May 29 2015 - 10:45:44 EST


On Wed, May 27, 2015 at 05:19:50AM +0000, Wang Nan wrote:
> This patch introduces bpf.c and bpf.h, which hold common functions
> issuing bpf syscall. The goal of these two files is to hide syscall
> completly from user. Note that bpf.c and bpf.h only deal with kernel
> interface. Things like structure of 'map' section in the ELF object is
> not cared by of bpf.[ch].
>
> We first introduce bpf_create_map().
>
> Note that, since functions in bpf.[ch] are wrapper of sys_bpf, they
> don't use OO style naming.
>
> Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
> ---
> tools/lib/bpf/Build | 2 +-
> tools/lib/bpf/bpf.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> tools/lib/bpf/bpf.h | 16 +++++++++++++++
> 3 files changed, 73 insertions(+), 1 deletion(-)
> create mode 100644 tools/lib/bpf/bpf.c
> create mode 100644 tools/lib/bpf/bpf.h
>
> diff --git a/tools/lib/bpf/Build b/tools/lib/bpf/Build
> index a316484..d874975 100644
> --- a/tools/lib/bpf/Build
> +++ b/tools/lib/bpf/Build
> @@ -1 +1 @@
> -libbpf-y := libbpf.o
> +libbpf-y := libbpf.o bpf.o
> diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
> new file mode 100644
> index 0000000..7481923
> --- /dev/null
> +++ b/tools/lib/bpf/bpf.c
> @@ -0,0 +1,56 @@
> +/*
> + * common eBPF ELF operations.
> + *
> + * Copyright (C) 2013-2015 Alexei Starovoitov <ast@xxxxxxxxxx>
> + * Copyright (C) 2015 Wang Nan <wangnan0@xxxxxxxxxx>
> + * Copyright (C) 2015 Huawei Inc.
> + */
> +
> +#include <stdlib.h>
> +#include <memory.h>
> +#include <unistd.h>
> +#include <asm/unistd.h>
> +#include <linux/bpf.h>
> +#include "bpf.h"
> +
> +/* When building perf, unistd.h is override. __NR_bpf by ourself. */
> +#if defined(__i386__)
> +#ifndef __NR_bpf
> +# define __NR_bpf 357
> +#endif
> +#endif
> +
> +#if defined(__x86_64__)
> +#ifndef __NR_bpf
> +# define __NR_bpf 321
> +#endif
> +#endif
> +
> +#if defined(__aarch64__)
> +#ifndef __NR_bpf
> +# define __NR_bpf 280
> +#endif
> +#endif
> +
> +#ifndef __NR_bpf
> +# error __NR_bpf not defined. libbpf does not support your arch.
> +#endif

Why not doing this way?

#ifndef __NR_bpf
# if defined(__i386__)
# define __NR_bpf 357
# elif defined(__x86_64)
# define __NR_bpf 321
# elif defined(__aarch64__)
# define __NR_bpf 280
# else
# error __NR_bpf not defined. libbpf does not support your arch.
# endif
#endif

Thanks,
Namhyung


> +
> +static int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, unsigned int size)
> +{
> + return syscall(__NR_bpf, cmd, attr, size);
> +}
> +
> +int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
> + int max_entries)
> +{
> + union bpf_attr attr;
> + memset(&attr, '\0', sizeof(attr));
> +
> + attr.map_type = map_type;
> + attr.key_size = key_size;
> + attr.value_size = value_size;
> + attr.max_entries = max_entries;
> +
> + return sys_bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
> +}
> diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
> new file mode 100644
> index 0000000..28f7942
> --- /dev/null
> +++ b/tools/lib/bpf/bpf.h
> @@ -0,0 +1,16 @@
> +/*
> + * common eBPF ELF operations.
> + *
> + * Copyright (C) 2013-2015 Alexei Starovoitov <ast@xxxxxxxxxx>
> + * Copyright (C) 2015 Wang Nan <wangnan0@xxxxxxxxxx>
> + * Copyright (C) 2015 Huawei Inc.
> + */
> +#ifndef __BPF_BPF_H
> +#define __BPF_BPF_H
> +
> +#include <linux/bpf.h>
> +
> +int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
> + int max_entries);
> +
> +#endif
> --
> 1.8.3.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/