Messages in this thread Patch in this message | | | Date | Fri, 29 May 2015 23:44:05 +0900 | From | Namhyung Kim <> | Subject | Re: [RFC PATCH v4 15/29] bpf tools: Add bpf.c/h for common bpf operations |
| |
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@huawei.com> > --- > 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@kernel.org> > + * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> > + * 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@kernel.org> > + * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> > + * 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 >
| |