perf/ebpf basic integration

Please see the changeset comments, but this is the very basic integration of
 perf with libbpf that, given a .o file built for the 'bpf' target with clang,
 will get it validated and loaded into the kernel via the sys_bpf syscall, which
 can be seen using 'perf trace' to trace the whole thing looking just for the
 bpf and perf_event_open syscalls:
 
   # perf trace -e bpf,perf_event_open perf record -g --event /tmp/foo.o -a
    362.779 ( 0.129 ms): perf/22408 bpf(cmd: 5, uattr: 0x7ffd4edb6db0, size: 48                           ) = 3
    384.192 ( 0.016 ms): perf/22408 perf_event_open(attr_uptr: 0x7ffd4edbace0, pid: -1, cpu: 3, group_fd: -1, flags: FD_CLOEXEC) = 5
    384.247 ( 0.038 ms): perf/22408 perf_event_open(attr_uptr: 0x37aedd8, pid: -1, group_fd: -1, flags: FD_CLOEXEC) = 5
    384.261 ( 0.007 ms): perf/22408 perf_event_open(attr_uptr: 0x37aedd8, pid: -1, group_fd: -1, flags: FD_CLOEXEC) = 5
    387.680 ( 3.413 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, group_fd: -1, flags: FD_CLOEXEC) = 5
    387.688 ( 0.005 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, cpu: 1, group_fd: -1, flags: FD_CLOEXEC) = 6
    387.693 ( 0.004 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, cpu: 2, group_fd: -1, flags: FD_CLOEXEC) = 7
    387.698 ( 0.003 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, cpu: 3, group_fd: -1, flags: FD_CLOEXEC) = 8
   ^C[ perf record: Woken up 1 times to write data ]
     [ perf record: Captured and wrote 0.221 MB perf.data (2 samples) ]
   # perf script
   bash 18389 [002] 83446.412607: perf_bpf_probe:fork: (ffffffff8109be30)
                   29be31 _do_fork (/lib/modules/4.3.0-rc6+/build/vmlinux)
                   96d662 tracesys_phase2 (/lib/modules/4.3.0-rc6+/build/vmlinux)
                    bd56c __libc_fork (/usr/lib64/libc-2.17.so)
                    413b2 make_child (/usr/bin/bash)
 
   bash 18389 [002] 83447.227255: perf_bpf_probe:fork: (ffffffff8109be30)
                   29be31 _do_fork (/lib/modules/4.3.0-rc6+/build/vmlinux)
                   96d662 tracesys_phase2 (/lib/modules/4.3.0-rc6+/build/vmlinux)
                    bd56c __libc_fork (/usr/lib64/libc-2.17.so)
                    413b2 make_child (/usr/bin/bash)
 
   # perf evlist -v
   perf_bpf_probe:fork: type: 2, size: 112, config: 0x6cf, { sample_period, sample_freq }: 1, sample_type: IP|TID|TIME|CALLCHAIN|CPU|PERIOD|RAW, disabled: 1, inherit: 1, mmap: 1, comm: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
   #
 
 More work is about to be reviewed, tested and merged that will allow the whole
 process of going from a .c file to an .o file via clang, etc to be done
 automagically. (Wang Nan)
 
 Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJWMPzEAAoJENZQFvNTUqpAib4P/Ronv5SdIHxT1OfVZ6GiK9oG
 b+K72dAFcOZVg0aSRIe0s9jczKEomJBkT8H7JG5JOPGD94E/asWnItjuS9EwTaQG
 E2m/+OMwb0LhL4OeF7KH4YBAhNFMpBzlIO+IgHky8FNwuk2sa/dgPK8Xav3NLHzn
 yNunz+282RcSt9XE06Pm/tMCkcMQIvPbjRcXV5McA0zJYkCZDCYDKl3i11ypJY3K
 7t5sdz2Rau0wwG5XEsr5ZxQB4jphlzeYA+5YxiYxFigHlg/nSskzrwwSwxzQBSJb
 tHVBV9GQYVj2KEqS60kO4lNNTUPdhF92GNh3GSKa/laxtUYu+fBm224oz3cES86B
 oh8B8B05eSyj9WM4u23TSHir7Z8ppbtzTVfBXJNDO63dMZ/EhlL8r6uzfKNB3zM2
 aXMyUfcrF9wK8wnds4MA9VGwmkkXx3ailOH5zIskTNSzU5FK6WWAPptNFI1ykxJb
 56poai9g5F1VqE5X90yHgzRFC/Vc6GC4KuOjtw9ixzPZ6zA8TLYrDEtIeP5eZoC6
 ZaI8jF6+8+nOVoDwsYIoEYE+IFi/zhmpOOQ0eNoAv2+o6FaPJ7tSNmDMMcgE1CQN
 x9jVvAb3eVFuh5dLhLiCPxkE7qv8kAARt2qNncscMBTEVRJ3mNGSvjQcYB5ScOnp
 /W6no1caIEPGr/AZIXch
 =xGPO
 -----END PGP SIGNATURE-----

Merge tag 'perf-ebpf-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core

Pull basic perf/ebpf integration:

 "Please see the changeset comments, but this is the very basic integration of
  perf with libbpf that, given a .o file built for the 'bpf' target with clang,
  will get it validated and loaded into the kernel via the sys_bpf syscall, which
  can be seen using 'perf trace' to trace the whole thing looking just for the
  bpf and perf_event_open syscalls:

    # perf trace -e bpf,perf_event_open perf record -g --event /tmp/foo.o -a
     362.779 ( 0.129 ms): perf/22408 bpf(cmd: 5, uattr: 0x7ffd4edb6db0, size: 48                           ) = 3
     384.192 ( 0.016 ms): perf/22408 perf_event_open(attr_uptr: 0x7ffd4edbace0, pid: -1, cpu: 3, group_fd: -1, flags: FD_CLOEXEC) = 5
     384.247 ( 0.038 ms): perf/22408 perf_event_open(attr_uptr: 0x37aedd8, pid: -1, group_fd: -1, flags: FD_CLOEXEC) = 5
     384.261 ( 0.007 ms): perf/22408 perf_event_open(attr_uptr: 0x37aedd8, pid: -1, group_fd: -1, flags: FD_CLOEXEC) = 5
     387.680 ( 3.413 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, group_fd: -1, flags: FD_CLOEXEC) = 5
     387.688 ( 0.005 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, cpu: 1, group_fd: -1, flags: FD_CLOEXEC) = 6
     387.693 ( 0.004 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, cpu: 2, group_fd: -1, flags: FD_CLOEXEC) = 7
     387.698 ( 0.003 ms): perf/22408 perf_event_open(attr_uptr: 0x3222f08, pid: -1, cpu: 3, group_fd: -1, flags: FD_CLOEXEC) = 8
    ^C[ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.221 MB perf.data (2 samples) ]
    # perf script
    bash 18389 [002] 83446.412607: perf_bpf_probe:fork: (ffffffff8109be30)
                    29be31 _do_fork (/lib/modules/4.3.0-rc6+/build/vmlinux)
                    96d662 tracesys_phase2 (/lib/modules/4.3.0-rc6+/build/vmlinux)
                     bd56c __libc_fork (/usr/lib64/libc-2.17.so)
                     413b2 make_child (/usr/bin/bash)

    bash 18389 [002] 83447.227255: perf_bpf_probe:fork: (ffffffff8109be30)
                    29be31 _do_fork (/lib/modules/4.3.0-rc6+/build/vmlinux)
                    96d662 tracesys_phase2 (/lib/modules/4.3.0-rc6+/build/vmlinux)
                     bd56c __libc_fork (/usr/lib64/libc-2.17.so)
                     413b2 make_child (/usr/bin/bash)

    # perf evlist -v
    perf_bpf_probe:fork: type: 2, size: 112, config: 0x6cf, { sample_period, sample_freq }: 1, sample_type: IP|TID|TIME|CALLCHAIN|CPU|PERIOD|RAW, disabled: 1, inherit: 1, mmap: 1, comm: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1
    #

  More work is about to be reviewed, tested and merged that will allow the whole
  process of going from a .c file to an .o file via clang, etc to be done
  automagically. (Wang Nan)"

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Ingo Molnar 2015-10-29 13:17:56 +01:00
commit 66a565c203
13 changed files with 619 additions and 7 deletions