31 Jan, 2019

2 commits

  • [ Upstream commit 1fe627da30331024f453faef04d500079b901107 ]

    libdwfl parses an ELF file itself and creates mappings for the
    individual sections. perf on the other hand sees raw mmap events which
    represent individual sections. When we encounter an address pointing
    into a mapping with pgoff != 0, we must take that into account and
    report the file at the non-offset base address.

    This fixes unwinding with libdwfl in some cases. E.g. for a file like:

    ```

    using namespace std;

    mutex g_mutex;

    double worker()
    {
    lock_guard guard(g_mutex);
    uniform_real_distribution uniform(-1E5, 1E5);
    default_random_engine engine;
    double s = 0;
    for (int i = 0; i < 1000; ++i) {
    s += norm(complex(uniform(engine), uniform(engine)));
    }
    cout << s << endl;
    return s;
    }

    int main()
    {
    vector> results;
    for (int i = 0; i < 10000; ++i) {
    results.push_back(async(launch::async, worker));
    }
    return 0;
    }
    ```

    Compile it with `g++ -g -O2 -lpthread cpp-locking.cpp -o cpp-locking`,
    then record it with `perf record --call-graph dwarf -e
    sched:sched_switch`.

    When you analyze it with `perf script` and libunwind, you should see:

    ```
    cpp-locking 20038 [005] 54830.236589: sched:sched_switch: prev_comm=cpp-locking prev_pid=20038 prev_prio=120 prev_state=T ==> next_comm=swapper/5 next_pid=0 next_prio=120
    ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1670208 schedule+0x28 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb16737cc rwsem_down_read_failed+0xec (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1665e04 call_rwsem_down_read_failed+0x14 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1672a03 down_read+0x13 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb106bd85 __do_page_fault+0x445 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb18015f5 page_fault+0x45 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    7f38e4252591 new_heap+0x101 (/usr/lib/libc-2.28.so)
    7f38e4252d0b arena_get2.part.4+0x2fb (/usr/lib/libc-2.28.so)
    7f38e4255b1c tcache_init.part.6+0xec (/usr/lib/libc-2.28.so)
    7f38e42569e5 __GI___libc_malloc+0x115 (inlined)
    7f38e4241790 __GI__IO_file_doallocate+0x90 (inlined)
    7f38e424fbbf __GI__IO_doallocbuf+0x4f (inlined)
    7f38e424ee47 __GI__IO_file_overflow+0x197 (inlined)
    7f38e424df36 _IO_new_file_xsputn+0x116 (inlined)
    7f38e4242bfb __GI__IO_fwrite+0xdb (inlined)
    7f38e463fa6d std::basic_streambuf >::sputn(char const*, long)+0x1cd (inlined)
    7f38e463fa6d std::ostreambuf_iterator >::_M_put(char const*, long)+0x1cd (inlined)
    7f38e463fa6d std::ostreambuf_iterator > std::__write(std::ostreambuf_iterator >, char const*, int)+0x1cd (inlined)
    7f38e463fa6d std::ostreambuf_iterator > std::num_put > >::_M_insert_float(std::ostreambuf_iterator
    7f38e464bd70 std::num_put > >::put(std::ostreambuf_iterator >, std::ios_base&, char, double) const+0x90 (inl>
    7f38e464bd70 std::ostream& std::ostream::_M_insert(double)+0x90 (/usr/lib/libstdc++.so.6.0.25)
    563b9cb502f7 std::ostream::operator<(std::__invoke_other, double (*&&)())+0x2b (inlined)
    563b9cb506fb std::__invoke_result::type std::__invoke(double (*&&)())+0x2b (inlined)
    563b9cb506fb decltype (__invoke((_S_declval)())) std::thread::_Invoker >::_M_invoke(std::_Index_tuple)+0x2b (inlined)
    563b9cb506fb std::thread::_Invoker >::operator()()+0x2b (inlined)
    563b9cb506fb std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker >, dou>
    563b9cb506fb std::_Function_handler (), std::__future_base::_Task_setter
    563b9cb507e8 std::function ()>::operator()() const+0x28 (inlined)
    563b9cb507e8 std::__future_base::_State_baseV2::_M_do_set(std::function ()>*, bool*)+0x28 (/ssd/milian/>
    7f38e46d24fe __pthread_once_slow+0xbe (/usr/lib/libpthread-2.28.so)
    563b9cb51149 __gthread_once+0xe9 (inlined)
    563b9cb51149 void std::call_once ()>*, bool*)>
    563b9cb51149 std::__future_base::_State_baseV2::_M_set_result(std::function ()>, bool)+0xe9 (inlined)
    563b9cb51149 std::__future_base::_Async_state_impl >, double>::_Async_state_impl(std::thread::_Invoker >&&)::{lambda()#1}::op>
    563b9cb51149 void std::__invoke_impl >, double>::_Async_state_impl(std::thread::_Invoker
    563b9cb51149 std::__invoke_result >, double>::_Async_state_impl(std::thread::_Invoker >>
    563b9cb51149 decltype (__invoke((_S_declval)())) std::thread::_Invoker >, double>::_Async_state_>
    563b9cb51149 std::thread::_Invoker >, double>::_Async_state_impl(std::thread::_Invoker
    563b9cb51149 std::thread::_State_impl >, double>::_Async_state_impl(std::thread>
    7f38e45f0062 execute_native_thread_routine+0x12 (/usr/lib/libstdc++.so.6.0.25)
    7f38e46caa9c start_thread+0xfc (/usr/lib/libpthread-2.28.so)
    7f38e42ccb22 __GI___clone+0x42 (inlined)
    ```

    Before this patch, using libdwfl, you would see:

    ```
    cpp-locking 20038 [005] 54830.236589: sched:sched_switch: prev_comm=cpp-locking prev_pid=20038 prev_prio=120 prev_state=T ==> next_comm=swapper/5 next_pid=0 next_prio=120
    ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1670208 schedule+0x28 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb16737cc rwsem_down_read_failed+0xec (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1665e04 call_rwsem_down_read_failed+0x14 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1672a03 down_read+0x13 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb106bd85 __do_page_fault+0x445 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb18015f5 page_fault+0x45 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    7f38e4252591 new_heap+0x101 (/usr/lib/libc-2.28.so)
    a041161e77950c5c [unknown] ([unknown])
    ```

    With this patch applied, we get a bit further in unwinding:

    ```
    cpp-locking 20038 [005] 54830.236589: sched:sched_switch: prev_comm=cpp-locking prev_pid=20038 prev_prio=120 prev_state=T ==> next_comm=swapper/5 next_pid=0 next_prio=120
    ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1670208 schedule+0x28 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb16737cc rwsem_down_read_failed+0xec (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1665e04 call_rwsem_down_read_failed+0x14 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb1672a03 down_read+0x13 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb106bd85 __do_page_fault+0x445 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    ffffffffb18015f5 page_fault+0x45 (/lib/modules/4.14.78-1-lts/build/vmlinux)
    7f38e4252591 new_heap+0x101 (/usr/lib/libc-2.28.so)
    7f38e4252d0b arena_get2.part.4+0x2fb (/usr/lib/libc-2.28.so)
    7f38e4255b1c tcache_init.part.6+0xec (/usr/lib/libc-2.28.so)
    7f38e42569e5 __GI___libc_malloc+0x115 (inlined)
    7f38e4241790 __GI__IO_file_doallocate+0x90 (inlined)
    7f38e424fbbf __GI__IO_doallocbuf+0x4f (inlined)
    7f38e424ee47 __GI__IO_file_overflow+0x197 (inlined)
    7f38e424df36 _IO_new_file_xsputn+0x116 (inlined)
    7f38e4242bfb __GI__IO_fwrite+0xdb (inlined)
    7f38e463fa6d std::basic_streambuf >::sputn(char const*, long)+0x1cd (inlined)
    7f38e463fa6d std::ostreambuf_iterator >::_M_put(char const*, long)+0x1cd (inlined)
    7f38e463fa6d std::ostreambuf_iterator > std::__write(std::ostreambuf_iterator >, char const*, int)+0x1cd (inlined)
    7f38e463fa6d std::ostreambuf_iterator > std::num_put > >::_M_insert_float(std::ostreambuf_iterator
    7f38e464bd70 std::num_put > >::put(std::ostreambuf_iterator >, std::ios_base&, char, double) const+0x90 (inl>
    7f38e464bd70 std::ostream& std::ostream::_M_insert(double)+0x90 (/usr/lib/libstdc++.so.6.0.25)
    563b9cb502f7 std::ostream::operator<
    Acked-by: Jiri Olsa
    Link: http://lkml.kernel.org/r/20181029141644.3907-1-milian.wolff@kdab.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Milian Wolff
     
  • [ Upstream commit 3d20c6246690219881786de10d2dda93f616d0ac ]

    Path passed to libdw for unwinding doesn't include symfs path
    if specified, so unwinding fails because ELF file is not found.

    Similar to unwinding with libunwind, pass symsrc_filename instead
    of long_name. If there is no symsrc_filename, fallback to long_name.

    Signed-off-by: Martin Vuille
    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Wang Nan
    Link: http://lkml.kernel.org/r/20180211212420.18388-1-jpmv27@aim.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Martin Vuille
     

26 Jan, 2019

3 commits

  • [ Upstream commit bd8d57fb7e25e9fcf67a9eef5fa13aabe2016e07 ]

    The strncpy() function may leave the destination string buffer
    unterminated, better use strlcpy() that we have a __weak fallback
    implementation for systems without it.

    This fixes this warning on an Alpine Linux Edge system with gcc 8.2:

    util/parse-events.c: In function 'print_symbol_events':
    util/parse-events.c:2465:4: error: 'strncpy' specified bound 100 equals destination size [-Werror=stringop-truncation]
    strncpy(name, syms->symbol, MAX_NAME_LEN);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In function 'print_symbol_events.constprop',
    inlined from 'print_events' at util/parse-events.c:2508:2:
    util/parse-events.c:2465:4: error: 'strncpy' specified bound 100 equals destination size [-Werror=stringop-truncation]
    strncpy(name, syms->symbol, MAX_NAME_LEN);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In function 'print_symbol_events.constprop',
    inlined from 'print_events' at util/parse-events.c:2511:2:
    util/parse-events.c:2465:4: error: 'strncpy' specified bound 100 equals destination size [-Werror=stringop-truncation]
    strncpy(name, syms->symbol, MAX_NAME_LEN);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    cc1: all warnings being treated as errors

    Cc: Adrian Hunter
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Fixes: 947b4ad1d198 ("perf list: Fix max event string size")
    Link: https://lkml.kernel.org/n/tip-b663e33bm6x8hrkie4uxh7u2@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Arnaldo Carvalho de Melo
     
  • [ Upstream commit 2f5302533f306d5ee87bd375aef9ca35b91762cb ]

    The strncpy() function may leave the destination string buffer
    unterminated, better use strlcpy() that we have a __weak fallback
    implementation for systems without it.

    In this specific case this would only happen if fgets() was buggy, as
    its man page states that it should read one less byte than the size of
    the destination buffer, so that it can put the nul byte at the end of
    it, so it would never copy 255 non-nul chars, as fgets reads into the
    orig buffer at most 254 non-nul chars and terminates it. But lets just
    switch to strlcpy to keep the original intent and silence the gcc 8.2
    warning.

    This fixes this warning on an Alpine Linux Edge system with gcc 8.2:

    In function 'cpu_model',
    inlined from 'svg_cpu_box' at util/svghelper.c:378:2:
    util/svghelper.c:337:5: error: 'strncpy' output may be truncated copying 255 bytes from a string of length 255 [-Werror=stringop-truncation]
    strncpy(cpu_m, &buf[13], 255);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Cc: Adrian Hunter
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Arjan van de Ven
    Fixes: f48d55ce7871 ("perf: Add a SVG helper library file")
    Link: https://lkml.kernel.org/n/tip-xzkoo0gyr56gej39ltivuh9g@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Arnaldo Carvalho de Melo
     
  • [ Upstream commit 1c6f709b9f96366cc47af23c05ecec9b8c0c392d ]

    Users should never use 'pt=0', but if they do it may give a meaningless
    error:

    $ perf record -e intel_pt/pt=0/u uname
    Error:
    The sys_perf_event_open() syscall returned with 22 (Invalid argument) for
    event (intel_pt/pt=0/u).

    Fix that by forcing 'pt=1'.

    Committer testing:

    # perf record -e intel_pt/pt=0/u uname
    Error:
    The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (intel_pt/pt=0/u).
    /bin/dmesg | grep -i perf may provide additional information.

    # perf record -e intel_pt/pt=0/u uname
    pt=0 doesn't make sense, forcing pt=1
    Linux
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.020 MB perf.data ]
    #

    Signed-off-by: Adrian Hunter
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Jiri Olsa
    Link: http://lkml.kernel.org/r/b7c5b4e5-9497-10e5-fd43-5f3e4a0fe51d@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Adrian Hunter
     

13 Jan, 2019

1 commit

  • commit 7ed1c1901fe52e6c5828deb155920b44b0adabb1 upstream.

    Currently a number of Makefiles break when used with toolchains that
    pass extra flags in CC and other cross-compile related variables (such
    as --sysroot).

    Thus we get this error when we use a toolchain that puts --sysroot in
    the CC var:

    ~/src/linux/tools$ make iio
    [snip]
    iio_event_monitor.c:18:10: fatal error: unistd.h: No such file or directory
    #include
    ^~~~~~~~~~

    This occurs because we clobber several env vars related to
    cross-compiling with lines like this:

    CC = $(CROSS_COMPILE)gcc

    Although this will point to a valid cross-compiler, we lose any extra
    flags that might exist in the CC variable, which can break toolchains
    that rely on them (for example, those that use --sysroot).

    This easily shows up using a Yocto SDK:

    $ . [snip]/sdk/environment-setup-cortexa8hf-neon-poky-linux-gnueabi

    $ echo $CC
    arm-poky-linux-gnueabi-gcc -march=armv7-a -mfpu=neon -mfloat-abi=hard
    -mcpu=cortex-a8
    --sysroot=[snip]/sdk/sysroots/cortexa8hf-neon-poky-linux-gnueabi

    $ echo $CROSS_COMPILE
    arm-poky-linux-gnueabi-

    $ echo ${CROSS_COMPILE}gcc
    krm-poky-linux-gnueabi-gcc

    Although arm-poky-linux-gnueabi-gcc is a cross-compiler, we've lost the
    --sysroot and other flags that enable us to find the right libraries to
    link against, so we can't find unistd.h and other libraries and headers.
    Normally with the --sysroot flag we would find unistd.h in the sdk
    directory in the sysroot:

    $ find [snip]/sdk/sysroots -path '*/usr/include/unistd.h'
    [snip]/sdk/sysroots/cortexa8hf-neon-poky-linux-gnueabi/usr/include/unistd.h

    The perf Makefile adds CC = $(CROSS_COMPILE)gcc if and only if CC is not
    already set, and it compiles correctly with the above toolchain.

    So, generalize the logic that perf uses in the common Makefile and
    remove the manual CC = $(CROSS_COMPILE)gcc lines from each Makefile.

    Note that this patch does not fix cross-compile for all the tools (some
    have other bugs), but it does fix it for all except usb and acpi, which
    still have other unrelated issues.

    I tested both with and without the patch on native and cross-build and
    there appear to be no regressions.

    Link: http://lkml.kernel.org/r/20180107214028.23771-1-martin@martingkelly.com
    Signed-off-by: Martin Kelly
    Acked-by: Mark Brown
    Cc: Tejun Heo
    Cc: Li Zefan
    Cc: Johannes Weiner
    Cc: Linus Walleij
    Cc: "K. Y. Srinivasan"
    Cc: Haiyang Zhang
    Cc: Stephen Hemminger
    Cc: Jonathan Cameron
    Cc: Pali Rohar
    Cc: Richard Purdie
    Cc: Jacek Anaszewski
    Cc: Pavel Machek
    Cc: Peter Zijlstra
    Cc: Ingo Molnar
    Cc: Arnaldo Carvalho de Melo
    Cc: Robert Moore
    Cc: Lv Zheng
    Cc: "Rafael J. Wysocki"
    Cc: Greg Kroah-Hartman
    Cc: Valentina Manea
    Cc: Shuah Khan
    Cc: Mario Limonciello
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Cc: Ignat Korchagin
    Signed-off-by: Greg Kroah-Hartman

    Martin Kelly
     

10 Jan, 2019

1 commit

  • commit 11a64a05dc649815670b1be9fe63d205cb076401 upstream.

    Depending on which functions are inlined in util/pmu.c, the snprintf()
    calls in perf_pmu__parse_{scale,unit,per_pkg,snapshot}() might trigger a
    warning:

    util/pmu.c: In function 'pmu_aliases':
    util/pmu.c:178:31: error: '%s' directive output may be truncated writing up to 255 bytes into a region of size between 0 and 4095 [-Werror=format-truncation=]
    snprintf(path, PATH_MAX, "%s/%s.unit", dir, name);
    ^~

    I found this when trying to build perf from Linux 3.16 with gcc 8.
    However I can reproduce the problem in mainline if I force
    __perf_pmu__new_alias() to be inlined.

    Suppress this by using scnprintf() as has been done elsewhere in perf.

    Signed-off-by: Ben Hutchings
    Cc: Alexander Shishkin
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20181111184524.fux4taownc6ndbx6@decadent.org.uk
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Greg Kroah-Hartman

    Ben Hutchings
     

29 Dec, 2018

1 commit

  • [ Upstream commit a2015516c5c0be932a69e1d3405c2fb03b4eacf1 ]

    We need to synthesize events first, because some features works on top
    of them (on report side).

    Signed-off-by: Jiri Olsa
    Tested-by: Stephane Eranian
    Cc: Alexander Shishkin
    Cc: David Ahern
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20180314092205.23291-1-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Jiri Olsa
     

17 Dec, 2018

1 commit

  • [ Upstream commit b01c1f69c8660eaeab7d365cd570103c5c073a02 ]

    When reporting on 'record' server we try to retrieve/use the mnt
    namespace of the profiled tasks. We use following API with cookie to
    hold the return namespace, roughly:

    nsinfo__mountns_enter(struct nsinfo *nsi, struct nscookie *nc)
    setns(newns, 0);
    ...
    new ns related open..
    ...
    nsinfo__mountns_exit(struct nscookie *nc)
    setns(nc->oldns)

    Once finished we setns to old namespace, which also sets the current
    working directory (cwd) to "/", trashing the cwd we had.

    This is mostly fine, because we use absolute paths almost everywhere,
    but it screws up 'perf diff':

    # perf diff
    failed to open perf.data: No such file or directory (try 'perf record' first)
    ...

    Adding the current working directory to be part of the cookie and
    restoring it in the nsinfo__mountns_exit call.

    Signed-off-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: Krister Johansen
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Fixes: 843ff37bb59e ("perf symbols: Find symbols in different mount namespace")
    Link: http://lkml.kernel.org/r/20181101170001.30019-1-jolsa@kernel.org
    [ No need to check for NULL args for free(), use zfree() for struct members ]
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Jiri Olsa
     

27 Nov, 2018

7 commits

  • commit f6c66d73bb8192d357bb5fb8cd5826920f811d8c upstream.

    The "Object code reading" test will not create maps for the PTI entry
    trampolines unless the machine environment exists to show that the arch is
    x86_64.

    Signed-off-by: Adrian Hunter
    Reported-by: Arnaldo Carvalho de Melo
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Jiri Olsa
    Link: http://lkml.kernel.org/r/1528183800-21577-1-git-send-email-adrian.hunter@intel.com
    [ split from a larger patch ]
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Adrian Hunter
     
  • commit 4d99e4136580d178e3523281a820be17bf814bf8 upstream.

    On x86_64 the PTI entry trampolines are not in the kernel map created by
    perf tools. That results in the addresses having no symbols and prevents
    annotation. It also causes Intel PT to have decoding errors at the
    trampoline addresses.

    Workaround that by creating maps for the trampolines.

    At present the kernel does not export information revealing where the
    trampolines are. Until that happens, the addresses are hardcoded.

    Signed-off-by: Adrian Hunter
    Cc: Alexander Shishkin
    Cc: Andi Kleen
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: H. Peter Anvin
    Cc: Jiri Olsa
    Cc: Joerg Roedel
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: x86@kernel.org
    Link: http://lkml.kernel.org/r/1526986485-6562-6-git-send-email-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Adrian Hunter
     
  • commit 9cecca325ea879c84fcd31a5e609a514c1a1dbd1 upstream.

    Add a function to return the number of the machine's available CPUs.

    Signed-off-by: Adrian Hunter
    Cc: Alexander Shishkin
    Cc: Andi Kleen
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: H. Peter Anvin
    Cc: Jiri Olsa
    Cc: Joerg Roedel
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: x86@kernel.org
    Link: http://lkml.kernel.org/r/1526986485-6562-5-git-send-email-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Adrian Hunter
     
  • commit 19422a9f2a3be7f3a046285ffae4cbb571aa853a upstream.

    On x86_64, PTI entry trampolines are less than the start of kernel text,
    but still above 2^63. So leave kernel_start = 1ULL << 63 for x86_64.

    Signed-off-by: Adrian Hunter
    Tested-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: Andi Kleen
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: H. Peter Anvin
    Cc: Joerg Roedel
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: x86@kernel.org
    Link: http://lkml.kernel.org/r/1526548928-20790-7-git-send-email-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Adrian Hunter
     
  • commit dbbd34a666ee117d0e39e71a47f38f02c4a5c698 upstream.

    Add a function to identify the machine architecture.

    Signed-off-by: Adrian Hunter
    Tested-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: Andi Kleen
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: H. Peter Anvin
    Cc: Joerg Roedel
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: x86@kernel.org
    Link: http://lkml.kernel.org/r/1526548928-20790-6-git-send-email-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Adrian Hunter
     
  • [ Upstream commit 6ac2226229d931153331a93d90655a3de05b9290 ]

    Currently jvmti agent can not be used because function scnprintf is not
    present in the agent libperf-jvmti.so. As a result the JVM when using
    such agent to record JITed code profiling information will fail on
    looking up scnprintf:

    java: symbol lookup error: lib/libperf-jvmti.so: undefined symbol: scnprintf

    This commit fixes that by reverting to the use of snprintf, that can be
    looked up, instead of scnprintf, adding a proper check for the returned
    value in order to print a better error message when the jitdump file
    pathname is too long. Checking the returned value also helps to comply
    with some recent gcc versions, like gcc8, which will fail due to
    truncated writing checks related to the -Werror=format-truncation= flag.

    Signed-off-by: Gustavo Romero
    Acked-by: Jiri Olsa
    LPU-Reference: 1541117601-18937-2-git-send-email-gromero@linux.vnet.ibm.com
    Link: https://lkml.kernel.org/n/tip-mvpxxxy7wnzaj74cq75muw3f@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Gustavo Romero
     
  • [ Upstream commit d6afa561e1471ccfdaf7191230c0c59a37e45a5b ]

    Using the sh_entsize for both values isn't correct. It happens to be
    correct on x86...

    For both 32-bit and 64-bit sparc, there are four PLT entries in the PLT
    section.

    Signed-off-by: David S. Miller
    Cc: Alexander Shishkin
    Cc: Alexis Berlemont
    Cc: David Tolnay
    Cc: Hanjun Guo
    Cc: Hemant Kumar
    Cc: Li Bin
    Cc: Masami Hiramatsu
    Cc: Milian Wolff
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Wang Nan
    Cc: zhangmengting@huawei.com
    Fixes: b2f7605076d6 ("perf symbols: Fix plt entry calculation for ARM and AARCH64")
    Link: http://lkml.kernel.org/r/20181017.120859.2268840244308635255.davem@davemloft.net
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    David Miller
     

14 Nov, 2018

7 commits

  • [ Upstream commit ce49d8436cffa9b7a6a5f110879d53e89dbc6746 ]

    Ensure that all code paths in strbuf_addv() call va_end() on the
    ap_saved copy that was made.

    Fixes the following coverity complaint:

    Error: VARARGS (CWE-237): [#def683]
    tools/perf/util/strbuf.c:106: missing_va_end: va_end was not called
    for "ap_saved".

    Signed-off-by: Sanskriti Sharma
    Reviewed-by: Jiri Olsa
    Cc: Joe Lawrence
    Link: http://lkml.kernel.org/r/1538490554-8161-2-git-send-email-sansharm@redhat.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sanskriti Sharma
     
  • [ Upstream commit faedbf3fd19f2511a39397f76359e4cc6ee93072 ]

    Free tracing_data structure in tracing_data_get() error paths.

    Fixes the following coverity complaint:

    Error: RESOURCE_LEAK (CWE-772):
    leaked_storage: Variable "tdata" going out of scope leaks the storage

    Signed-off-by: Sanskriti Sharma
    Reviewed-by: Jiri Olsa
    Cc: Joe Lawrence
    Link: http://lkml.kernel.org/r/1538490554-8161-3-git-send-email-sansharm@redhat.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sanskriti Sharma
     
  • [ Upstream commit 1e44224fb0528b4c0cc176bde2bb31e9127eb14b ]

    For each system in a given pevent, read_event_files() reads in a
    temporary 'sys' string. Be sure to free this string before moving onto
    to the next system and/or leaving read_event_files().

    Fixes the following coverity complaints:

    Error: RESOURCE_LEAK (CWE-772):

    tools/perf/util/trace-event-read.c:343: overwrite_var: Overwriting
    "sys" in "sys = read_string()" leaks the storage that "sys" points to.

    tools/perf/util/trace-event-read.c:353: leaked_storage: Variable "sys"
    going out of scope leaks the storage it points to.

    Signed-off-by: Sanskriti Sharma
    Reviewed-by: Jiri Olsa
    Cc: Joe Lawrence
    Link: http://lkml.kernel.org/r/1538490554-8161-6-git-send-email-sansharm@redhat.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sanskriti Sharma
     
  • [ Upstream commit 0ed149cf5239cc6e7e65bf00f769e8f1e91076c0 ]

    The size of the resulting cpu map can be smaller than a multiple of
    sizeof(u64), resulting in SIGBUS on cpus like Sparc as the next event
    will not be aligned properly.

    Signed-off-by: David S. Miller
    Cc: Jiri Olsa
    Cc: Kan Liang
    Fixes: 6c872901af07 ("perf cpu_map: Add cpu_map event synthesize function")
    Link: http://lkml.kernel.org/r/20181011.224655.716771175766946817.davem@davemloft.net
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    David Miller
     
  • [ Upstream commit 36b8d4628d3cc8f5a748e508cce8673bc00fc63c ]

    When a build is run from something like a cron job, the user's $PATH is
    rather minimal, of note, not including /usr/sbin in my own case. Because
    of that, an automated rpm package build ultimately fails to find
    libperf-jvmti.so, because somewhere within the build, this happens...

    /bin/sh: alternatives: command not found
    /bin/sh: alternatives: command not found
    Makefile.config:849: No openjdk development package found, please install
    JDK package, e.g. openjdk-8-jdk, java-1.8.0-openjdk-devel

    ...and while the build continues, libperf-jvmti.so isn't built, and
    things fall down when rpm tries to find all the %files specified. Exact
    same system builds everything just fine when the job is launched from a
    login shell instead of a cron job, since alternatives is in $PATH, so
    openjdk is actually found.

    The test required to get into this section of code actually specifies
    the full path, as does a block just above it, so let's do that here too.

    Signed-off-by: Jarod Wilson
    Acked-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Cc: William Cohen
    Fixes: d4dfdf00d43e ("perf jvmti: Plug compilation into perf build")
    Link: http://lkml.kernel.org/r/20180906221812.11167-1-jarod@redhat.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jarod Wilson
     
  • [ Upstream commit 94aafb74cee0002e2f2eb6dc5376f54d5951ab4d ]

    Michael reported that he could not stat following event:

    $ perf stat -e unc_p_freq_ge_1200mhz_cycles -a -- ls
    event syntax error: '..e_1200mhz_cycles'
    \___ value too big for format, maximum is 255
    Run 'perf list' for a list of valid events

    The event is unwrapped into:

    uncore_pcu/event=0xb,filter_band0=1200/

    where filter_band0 format says it's one byte only:

    # cat uncore_pcu/format/filter_band0
    config1:0-7

    while JSON files specifies bigger number:

    "Filter": "filter_band0=1200",

    all the filter_band* formats show 1 byte width:

    # cat uncore_pcu/format/filter_band1
    config1:8-15
    # cat uncore_pcu/format/filter_band2
    config1:16-23
    # cat uncore_pcu/format/filter_band3
    config1:24-31

    The reason of the issue is that filter_band* values are supposed to be
    in 100Mhz units.. it's stated in the JSON help for the events, like:

    filter_band3=XXX, with XXX in 100Mhz units

    This patch divides the filter_band* values by 100, plus there's couple
    of changes that actually change the number completely, like:

    - "Filter": "edge=1,filter_band2=4000",
    + "Filter": "edge=1,filter_band2=30",

    Reported-by: Michael Petlan
    Signed-off-by: Jiri Olsa
    Acked-by: Andi Kleen
    Cc: Alexander Shishkin
    Cc: Kan Liang
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20181010080339.GB15790@krava
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     
  • [ Upstream commit 1b9caa10b31dda0866f4028e4bfb923fb6e4072f ]

    This reverts commit ac0e2cd555373ae6f8f3a3ad3fbbf5b6d1e7aaaa.

    Michael reported an issue with oversized terms values assignment
    and I noticed there was actually a misunderstanding of the max
    value check in the past.

    The above commit's changelog says:

    If bit 21 is set, there is parsing issues as below.

    $ perf stat -a -e uncore_qpi_0/event=0x200002,umask=0x8/
    event syntax error: '..pi_0/event=0x200002,umask=0x8/'
    \___ value too big for format, maximum is 511

    But there's no issue there, because the event value is distributed
    along the value defined by the format. Even if the format defines
    separated bit, the value is treated as a continual number, which
    should follow the format definition.

    In above case it's 9-bit value with last bit separated:
    $ cat uncore_qpi_0/format/event
    config:0-7,21

    Hence the value 0x200002 is correctly reported as format violation,
    because it exceeds 9 bits. It should have been 0x102 instead, which
    sets the 9th bit - the bit 21 of the format.

    $ perf stat -vv -a -e uncore_qpi_0/event=0x102,umask=0x8/
    Using CPUID GenuineIntel-6-2D
    ...
    ------------------------------------------------------------
    perf_event_attr:
    type 10
    size 112
    config 0x200802
    sample_type IDENTIFIER
    ...

    Reported-by: Michael Petlan
    Signed-off-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: Andi Kleen
    Cc: Kan Liang
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Fixes: ac0e2cd55537 ("perf tools: Fix PMU term format max value calculation")
    Link: http://lkml.kernel.org/r/20181003072046.29276-1-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     

04 Nov, 2018

3 commits

  • [ Upstream commit da15fc2fa9c07b23db8f5e479bd8a9f0d741ca07 ]

    The Yocto build system does a 'make clean' when rebuilding due to
    changed dependencies, and that consistently fails for me (causing the
    whole BSP build to fail) with errors such as

    | find: '[...]/perf/1.0-r9/perf-1.0/plugin_mac80211.so': No such file or directory
    | find: '[...]/perf/1.0-r9/perf-1.0/plugin_mac80211.so': No such file or directory
    | find: find: '[...]/perf/1.0-r9/perf-1.0/libtraceevent.a''[...]/perf/1.0-r9/perf-1.0/libtraceevent.a': No such file or directory: No such file or directory
    |
    [...]
    | find: cannot delete '/mnt/xfs/devel/pil/yocto/tmp-glibc/work/wandboard-oe-linux-gnueabi/perf/1.0-r9/perf-1.0/util/.pstack.o.cmd': No such file or directory

    Apparently (despite the comment), 'make clean' ends up launching
    multiple sub-makes that all want to remove the same things - perhaps
    this only happens in combination with a O=... parameter. In any case, we
    don't lose much by explicitly disabling the parallelism for the clean
    target, and it makes automated builds much more reliable.

    Signed-off-by: Rasmus Villemoes
    Acked-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20180705131527.19749-1-linux@rasmusvillemoes.dk
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Rasmus Villemoes
     
  • [ Upstream commit 05a2f54679861deb188750ba2a70187000b2c71f ]

    When building in ClearLinux using 'make PYTHON=python3' with gcc 8.2.1
    it fails with:

    GEN /tmp/build/perf/python/perf.so
    In file included from /usr/include/python3.7m/Python.h:126,
    from /git/linux/tools/perf/util/python.c:2:
    /usr/include/python3.7m/import.h:58:24: error: redundant redeclaration of ‘_PyImport_AddModuleObject’ [-Werror=redundant-decls]
    PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *, PyObject *);
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/python3.7m/import.h:47:24: note: previous declaration of ‘_PyImport_AddModuleObject’ was here
    PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name,
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    cc1: all warnings being treated as errors
    error: command 'gcc' failed with exit status 1

    And indeed there is a redundant declaration in that Python.h file, one
    with parameter names and the other without, so just add
    -Wno-error=redundant-decls to the python setup instructions.

    Now perf builds with gcc in ClearLinux with the following Dockerfile:

    # docker.io/acmel/linux-perf-tools-build-clearlinux:latest
    FROM docker.io/clearlinux:latest
    MAINTAINER Arnaldo Carvalho de Melo
    RUN swupd update && \
    swupd bundle-add sysadmin-basic-dev
    RUN mkdir -m 777 -p /git /tmp/build/perf /tmp/build/objtool /tmp/build/linux && \
    groupadd -r perfbuilder && \
    useradd -m -r -g perfbuilder perfbuilder && \
    chown -R perfbuilder.perfbuilder /tmp/build/ /git/
    USER perfbuilder
    COPY rx_and_build.sh /
    ENV EXTRA_MAKE_ARGS=PYTHON=python3
    ENTRYPOINT ["/rx_and_build.sh"]

    Now to figure out why the build fails with clang, that is present in the
    above container as detected by the rx_and_build.sh script:

    clang version 6.0.1 (tags/RELEASE_601/final)
    Target: x86_64-unknown-linux-gnu
    Thread model: posix
    InstalledDir: /usr/sbin
    make: Entering directory '/git/linux/tools/perf'
    BUILD: Doing 'make -j4' parallel build
    HOSTCC /tmp/build/perf/fixdep.o
    HOSTLD /tmp/build/perf/fixdep-in.o
    LINK /tmp/build/perf/fixdep

    Auto-detecting system features:
    ... dwarf: [ OFF ]
    ... dwarf_getlocations: [ OFF ]
    ... glibc: [ OFF ]
    ... gtk2: [ OFF ]
    ... libaudit: [ OFF ]
    ... libbfd: [ OFF ]
    ... libelf: [ OFF ]
    ... libnuma: [ OFF ]
    ... numa_num_possible_cpus: [ OFF ]
    ... libperl: [ OFF ]
    ... libpython: [ OFF ]
    ... libslang: [ OFF ]
    ... libcrypto: [ OFF ]
    ... libunwind: [ OFF ]
    ... libdw-dwarf-unwind: [ OFF ]
    ... zlib: [ OFF ]
    ... lzma: [ OFF ]
    ... get_cpuid: [ OFF ]
    ... bpf: [ OFF ]

    Makefile.config:331: *** No gnu/libc-version.h found, please install glibc-dev[el]. Stop.
    make[1]: *** [Makefile.perf:206: sub-make] Error 2
    make: *** [Makefile:70: all] Error 2
    make: Leaving directory '/git/linux/tools/perf'

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Thiago Macieira
    Cc: Wang Nan
    Link: https://lkml.kernel.org/n/tip-c3khb9ac86s00qxzjrueomme@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Arnaldo Carvalho de Melo
     
  • [ Upstream commit aa90f9f9554616d5738f7bedb4a8f0e5e14d1bc6 ]

    Recently, the subtest numbering was changed to start from 1. While it
    is fine for displaying results, this should not be the case when the
    subtests are actually invoked.

    Typically, the subtests are stored in zero-indexed arrays and invoked
    based on the index passed to the main test function. Since the index
    now starts from 1, the second subtest in the array (index 1) gets
    invoked instead of the first (index 0). This applies to all of the
    following subtests but for the last one, the subtest always fails
    because it does not meet the boundary condition of the subtest index
    being lesser than the number of subtests.

    This can be observed on powerpc64 and x86_64 systems running Fedora 28
    as shown below.

    Before:

    # perf test "builtin clang support"
    55: builtin clang support :
    55.1: builtin clang compile C source to IR : Ok
    55.2: builtin clang compile C source to ELF object : FAILED!

    # perf test "LLVM search and compile"
    38: LLVM search and compile :
    38.1: Basic BPF llvm compile : Ok
    38.2: kbuild searching : Ok
    38.3: Compile source for BPF prologue generation : Ok
    38.4: Compile source for BPF relocation : FAILED!

    # perf test "BPF filter"
    40: BPF filter :
    40.1: Basic BPF filtering : Ok
    40.2: BPF pinning : Ok
    40.3: BPF prologue generation : Ok
    40.4: BPF relocation checker : FAILED!

    After:

    # perf test "builtin clang support"
    55: builtin clang support :
    55.1: builtin clang compile C source to IR : Ok
    55.2: builtin clang compile C source to ELF object : Ok

    # perf test "LLVM search and compile"
    38: LLVM search and compile :
    38.1: Basic BPF llvm compile : Ok
    38.2: kbuild searching : Ok
    38.3: Compile source for BPF prologue generation : Ok
    38.4: Compile source for BPF relocation : Ok

    # perf test "BPF filter"
    40: BPF filter :
    40.1: Basic BPF filtering : Ok
    40.2: BPF pinning : Ok
    40.3: BPF prologue generation : Ok
    40.4: BPF relocation checker : Ok

    Signed-off-by: Sandipan Das
    Reported-by: Arnaldo Carvalho de Melo
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Heiko Carstens
    Cc: Hendrik Brueckner
    Cc: Jiri Olsa
    Cc: Martin Schwidefsky
    Cc: Naveen N. Rao
    Cc: Ravi Bangoria
    Cc: Thomas Richter
    Fixes: 9ef0112442bd ("perf test: Fix subtest number when showing results")
    Link: http://lkml.kernel.org/r/20180726171733.33208-1-sandipan@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin

    Sandipan Das
     

18 Oct, 2018

3 commits

  • commit 77f18153c080855e1c3fb520ca31a4e61530121d upstream.

    With gcc 8 we get new set of snprintf() warnings that breaks the
    compilation, one example:

    tests/mem.c: In function ‘check’:
    tests/mem.c:19:48: error: ‘%s’ directive output may be truncated writing \
    up to 99 bytes into a region of size 89 [-Werror=format-truncation=]
    snprintf(failure, sizeof failure, "unexpected %s", out);

    The gcc docs says:

    To avoid the warning either use a bigger buffer or handle the
    function's return value which indicates whether or not its output
    has been truncated.

    Given that all these warnings are harmless, because the code either
    properly fails due to uncomplete file path or we don't care for
    truncated output at all, I'm changing all those snprintf() calls to
    scnprintf(), which actually 'checks' for the snprint return value so the
    gcc stays silent.

    Signed-off-by: Jiri Olsa
    Cc: Alexander Shishkin
    Cc: David Ahern
    Cc: Josh Poimboeuf
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Sergey Senozhatsky
    Link: http://lkml.kernel.org/r/20180319082902.4518-1-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Cc: Ignat Korchagin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     
  • commit d005efe18db0b4a123dd92ea8e77e27aee8f99fd upstream.

    With the "branches" export option, not all sample columns are exported.
    However the unwanted columns are not at the end of the tuple, as assumed
    by the code. Fix by taking the first 15 and last 3 values, instead of
    the first 18.

    Signed-off-by: Adrian Hunter
    Cc: Jiri Olsa
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180911114504.28516-3-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Greg Kroah-Hartman

    Adrian Hunter
     
  • commit 25e11700b54c7b6b5ebfc4361981dae12299557b upstream.

    Occasional export failures were found to be caused by truncating 64-bit
    pointers to 32-bits. Fix by explicitly setting types for all ctype
    arguments and results.

    Signed-off-by: Adrian Hunter
    Cc: Jiri Olsa
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180911114504.28516-2-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Greg Kroah-Hartman

    Adrian Hunter
     

13 Oct, 2018

3 commits

  • commit 06c3f2aa9fc68e7f3fe3d83e7569d2a2801d9f99 upstream.

    So that it can be used more widely, like in the next patch, when it will
    be used to fix a bug in 'perf test' handling of dirent.d_type ==
    DT_UNKNOWN.

    Signed-off-by: Jiri Olsa
    Cc: David Ahern
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20171206174535.25380-1-jolsa@kernel.org
    [ Split from a larger patch, removed needless includes in path.h ]
    Signed-off-by: Arnaldo Carvalho de Melo
    Cc: Ignat Korchagin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     
  • commit b7a313d84e853049062011d78cb04b6decd12f5c upstream.

    The gcc 8 compiler won't compile the python extension code with the
    following errors (one example):

    python.c:830:15: error: cast between incompatible function types from \
    ‘PyObject * (*)(struct pyrf_evsel *, PyObject *, PyObject *)’ \
    uct _object * (*)(struct pyrf_evsel *, struct _object *, struct _object *)’} to \
    ‘PyObject * (*)(PyObject *, PyObject *)’ {aka ‘struct _object * (*)(struct _objeuct \
    _object *)’} [-Werror=cast-function-type]
    .ml_meth = (PyCFunction)pyrf_evsel__open,

    The problem with the PyMethodDef::ml_meth callback is that its type is
    determined based on the PyMethodDef::ml_flags value, which we set as
    METH_VARARGS | METH_KEYWORDS.

    That indicates that the callback is expecting an extra PyObject* arg, and is
    actually PyCFunctionWithKeywords type, but the base PyMethodDef::ml_meth type
    stays PyCFunction.

    Previous gccs did not find this, gcc8 now does. Fixing this by silencing this
    warning for python.c build.

    Commiter notes:

    Do not do that for CC=clang, as it breaks the build in some clang
    versions, like the ones in fedora up to fedora27:

    fedora:25:error: unknown warning option '-Wno-cast-function-type'; did you mean '-Wno-bad-function-cast'? [-Werror,-Wunknown-warning-option]
    fedora:26:error: unknown warning option '-Wno-cast-function-type'; did you mean '-Wno-bad-function-cast'? [-Werror,-Wunknown-warning-option]
    fedora:27:error: unknown warning option '-Wno-cast-function-type'; did you mean '-Wno-bad-function-cast'? [-Werror,-Wunknown-warning-option]
    #

    those have:

    clang version 3.9.1 (tags/RELEASE_391/final)

    The one in rawhide accepts that:

    clang version 6.0.0 (tags/RELEASE_600/final)

    Signed-off-by: Jiri Olsa
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Alexander Shishkin
    Cc: David Ahern
    Cc: Josh Poimboeuf
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Sergey Senozhatsky
    Link: http://lkml.kernel.org/r/20180319082902.4518-2-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Cc: Ignat Korchagin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     
  • commit 6810158d526e483868e519befff407b91e76b3db upstream.

    We were using a local buffer with an arbitrary size, that would have to
    get increased to avoid truncation as warned by gcc 8:

    util/annotate.c: In function 'symbol__disassemble':
    util/annotate.c:1488:4: error: '%s' directive output may be truncated writing up to 4095 bytes into a region of size between 3966 and 8086 [-Werror=format-truncation=]
    "%s %s%s --start-address=0x%016" PRIx64
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    util/annotate.c:1498:20:
    symfs_filename, symfs_filename);
    ~~~~~~~~~~~~~~
    util/annotate.c:1490:50: note: format string is defined here
    " -l -d %s %s -C \"%s\" 2>/dev/null|grep -v \"%s:\"|expand",
    ^~
    In file included from /usr/include/stdio.h:861,
    from util/color.h:5,
    from util/sort.h:8,
    from util/annotate.c:14:
    /usr/include/bits/stdio2.h:67:10: note: '__builtin___snprintf_chk' output 116 or more bytes (assuming 8331) into a destination of size 8192
    return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    __bos (__s), __fmt, __va_arg_pack ());
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    So switch to asprintf, that will make sure enough space is available.

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jin Yao
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Wang Nan
    Link: https://lkml.kernel.org/n/tip-qagoy2dmbjpc9gdnaj0r3mml@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Cc: Ignat Korchagin
    Signed-off-by: Greg Kroah-Hartman

    Arnaldo Carvalho de Melo
     

10 Oct, 2018

3 commits

  • [ Upstream commit fa694160cca6dbba17c57dc7efec5f93feaf8795 ]

    This makes sure that the SyS symbols are ignored for any powerpc system,
    not just the big endian ones.

    Reported-by: Naveen N. Rao
    Signed-off-by: Sandipan Das
    Reviewed-by: Kamalesh Babulal
    Acked-by: Naveen N. Rao
    Cc: Jiri Olsa
    Cc: Ravi Bangoria
    Fixes: fb6d59423115 ("perf probe ppc: Use the right prefix when ignoring SyS symbols on ppc")
    Link: http://lkml.kernel.org/r/20180828090848.1914-1-sandipan@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sandipan Das
     
  • [ Upstream commit a72f64261359b7451f8478f2a2bf357b4e6c757f ]

    In the write to the output_fd in the error condition of
    record_saved_cmdline(), we are writing 8 bytes from a memory location on
    the stack that contains a primitive that is only 4 bytes in size.
    Change the primitive to 8 bytes in size to match the size of the write
    in order to avoid reading unknown memory from the stack.

    Signed-off-by: Chris Phlipot
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20180829061954.18871-1-cphlipot0@gmail.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chris Phlipot
     
  • [ Upstream commit fd8d2702791a970c751f8b526a17d8e725a05b46 ]

    If evsel is NULL, we should return NULL to avoid a NULL pointer
    dereference a bit later in the code.

    Signed-off-by: Hisao Tanabe
    Acked-by: Namhyung Kim
    Cc: Jiri Olsa
    Cc: Wang Nan
    Fixes: 03e0a7df3efd ("perf tools: Introduce bpf-output event")
    LPU-Reference: 20180824154556.23428-1-xtanabe@gmail.com
    Link: https://lkml.kernel.org/n/tip-e5plzjhx6595a5yjaf22jss3@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Hisao Tanabe
     

26 Sep, 2018

5 commits

  • [ Upstream commit c715fcfda5a08edabaa15508742be926b7ee51db ]

    For powerpc64, redundant entries in the callchain are filtered out by
    determining the state of the return address and the stack frame using
    DWARF debug information.

    For making these filtering decisions we must analyze the debug
    information for the location corresponding to the program counter value,
    i.e. the first entry in the callchain, and not the LR value; otherwise,
    perf may filter out either the second or the third entry in the
    callchain incorrectly.

    This can be observed on a powerpc64le system running Fedora 27 as shown
    below.

    Case 1 - Attaching a probe at inet_pton+0x8 (binary offset 0x15af28).
    Return address is still in LR and a new stack frame is not yet
    allocated. The LR value, i.e. the second entry, should not be
    filtered out.

    # objdump -d /usr/lib64/libc-2.26.so | less
    ...
    000000000010eb10 :
    ...
    10fa48: 78 bb e4 7e mr r4,r23
    10fa4c: 0a 00 60 38 li r3,10
    10fa50: d9 b4 04 48 bl 15af28
    10fa54: 00 00 00 60 nop
    10fa58: ac f4 ff 4b b 10ef04
    ...
    0000000000110450 :
    ...
    1105a8: 54 00 ff 38 addi r7,r31,84
    1105ac: 58 00 df 38 addi r6,r31,88
    1105b0: 69 e5 ff 4b bl 10eb18
    1105b4: 78 1b 71 7c mr r17,r3
    1105b8: 50 01 7f e8 ld r3,336(r31)
    ...
    000000000015af20 :
    15af20: 0b 00 4c 3c addis r2,r12,11
    15af24: e0 c1 42 38 addi r2,r2,-15904
    15af28: a6 02 08 7c mflr r0
    15af2c: f0 ff c1 fb std r30,-16(r1)
    15af30: f8 ff e1 fb std r31,-8(r1)
    ...

    # perf probe -x /usr/lib64/libc-2.26.so -a inet_pton+0x8
    # perf record -e probe_libc:inet_pton -g ping -6 -c 1 ::1
    # perf script

    Before:

    ping 4507 [002] 514985.546540: probe_libc:inet_pton: (7fffa7dbaf28)
    7fffa7dbaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
    7fffa7d705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
    13fb52d70 _init+0xbfc (/usr/bin/ping)
    7fffa7c836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
    7fffa7c83898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
    0 [unknown] ([unknown])

    After:

    ping 4507 [002] 514985.546540: probe_libc:inet_pton: (7fffa7dbaf28)
    7fffa7dbaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
    7fffa7d6fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
    7fffa7d705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
    13fb52d70 _init+0xbfc (/usr/bin/ping)
    7fffa7c836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
    7fffa7c83898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
    0 [unknown] ([unknown])

    Case 2 - Attaching a probe at _int_malloc+0x180 (binary offset 0x9cf10).
    Return address in still in LR and a new stack frame has already
    been allocated but not used. The caller's caller, i.e. the third
    entry, is invalid and should be filtered out and not the second
    one.

    # objdump -d /usr/lib64/libc-2.26.so | less
    ...
    000000000009cd90 :
    9cd90: 17 00 4c 3c addis r2,r12,23
    9cd94: 70 a3 42 38 addi r2,r2,-23696
    9cd98: 26 00 80 7d mfcr r12
    9cd9c: f8 ff e1 fb std r31,-8(r1)
    9cda0: 17 00 e4 3b addi r31,r4,23
    9cda4: d8 ff 61 fb std r27,-40(r1)
    9cda8: 78 23 9b 7c mr r27,r4
    9cdac: 1f 00 bf 2b cmpldi cr7,r31,31
    9cdb0: f0 ff c1 fb std r30,-16(r1)
    9cdb4: b0 ff c1 fa std r22,-80(r1)
    9cdb8: 78 1b 7e 7c mr r30,r3
    9cdbc: 08 00 81 91 stw r12,8(r1)
    9cdc0: 11 ff 21 f8 stdu r1,-240(r1)
    9cdc4: 4c 01 9d 41 bgt cr7,9cf10
    9cdc8: 20 00 a4 2b cmpldi cr7,r4,32
    ...
    9cf08: 00 00 00 60 nop
    9cf0c: 00 00 42 60 ori r2,r2,0
    9cf10: e4 06 ff 7b rldicr r31,r31,0,59
    9cf14: 40 f8 a4 7f cmpld cr7,r4,r31
    9cf18: 68 05 9d 41 bgt cr7,9d480
    ...
    000000000009e3c0 :
    ...
    9e420: 40 02 80 38 li r4,576
    9e424: 78 fb e3 7f mr r3,r31
    9e428: 71 e9 ff 4b bl 9cd98
    9e42c: 00 00 a3 2f cmpdi cr7,r3,0
    9e430: 78 1b 7e 7c mr r30,r3
    ...
    000000000009f7a0 :
    ...
    9f8f8: 00 00 89 2f cmpwi cr7,r9,0
    9f8fc: 1c ff 9e 40 bne cr7,9f818
    9f900: c9 ea ff 4b bl 9e3c8
    9f904: 00 00 00 60 nop
    9f908: e8 90 22 e9 ld r9,-28440(r2)
    ...

    # perf probe -x /usr/lib64/libc-2.26.so -a _int_malloc+0x180
    # perf record -e probe_libc:_int_malloc -g ./test-malloc
    # perf script

    Before:

    test-malloc 6554 [009] 515975.797403: probe_libc:_int_malloc: (7fffa6e6cf10)
    7fffa6e6cf10 _int_malloc+0x180 (/usr/lib64/libc-2.26.so)
    7fffa6dd0000 [unknown] (/usr/lib64/libc-2.26.so)
    7fffa6e6f904 malloc+0x164 (/usr/lib64/libc-2.26.so)
    7fffa6e6f9fc malloc+0x25c (/usr/lib64/libc-2.26.so)
    100006b4 main+0x38 (/home/testuser/test-malloc)
    7fffa6df36a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
    7fffa6df3898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
    0 [unknown] ([unknown])

    After:

    test-malloc 6554 [009] 515975.797403: probe_libc:_int_malloc: (7fffa6e6cf10)
    7fffa6e6cf10 _int_malloc+0x180 (/usr/lib64/libc-2.26.so)
    7fffa6e6e42c tcache_init.part.4+0x6c (/usr/lib64/libc-2.26.so)
    7fffa6e6f904 malloc+0x164 (/usr/lib64/libc-2.26.so)
    7fffa6e6f9fc malloc+0x25c (/usr/lib64/libc-2.26.so)
    100006b4 main+0x38 (/home/sandipan/test-malloc)
    7fffa6df36a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
    7fffa6df3898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
    0 [unknown] ([unknown])

    Signed-off-by: Sandipan Das
    Cc: Jiri Olsa
    Cc: Maynard Johnson
    Cc: Naveen N. Rao
    Cc: Ravi Bangoria
    Cc: Sukadev Bhattiprolu
    Fixes: a60335ba3298 ("perf tools powerpc: Adjust callchain based on DWARF debug info")
    Link: http://lkml.kernel.org/r/24bb726d91ed173aebc972ec3f41a2ef2249434e.1530724939.git.sandipan@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sandipan Das
     
  • [ Upstream commit 9068533e4f470daf2b0f29c71d865990acd8826e ]

    For powerpc64, perf will filter out the second entry in the callchain,
    i.e. the LR value, if the return address of the function corresponding
    to the probed location has already been saved on its caller's stack.

    The state of the return address is determined using debug information.
    At any point within a function, if the return address is already saved
    somewhere, a DWARF expression can tell us about its location. If the
    return address in still in LR only, no DWARF expression would exist.

    Typically, the instructions in a function's prologue first copy the LR
    value to R0 and then pushes R0 on to the stack. If LR has already been
    copied to R0 but R0 is yet to be pushed to the stack, we can still get a
    DWARF expression that says that the return address is in R0. This is
    indicating that getting a DWARF expression for the return address does
    not guarantee the fact that it has already been saved on the stack.

    This can be observed on a powerpc64le system running Fedora 27 as shown
    below.

    # objdump -d /usr/lib64/libc-2.26.so | less
    ...
    000000000015af20 :
    15af20: 0b 00 4c 3c addis r2,r12,11
    15af24: e0 c1 42 38 addi r2,r2,-15904
    15af28: a6 02 08 7c mflr r0
    15af2c: f0 ff c1 fb std r30,-16(r1)
    15af30: f8 ff e1 fb std r31,-8(r1)
    15af34: 78 1b 7f 7c mr r31,r3
    15af38: 78 23 83 7c mr r3,r4
    15af3c: 78 2b be 7c mr r30,r5
    15af40: 10 00 01 f8 std r0,16(r1)
    15af44: c1 ff 21 f8 stdu r1,-64(r1)
    15af48: 28 00 81 f8 std r4,40(r1)
    ...

    # readelf --debug-dump=frames-interp /usr/lib64/libc-2.26.so | less
    ...
    00027024 0000000000000024 00027028 FDE cie=00000000 pc=000000000015af20..000000000015af88
    LOC CFA r30 r31 ra
    000000000015af20 r1+0 u u u
    000000000015af34 r1+0 c-16 c-8 r0
    000000000015af48 r1+64 c-16 c-8 c+16
    000000000015af5c r1+0 c-16 c-8 c+16
    000000000015af78 r1+0 u u
    ...

    # perf probe -x /usr/lib64/libc-2.26.so -a inet_pton+0x18
    # perf record -e probe_libc:inet_pton -g ping -6 -c 1 ::1
    # perf script

    Before:

    ping 2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
    7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
    7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
    12f152d70 _init+0xbfc (/usr/bin/ping)
    7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
    7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
    0 [unknown] ([unknown])

    After:

    ping 2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
    7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
    7fff7e26fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
    7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
    12f152d70 _init+0xbfc (/usr/bin/ping)
    7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
    7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
    0 [unknown] ([unknown])

    Reported-by: Ravi Bangoria
    Signed-off-by: Sandipan Das
    Cc: Jiri Olsa
    Cc: Maynard Johnson
    Cc: Naveen N. Rao
    Cc: Ravi Bangoria
    Cc: Sukadev Bhattiprolu
    Link: http://lkml.kernel.org/r/66e848a7bdf2d43b39210a705ff6d828a0865661.1530724939.git.sandipan@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sandipan Das
     
  • [ Upstream commit 46b3722cc7765582354488da633aafffcb138458 ]

    We occasionaly hit following assert failure in 'perf top', when processing the
    /proc info in multiple threads.

    perf: ...include/linux/refcount.h:109: refcount_inc:
    Assertion `!(!refcount_inc_not_zero(r))' failed.

    The gdb backtrace looks like this:

    [Switching to Thread 0x7ffff11ba700 (LWP 13749)]
    0x00007ffff50839fb in raise () from /lib64/libc.so.6
    (gdb)
    #0 0x00007ffff50839fb in raise () from /lib64/libc.so.6
    #1 0x00007ffff5085800 in abort () from /lib64/libc.so.6
    #2 0x00007ffff507c0da in __assert_fail_base () from /lib64/libc.so.6
    #3 0x00007ffff507c152 in __assert_fail () from /lib64/libc.so.6
    #4 0x0000000000535373 in refcount_inc (r=0x7fffdc009be0)
    at ...include/linux/refcount.h:109
    #5 0x00000000005354f1 in comm_str__get (cs=0x7fffdc009bc0)
    at util/comm.c:24
    #6 0x00000000005356bd in __comm_str__findnew (str=0x7fffd000b260 ":2",
    root=0xbed5c0 ) at util/comm.c:72
    #7 0x000000000053579e in comm_str__findnew (str=0x7fffd000b260 ":2",
    root=0xbed5c0 ) at util/comm.c:95
    #8 0x000000000053582e in comm__new (str=0x7fffd000b260 ":2",
    timestamp=0, exec=false) at util/comm.c:111
    #9 0x00000000005363bc in thread__new (pid=2, tid=2) at util/thread.c:57
    #10 0x0000000000523da0 in ____machine__findnew_thread (machine=0xbfde38,
    threads=0xbfdf28, pid=2, tid=2, create=true) at util/machine.c:457
    #11 0x0000000000523eb4 in __machine__findnew_thread (machine=0xbfde38,
    ...

    The failing assertion is this one:

    REFCOUNT_WARN(!refcount_inc_not_zero(r), ...

    The problem is that we keep global comm_str_root list, which
    is accessed by multiple threads during the 'perf top' startup
    and following 2 paths can race:

    thread 1:
    ...
    thread__new
    comm__new
    comm_str__findnew
    down_write(&comm_str_lock);
    __comm_str__findnew
    comm_str__get

    thread 2:
    ...
    comm__override or comm__free
    comm_str__put
    refcount_dec_and_test
    down_write(&comm_str_lock);
    rb_erase(&cs->rb_node, &comm_str_root);

    Because thread 2 first decrements the refcnt and only after then it removes the
    struct comm_str from the list, the thread 1 can find this object on the list
    with refcnt equls to 0 and hit the assert.

    This patch fixes the thread 1 __comm_str__findnew path, by ignoring objects
    that already dropped the refcnt to 0. For the rest of the objects we take the
    refcnt before comparing its name and release it afterwards with comm_str__put,
    which can also release the object completely.

    Signed-off-by: Jiri Olsa
    Acked-by: Namhyung Kim
    Cc: Alexander Shishkin
    Cc: Andi Kleen
    Cc: David Ahern
    Cc: Kan Liang
    Cc: Lukasz Odzioba
    Cc: Peter Zijlstra
    Cc: Wang Nan
    Cc: kernel-team@lge.com
    Link: http://lkml.kernel.org/r/20180720101740.GA27176@krava
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     
  • [ Upstream commit e8fedff1cc729fd227924305152ccc6f580e8c83 ]

    Stephan reported, that pipe mode does not carry the group information
    and thus the piped report won't display the grouped output for following
    command:

    # perf record -e '{cycles,instructions,branches}' -a sleep 4 | perf report

    It has no idea about the group setup, so it will display events
    separately:

    # Overhead Command Shared Object ...
    # ........ ............... .......................
    #
    6.71% swapper [kernel.kallsyms]
    2.28% offlineimap libpython2.7.so.1.0
    0.78% perf [kernel.kallsyms]
    ...

    Fix GROUP_DESC feature record to be synthesized in pipe mode, so the
    report output is grouped if there are groups defined in record:

    # Overhead Command Shared ...
    # ........................ ............... .......
    #
    7.57% 0.16% 0.30% swapper [kernel
    1.87% 3.15% 2.46% offlineimap libpyth
    1.33% 0.00% 0.00% perf [kernel
    ...

    Reported-by: Stephane Eranian
    Signed-off-by: Jiri Olsa
    Tested-by: Arnaldo Carvalho de Melo
    Tested-by: Stephane Eranian
    Cc: Alexander Shishkin
    Cc: David Ahern
    Cc: David Carrillo-Cisneros
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20180712135202.14774-1-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jiri Olsa
     
  • [ Upstream commit 9ef0112442bdddef5fb55adf20b3a5464b33de75 ]

    Perf test 40 for example has several subtests numbered 1-4 when
    displaying the start of the subtest. When the subtest results
    are displayed the subtests are numbered 0-3.

    Use this command to generate trace output:

    [root@s35lp76 perf]# ./perf test -Fv 40 2>/tmp/bpf1

    Fix this by adjusting the subtest number when show the
    subtest result.

    Output before:

    [root@s35lp76 perf]# egrep '(^40\.[0-4]| subtest [0-4]:)' /tmp/bpf1
    40.1: Basic BPF filtering :
    BPF filter subtest 0: Ok
    40.2: BPF pinning :
    BPF filter subtest 1: Ok
    40.3: BPF prologue generation :
    BPF filter subtest 2: Ok
    40.4: BPF relocation checker :
    BPF filter subtest 3: Ok
    [root@s35lp76 perf]#

    Output after:

    root@s35lp76 ~]# egrep '(^40\.[0-4]| subtest [0-4]:)' /tmp/bpf1
    40.1: Basic BPF filtering :
    BPF filter subtest 1: Ok
    40.2: BPF pinning :
    BPF filter subtest 2: Ok
    40.3: BPF prologue generation :
    BPF filter subtest 3: Ok
    40.4: BPF relocation checker :
    BPF filter subtest 4: Ok
    [root@s35lp76 ~]#

    Signed-off-by: Thomas Richter
    Reviewed-by: Hendrik Brueckner
    Cc: Heiko Carstens
    Cc: Martin Schwidefsky
    Link: http://lkml.kernel.org/r/20180724134858.100644-1-tmricht@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter