Re: [PATCH 2/3] perf build: Use libtraceevent from the system

Athira Rajeev
2022-12-08T06:52:00Z

> On 07-Dec-2022, at 10:57 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>
> Em Wed, Dec 07, 2022 at 07:08:28PM +0530, Athira Rajeev escreveu:
>>
>>
>>> On 06-Dec-2022, at 11:01 PM, Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>>>
>>> Em Tue, Dec 06, 2022 at 02:13:48PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>> Em Tue, Dec 06, 2022 at 02:07:32PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>> Em Tue, Dec 06, 2022 at 02:01:43PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>>> Em Tue, Dec 06, 2022 at 01:41:41PM -0300, Arnaldo Carvalho de Melo escreveu:
>>>>>>> Now to look at the BUILD_BPF_SKEL=1 kaboom:
>>>>>>>
>>>>>>> [acme@quaco perf]$ alias m
>>>>>>> alias m='rm -rf ~/libexec/perf-core/ ; make -k NO_LIBTRACEEVENT=1 BUILD_BPF_SKEL=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python'
>>>>>>> [acme@quaco perf]$ m
>>>>>>> make: Entering directory '/home/acme/git/perf/tools/perf'
>>>>>>> BUILD: Doing 'make -j8' parallel build
>>>>>>> <SNIP>
>>>>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `add_work':
>>>>>>> /home/acme/git/perf/tools/perf/util/bpf_kwork.c:285: undefined reference to `perf_kwork_add_work'
>>>>>>> /usr/bin/ld: /tmp/build/perf/perf-in.o: in function `lock_contention_read':
>>>>>
>>>>> For that bpf_kwork.c see below. Now to see why the python binding is not
>>>>> building, I guess is unrelated and you have some other outstanding
>>>>> patch?
>>>>
>>>> Its related:
>>>>
>>>> [acme@quaco perf]$ perf test -v python
>>>> Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
>>>> 14: 'import perf' in python :
>>>> --- start ---
>>>> test child forked, pid 1669872
>>>> python usage test: "echo "import sys ; sys.path.append('/tmp/build/perf/python'); import perf" | '/usr/bin/python3' "
>>>> Traceback (most recent call last):
>>>> File "<stdin>", line 1, in <module>
>>>> ImportError: /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so: undefined symbol: tep_unload_plugins
>>>> test child finished with -1
>>>> ---- end ----
>>>> 'import perf' in python: FAILED!
>>>> [acme@quaco perf]$
>>>>
>>>> Now checking why NO_LIBTRACEEVENT=1 fails with this...
>>>>
>>>> [acme@quaco perf]$ find tools/perf/ -name "*.c" | xargs grep tep_unload_plugins
>>>> tools/perf/util/trace-event.c: tep_unload_plugins(t->plugin_list, t->pevent);
>>>> [acme@quaco perf]$
>>>>
>>>> [acme@quaco perf]$ grep trace-event tools/perf/util/python-ext-sources
>>>> util/trace-event.c
>>>> [acme@quaco perf]$
>>>>
>>>> Trying to fix...
>>>
>>> I'm missing some detail, this isn't working, util/trace-event.c is still
>>> being built and linked.
>>
>> Hi,
>>
>> Observed similar issue with “builtin-trace.c”
>>
>> In system without libtraceevent-devel, I could still see builtin-trace trying to get
>> compiled and hitting error. In my understanding, CONFIG_TRACE will be
>> disabled when libtraceevent is not present and hence builtin-trace should be disabled
>> which I am not seeing.
>>
>> # rpm -qa|grep libtraceevent
>> libtraceevent-1.2.1-1.el8.ppc64le
>>
>> # grep -i traceevent FEATURE-DUMP
>> feature-libtraceevent=0
>>
>> Snippet from make logs:
>>
>> builtin-trace.c:266:50: error: dereferencing pointer to incomplete type 'struct tep_format_field'
>> return __tp_field__init_uint(field, format_field->size, format_field->offset, needs_swap);
>> ^~
>> builtin-trace.c: In function 'evsel__syscall_arg_fmt':
>> builtin-trace.c:361:25: error: 'struct evsel' has no member named 'tp_format'
>> et->fmt = calloc(evsel->tp_format->format.nr_fields, sizeof(struct syscall_arg_fmt));
>>
>
> Can you try again? tmp.perf/core? That "tmp." part means its a force
> pushed branch, so I just force pushed with some arch specific fixes, now
> I'm down to (removing the successful builds and unrelated failures, now
> related to libbpf's F_DUPFD_CLOEXEC kaboom):

Ok Arnaldo, Sure, I will check with updated branch

>
> 5 7.38 fedora:34 : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> 2787 | if (field->flags & TEP_FIELD_IS_RELATIVE)
> | ^~~~~~~~~~~~~~~~~~~~~
> | TEP_FIELD_IS_FLAG

I observed same issue as updated here:
https://lore.kernel.org/lkml/10476A85-3F75-4C91-AB5B-E5B136F31297@linux.vnet.ibm.com/

Looks like TEP_FIELD_IS_RELATIVE is not defined in header file of the system installed version.
whereas it is there in header file in tools/lib/traceevent

# grep TEP_FIELD_IS_RELATIVE /usr/include/traceevent/event-parse.h
# grep TEP_FIELD_IS_RELATIVE ../lib/traceevent/event-parse.h
TEP_FIELD_IS_RELATIVE = 256,

Thanks
Athira
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
> error: command '/usr/bin/gcc' failed with exit code 1
>
> 7 7.18 fedora:35 : FAIL gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> 2787 | if (field->flags & TEP_FIELD_IS_RELATIVE)
> | ^~~~~~~~~~~~~~~~~~~~~
> | TEP_FIELD_IS_FLAG
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
> error: command '/usr/bin/gcc' failed with exit code 1
>
> 14 8.49 ubuntu:18.04-x-s390 : FAIL gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
> tests/parse-events.c:1893:12: error: 'test__checkevent_tracepoint' undeclared here (not in a function); did you mean 'test__checkevent_breakpoint'?
> .check = test__checkevent_tracepoint,
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> test__checkevent_breakpoint
> /git/perf-6.1.0-rc6/tools/build/Makefile.build:139: recipe for target 'tests' failed
> make[3]: *** [tests] Error 2
> 16 6.38 ubuntu:22.04 : FAIL gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c: In function ‘evsel__rawptr’:
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: error: ‘TEP_FIELD_IS_RELATIVE’ undeclared (first use in this function); did you mean ‘TEP_FIELD_IS_FLAG’?
> 2787 | if (field->flags & TEP_FIELD_IS_RELATIVE)
> | ^~~~~~~~~~~~~~~~~~~~~
> | TEP_FIELD_IS_FLAG
> /git/perf-6.1.0-rc6/tools/perf/util/evsel.c:2787:36: note: each undeclared identifier is reported only once for each function it appears in
> error: command '/usr/bin/gcc' failed with exit code 1
>
>
>
>> Thanks
>> Athira
>>
>>>
>>> The python binding should be usable without tracepoints, in fact its
>>> first usage was just to have access to the perf metaevents, see
>>> tools/perf/python/twatch.py.
>>>
>>> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
>>> index f0e4daeef8120853..5bd67d54d036f281 100644
>>> --- a/tools/perf/Makefile.perf
>>> +++ b/tools/perf/Makefile.perf
>>> @@ -348,6 +348,10 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
>>> python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
>>>
>>> PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
>>> +ifneq ($(CONFIG_TRACEEVENT),y)
>>> + PYTHON_EXT_SRCS := $(call filter-out,$(PYTHON_EXT_SRCS),util/trace-event.c)
>>> +endif
>>> +
>>> PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
>>>
>>> SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
>>> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
>>> index 728fe2f51759eb0d..72088aec2857b316 100644
>>> --- a/tools/perf/util/python.c
>>> +++ b/tools/perf/util/python.c
>>> @@ -1330,6 +1330,9 @@ static struct {
>>> static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>>> PyObject *args, PyObject *kwargs)
>>> {
>>> +#ifndef HAVE_LIBTRACEEVENT
>>> + return NULL;
>>> +#else
>>> struct tep_event *tp_format;
>>> static char *kwlist[] = { "sys", "name", NULL };
>>> char *sys = NULL;
>>> @@ -1344,6 +1347,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>>> return _PyLong_FromLong(-1);
>>>
>>> return _PyLong_FromLong(tp_format->id);
>>> +#endif // HAVE_LIBTRACEEVENT
>>> }
>>>
>>> static PyMethodDef perf__methods[] = {
>
> --
>
> - Arnaldo