• Ian Rogers's avatar
    perf build: Use libtraceevent from the system · 378ef0f5
    Ian Rogers authored
    Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC make command
    line variables.
    
    If libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the
    build, don't compile in libtraceevent and libtracefs support.
    
    This also disables CONFIG_TRACE that controls "perf trace".
    
    CONFIG_LIBTRACEEVENT is used to control enablement in Build/Makefiles,
    HAVE_LIBTRACEEVENT is used in C code.
    
    Without HAVE_LIBTRACEEVENT tracepoints are disabled and as such the
    commands kmem, kwork, lock, sched and timechart are removed.  The
    majority of commands continue to work including "perf test".
    
    Committer notes:
    
    Fixed up a tools/perf/util/Build reject and added:
    
      #include <traceevent/event-parse.h>
    
    to tools/perf/util/scripting-engines/trace-event-perl.c.
    
    Committer testing:
    
      $ rpm -qi libtraceevent-devel
      Name        : libtraceevent-devel
      Version     : 1.5.3
      Release     : 2.fc36
      Architecture: x86_64
      Install Date: Mon 25 Jul 2022 03:20:19 PM -03
      Group       : Unspecified
      Size        : 27728
      License     : LGPLv2+ and GPLv2+
      Signature   : RSA/SHA256, Fri 15 Apr 2022 02:11:58 PM -03, Key ID 999f7cbf38ab71f4
      Source RPM  : libtraceevent-1.5.3-2.fc36.src.rpm
      Build Date  : Fri 15 Apr 2022 10:57:01 AM -03
      Build Host  : buildvm-x86-05.iad2.fedoraproject.org
      Packager    : Fedora Project
      Vendor      : Fedora Project
      URL         : https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/
      Bug URL     : https://bugz.fedoraproject.org/libtraceevent
      Summary     : Development headers of libtraceevent
      Description :
      Development headers of libtraceevent-libs
      $
    
    Default build:
    
      $ ldd ~/bin/perf | grep tracee
      	libtraceevent.so.1 => /lib64/libtraceevent.so.1 (0x00007f1dcaf8f000)
      $
    
      # perf trace -e sched:* --max-events 10
           0.000 migration/0/17 sched:sched_migrate_task(comm: "", pid: 1603763 (perf), prio: 120, dest_cpu: 1)
           0.005 migration/0/17 sched:sched_wake_idle_without_ipi(cpu: 1)
           0.011 migration/0/17 sched:sched_switch(prev_comm: "", prev_pid: 17 (migration/0), prev_state: 1, next_comm: "", next_prio: 120)
           1.173 :0/0 sched:sched_wakeup(comm: "", pid: 3138 (gnome-terminal-), prio: 120)
           1.180 :0/0 sched:sched_switch(prev_comm: "", prev_prio: 120, next_comm: "", next_pid: 3138 (gnome-terminal-), next_prio: 120)
           0.156 migration/1/21 sched:sched_migrate_task(comm: "", pid: 1603763 (perf), prio: 120, orig_cpu: 1, dest_cpu: 2)
           0.160 migration/1/21 sched:sched_wake_idle_without_ipi(cpu: 2)
           0.166 migration/1/21 sched:sched_switch(prev_comm: "", prev_pid: 21 (migration/1), prev_state: 1, next_comm: "", next_prio: 120)
           1.183 :0/0 sched:sched_wakeup(comm: "", pid: 1602985 (kworker/u16:0-f), prio: 120, target_cpu: 1)
           1.186 :0/0 sched:sched_switch(prev_comm: "", prev_prio: 120, next_comm: "", next_pid: 1602985 (kworker/u16:0-f), next_prio: 120)
      #
    
    Had to tweak tools/perf/util/setup.py to make sure the python binding
    shared object links with libtraceevent if -DHAVE_LIBTRACEEVENT is
    present in CFLAGS.
    
    Building with NO_LIBTRACEEVENT=1 uncovered some more build failures:
    
    - Make building of data-convert-bt.c to CONFIG_LIBTRACEEVENT=y
    
    - perf-$(CONFIG_LIBTRACEEVENT) += scripts/
    
    - bpf_kwork.o needs also to be dependent on CONFIG_LIBTRACEEVENT=y
    
    - The python binding needed some fixups and util/trace-event.c can't be
      built and linked with the python binding shared object, so remove it
      in tools/perf/util/setup.py and exclude it from the list of
      dependencies in the python/perf.so Makefile.perf target.
    
    Building without libtraceevent-devel installed uncovered more build
    failures:
    
    - The python binding tools/perf/util/python.c was assuming that
      traceevent/parse-events.h was always available, which was the case
      when we defaulted to using the in-kernel tools/lib/traceevent/ files,
      now we need to enclose it under ifdef HAVE_LIBTRACEEVENT, just like
      the other parts of it that deal with tracepoints.
    
    - We have to ifdef the rules in the Build files with
      CONFIG_LIBTRACEEVENT=y to build builtin-trace.c and
      tools/perf/trace/beauty/ as we only ifdef setting CONFIG_TRACE=y when
      setting NO_LIBTRACEEVENT=1 in the make command line, not when we don't
      detect libtraceevent-devel installed in the system. Simplification here
      to avoid these two ways of disabling builtin-trace.c and not having
      CONFIG_TRACE=y when libtraceevent-devel isn't installed is the clean
      way.
    
    From Athira:
    
    <quote>
    tools/perf/arch/powerpc/util/Build
    -perf-y += kvm-stat.o
    +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
    </quote>
    
    Then, ditto for arm64 and s390, detected by container cross build tests.
    
    - s/390 uses test__checkevent_tracepoint() that is now only available if
      HAVE_LIBTRACEEVENT is defined, enclose the callsite with ifder HAVE_LIBTRACEEVENT.
    
    Also from Athira:
    
    <quote>
    With this change, I could successfully compile in these environment:
    - Without libtraceevent-devel installed
    - With libtraceevent-devel installed
    - With “make NO_LIBTRACEEVENT=1”
    </quote>
    
    Then, finally rename CONFIG_TRACEEVENT to CONFIG_LIBTRACEEVENT for
    consistency with other libraries detected in tools/perf/.
    Signed-off-by: default avatarIan Rogers <irogers@google.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Tested-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: bpf@vger.kernel.org
    Link: http://lore.kernel.org/lkml/20221205225940.3079667-3-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    378ef0f5
perf.c 13.3 KB