1. 07 8月, 2015 9 次提交
    • W
      bpf tools: Collect symbol table from SHT_SYMTAB section · bec7d68c
      Wang Nan 提交于
      This patch collects symbols section. This section is useful when linking
      BPF maps.
      
      What 'bpf_map_xxx()' functions actually require are map's file
      descriptors (and the internal verifier converts fds into pointers to
      'struct bpf_map'), which we don't know when compiling. Therefore, we
      should make compiler generate a 'ldr_64 r1, <imm>' instruction, and
      fill the 'imm' field with the actual file descriptor when loading in
      libbpf.
      
      BPF programs should be written in this way:
      
       struct bpf_map_def SEC("maps") my_map = {
          .type = BPF_MAP_TYPE_HASH,
          .key_size = sizeof(unsigned long),
          .value_size = sizeof(unsigned long),
          .max_entries = 1000000,
       };
      
       SEC("my_func=sys_write")
       int my_func(void *ctx)
       {
           ...
           bpf_map_update_elem(&my_map, &key, &value, BPF_ANY);
           ...
       }
      
      Compiler should convert '&my_map' into a 'ldr_64, r1, <imm>'
      instruction, where imm should be the address of 'my_map'. According to
      the address, libbpf knows which map it actually referenced, and then
      fills the imm field with the 'fd' of that map created by it.
      
      However, since we never really 'link' the object file, the imm field is
      only a record in relocation section. Therefore libbpf should do the
      relocation:
      
       1. In relocation section (type == SHT_REL), positions of each such
          'ldr_64' instruction are recorded with a reference of an entry in
          symbol table (SHT_SYMTAB);
      
       2. From records in symbol table we can find the indics of map
          variables.
      
      Libbpf first record SHT_SYMTAB and positions of each instruction which
      required bu such operation. Then create file descriptor. Finally, after
      map creation complete, replace the imm field.
      
      This is the first patch of BPF map related stuff. It records SHT_SYMTAB
      into object's efile field for further use.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-12-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      bec7d68c
    • W
      bpf tools: Collect map definitions from 'maps' section · 0b3d1efa
      Wang Nan 提交于
      If maps are used by eBPF programs, corresponding object file(s) should
      contain a section named 'map'. Which contains map definitions. This
      patch copies the data of the whole section. Map data parsing should be
      acted just before map loading.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-11-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      0b3d1efa
    • W
      bpf tools: Collect version and license from ELF sections · cb1e5e96
      Wang Nan 提交于
      Expand bpf_obj_elf_collect() to collect license and kernel version
      information in eBPF object file. eBPF object file should have a section
      named 'license', which contains a string. It should also have a section
      named 'version', contains a u32 LINUX_VERSION_CODE.
      
      bpf_obj_validate() is introduced to validate object file after loaded.
      Currently it only check existence of 'version' section.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-10-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      cb1e5e96
    • W
      bpf tools: Iterate over ELF sections to collect information · 29603665
      Wang Nan 提交于
      bpf_obj_elf_collect() is introduced to iterate over each elf sections to
      collection information in eBPF object files. This function will futher
      enhanced to collect license, kernel version, programs, configs and map
      information.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-9-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      29603665
    • W
      bpf tools: Check endianness and make libbpf fail early · cc4228d5
      Wang Nan 提交于
      Check endianness according to EHDR. Code is taken from
      tools/perf/util/symbol-elf.c.
      
      Libbpf doesn't magically convert missmatched endianness. Even if we swap
      eBPF instructions to correct byte order, we are unable to deal with
      endianness in code logical generated by LLVM.
      
      Therefore, libbpf should simply reject missmatched ELF object, and let
      LLVM to create good code.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-8-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      cc4228d5
    • W
      bpf tools: Read eBPF object from buffer · 6c956392
      Wang Nan 提交于
      To support dynamic compiling, this patch allows caller to pass a
      in-memory buffer to libbpf by bpf_object__open_buffer(). libbpf calls
      elf_memory() to open it as ELF object file.
      
      Because __bpf_object__open() collects all required data and won't need
      that buffer anymore, libbpf uses that buffer directly instead of clone a
      new buffer. Caller of libbpf can free that buffer or use it do other
      things after bpf_object__open_buffer() return.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-7-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      6c956392
    • W
      bpf tools: Open eBPF object file and do basic validation · 1a5e3fb1
      Wang Nan 提交于
      This patch defines basic interface of libbpf. 'struct bpf_object' will
      be the handler of each object file. Its internal structure is hide to
      user. eBPF object files are compiled by LLVM as ELF format. In this
      patch, libelf is used to open those files, read EHDR and do basic
      validation according to e_type and e_machine.
      
      All elf related staffs are grouped together and reside in efile field of
      'struct bpf_object'. bpf_object__elf_finish() is introduced to clear it.
      
      After all eBPF programs in an object file are loaded, related ELF
      information is useless. Close the object file and free those memory.
      
      The zfree() and zclose() functions are introduced to ensure setting NULL
      pointers and negative file descriptors after resources are released.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-6-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1a5e3fb1
    • W
      bpf tools: Allow caller to set printing function · b3f59d66
      Wang Nan 提交于
      By libbpf_set_print(), users of libbpf are allowed to register he/she
      own debug, info and warning printing functions. Libbpf will use those
      functions to print messages. If not provided, default info and warning
      printing functions are fprintf(stderr, ...); default debug printing
      is NULL.
      
      This API is designed to be used by perf, enables it to register its own
      logging functions to make all logs uniform, instead of separated
      logging level control.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Cc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-5-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      b3f59d66
    • W
      bpf tools: Introduce 'bpf' library and add bpf feature check · 1b76c13e
      Wang Nan 提交于
      This is the first patch of libbpf. The goal of libbpf is to create a
      standard way for accessing eBPF object files. This patch creates
      'Makefile' and 'Build' for it, allows 'make' to build libbpf.a and
      libbpf.so, 'make install' to put them into proper directories.
      Most part of Makefile is borrowed from traceevent.
      
      Before building, it checks the existence of libelf in Makefile, and deny
      to build if not found. Instead of throwing an error if libelf not found,
      the error raises in a phony target "elfdep". This design is to ensure
      'make clean' still workable even if libelf is not found.
      
      Because libbpf requires 'kern_version' field set for 'union bpf_attr'
      (bpfdep" is used for that dependency), Kernel BPF API is also checked
      by intruducing a new feature check 'bpf' into tools/build/feature,
      which checks the existence and version of linux/bpf.h. When building
      libbpf, it searches that file from include/uapi/linux in kernel source
      tree (controlled by FEATURE_CHECK_CFLAGS-bpf). Since it searches kernel
      source tree it reside, installing of newest kernel headers is not
      required, except we are trying to port these files to an old kernel.
      
      To avoid checking that file when perf building, the newly introduced
      'bpf' feature check doesn't added into FEATURE_TESTS and
      FEATURE_DISPLAY by default in tools/build/Makefile.feature, but added
      into libbpf's specific.
      Signed-off-by: NWang Nan <wangnan0@huawei.com>
      Acked-by: NAlexei Starovoitov <ast@plumgrid.com>
      Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
      Cc: Daniel Borkmann <daniel@iogearbox.net>
      Cc: David Ahern <dsahern@gmail.com>
      Cc: He Kuang <hekuang@huawei.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kaixu Xia <xiakaixu@huawei.com>
      Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Zefan Li <lizefan@huawei.com>
      Bcc: pi3orama@163.com
      Link: http://lkml.kernel.org/r/1435716878-189507-4-git-send-email-wangnan0@huawei.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
      1b76c13e