27 Nov, 2018

1 commit

  • 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
     

04 Nov, 2018

1 commit

  • [ 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

1 commit

  • 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
     

26 Sep, 2018

1 commit

  • [ 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
     

24 Aug, 2018

1 commit

  • [ Upstream commit b930e62ecd362843002bdf84c2940439822af321 ]

    On s390 this test case fails because the socket identifiction numbers
    assigned to the CPU are higher than the CPU identification numbers.

    F/ix this by adding the platform architecture into the perf data header
    flag information. This helps identifiing the test platform and handles
    s390 specifics in process_cpu_topology().

    Before:

    [root@p23lp27 perf]# perf test -vvvvv -F 39
    39: Session topology :
    --- start ---
    templ file: /tmp/perf-test-iUv755
    socket_id number is too big.You may need to upgrade the perf tool.
    ---- end ----
    Session topology: Skip
    [root@p23lp27 perf]#

    After:

    [root@p23lp27 perf]# perf test -vvvvv -F 39
    39: Session topology :
    --- start ---
    templ file: /tmp/perf-test-8X8VTs
    CPU 0, core 0, socket 6
    CPU 1, core 1, socket 3
    ---- end ----
    Session topology: Ok
    [root@p23lp27 perf]#

    Signed-off-by: Thomas Richter
    Reviewed-by: Hendrik Brueckner
    Cc: Heiko Carstens
    Cc: Martin Schwidefsky
    Fixes: c84974ed9fb6 ("perf test: Add entry to test cpu topology")
    Link: http://lkml.kernel.org/r/20180611073153.15592-2-tmricht@linux.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter
     

08 Jul, 2018

1 commit

  • [ Upstream commit d121109100bda84bbbb199dab97f9d56432ab235 ]

    The "perf test Session topology" entry fails with core dump on s390. The root
    cause is a NULL pointer dereference in function check_cpu_topology() line 76
    (or line 82 without -v).

    The session->header.env.cpu variable is NULL because on s390 function
    process_cpu_topology() returns with error:

    socket_id number is too big.
    You may need to upgrade the perf tool.

    and releases the env.cpu variable via zfree() and sets it to NULL.

    Here is the gdb output:
    (gdb) n
    76 pr_debug("CPU %d, core %d, socket %d\n", i,
    (gdb) n

    Program received signal SIGSEGV, Segmentation fault.
    0x00000000010f4d9e in check_cpu_topology (path=0x3ffffffd6c8
    "/tmp/perf-test-J6CHMa", map=0x14a1740) at tests/topology.c:76
    76 pr_debug("CPU %d, core %d, socket %d\n", i,
    (gdb)

    Make sure the env.cpu variable is not used when its NULL.
    Test for NULL pointer and return TEST_SKIP if so.

    Output before:

    [root@p23lp27 perf]# ./perf test -F 39
    39: Session topology :Segmentation fault (core dumped)
    [root@p23lp27 perf]#

    Output after:

    [root@p23lp27 perf]# ./perf test -vF 39
    39: Session topology :
    --- start ---
    templ file: /tmp/perf-test-Ajx59D
    socket_id number is too big.You may need to upgrade the perf tool.
    ---- end ----
    Session topology: Skip
    [root@p23lp27 perf]#

    Signed-off-by: Thomas Richter
    Cc: Heiko Carstens
    Cc: Hendrik Brueckner
    Cc: Martin Schwidefsky
    Link: http://lkml.kernel.org/r/20180528073657.11743-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
     

30 May, 2018

3 commits

  • [ Upstream commit fdf7c49c200d1b9909e2204cec5bd68b48605c71 ]

    When we strip the perf binary, dwarf unwind test stop
    to work. The reason is that strip will remove static
    function symbols, which we need to check for unwind.

    This change will keep this test working in cases where
    the global symbols are put into dynamic symbol table,
    which is the case on x86. It still won't work on powerpc.

    Making those 5 local functions global, and adding
    'test_dwarf_unwind__' to their names.

    Committer testing:

    Before:

    # perf test dwarf
    58: DWARF unwind : Ok
    # strip ~/bin/perf
    # perf test dwarf
    58: DWARF unwind : FAILED!
    # perf test -v dwarf
    58: DWARF unwind :
    --- start ---
    test child forked, pid 6590
    unwind: thread map already set, dso=/home/acme/bin/perf

    unwind: access_mem addr 0x7ffce6c48098 val 48563f, offset 1144
    unwind: test__dwarf_unwind:ip = 0x4a54e5 (0xa54e5)
    got: test__dwarf_unwind 0xa54e5, expecting test__dwarf_unwind
    unwind: '':ip = 0x4a50bb (0xa50bb)
    failed: got unresolved address 0xa50bb
    unwind failed
    test child finished with -1
    ---- end ----
    DWARF unwind: FAILED!
    #

    After:

    # perf test dwarf
    58: DWARF unwind : Ok
    # strip ~/bin/perf
    # perf test dwarf
    58: DWARF unwind : Ok
    #
    # perf test -v dwarf
    58: DWARF unwind :
    --- start ---
    test child forked, pid 7219
    unwind: thread map already set, dso=/home/acme/bin/perf

    unwind: access_mem addr 0x7fff007da2c8 val 48575f, offset 1144
    unwind: test__arch_unwind_sample:ip = 0x589044 (0x189044)
    got: test__arch_unwind_sample 0x189044, expecting test__arch_unwind_sample
    unwind: test_dwarf_unwind__thread:ip = 0x4a52f7 (0xa52f7)
    got: test_dwarf_unwind__thread 0xa52f7, expecting test_dwarf_unwind__thread
    unwind: test_dwarf_unwind__compare:ip = 0x4a5468 (0xa5468)
    got: test_dwarf_unwind__compare 0xa5468, expecting test_dwarf_unwind__compare
    unwind: bsearch:ip = 0x7f6608ae94d8 (0x394d8)
    got: bsearch 0x394d8, expecting bsearch
    unwind: test_dwarf_unwind__krava_3:ip = 0x4a54d1 (0xa54d1)
    got: test_dwarf_unwind__krava_3 0xa54d1, expecting test_dwarf_unwind__krava_3
    unwind: test_dwarf_unwind__krava_2:ip = 0x4a550b (0xa550b)
    got: test_dwarf_unwind__krava_2 0xa550b, expecting test_dwarf_unwind__krava_2
    unwind: test_dwarf_unwind__krava_1:ip = 0x4a554b (0xa554b)
    got: test_dwarf_unwind__krava_1 0xa554b, expecting test_dwarf_unwind__krava_1
    unwind: test__dwarf_unwind:ip = 0x4a5605 (0xa5605)
    got: test__dwarf_unwind 0xa5605, expecting test__dwarf_unwind
    test child finished with 0
    ---- end ----
    DWARF unwind: Ok
    #

    Signed-off-by: Jiri Olsa
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Alexander Shishkin
    Cc: David Ahern
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20180206181813.10943-17-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 ab6e9a99345131cd8e54268d1d0dc04a33f7ed11 ]

    The symbol search called by machine__find_kernel_symbol_by_name is using
    internally arch__compare_symbol_names function to compare 2 symbol
    names, because different archs have different ways of comparing symbols.
    Mostly for skipping '.' prefixes and similar.

    In test 1 when we try to find matching symbols in kallsyms and vmlinux,
    by address and by symbol name. When either is found we compare the pair
    symbol names by simple strcmp, which is not good enough for reasons
    explained in previous paragraph.

    On powerpc this can cause lockup, because even thought we found the
    pair, the compared names are different and don't match simple strcmp.
    Following code path is executed, that leads to lockup:

    - we find the pair in kallsyms by sym->start
    next_pair:
    - we compare the names and it fails
    - we find the pair by sym->name
    - the pair addresses match so we call goto next_pair
    because we assume the names match in this case

    Signed-off-by: Jiri Olsa
    Tested-by: Naveen N. Rao
    Acked-by: Naveen N. Rao
    Cc: Alexander Shishkin
    Cc: David Ahern
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Fixes: 031b84c407c3 ("perf probe ppc: Enable matching against dot symbols automatically")
    Link: http://lkml.kernel.org/r/20180215122635.24029-10-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 0f19a038afdc592176c9a302f0d08be6a68ad74a ]

    Using Fedora 27 and latest Linux kernel the test case
    trace+probe_libc_inet_pton.sh fails again on s390. This time is the
    inlining of functions which does not match. After an update of the
    glibc (from 2.26-16 to 2.26-24) the output is different

    The expected output is:

    __inet_pton (/usr/lib64/libc-2.26.so)
    gaih_inet (inlined)
    ....

    The actual output is:

    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.061/0.061/0.061/0.000 ms
    0.000 probe_libc:inet_pton:(3ffb2140448))
    __inet_pton (inlined)
    gaih_inet.constprop.7 (/usr/lib64/libc-2.26.so)
    ...

    Fix this by being less strict on 'inlined' verses library name and
    accept both

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

    Thomas Richter
     

26 Apr, 2018

2 commits

  • [ Upstream commit 7a92453620d42c3a5fea94a864dc6aa04c262b93 ]

    On Intel test case trace+probe_libc_inet_pton.sh succeeds and the
    output is:

    [root@f27 perf]# ./perf trace --no-syscalls
    -e probe_libc:inet_pton/max-stack=3/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.037 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms
    0.000 probe_libc:inet_pton:(7fa40ac618a0))
    __GI___inet_pton (/usr/lib64/libc-2.26.so)
    getaddrinfo (/usr/lib64/libc-2.26.so)
    main (/usr/bin/ping)

    The kernel stack unwinder is used, it is specified implicitly
    as call-graph=fp (frame pointer).

    On s390x only dwarf is available for stack unwinding. It is also
    done in user space. This requires different parameter setup
    and result checking for s390x and Intel.

    This patch adds separate perf trace setup and result checking
    for Intel and s390x. On s390x specify this command line to
    get a call-graph and handle the different call graph result
    checking:

    [root@s35lp76 perf]# ./perf trace --no-syscalls
    -e probe_libc:inet_pton/call-graph=dwarf/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.041 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.041/0.041/0.041/0.000 ms
    0.000 probe_libc:inet_pton:(3ffb9942060))
    __GI___inet_pton (/usr/lib64/libc-2.26.so)
    gaih_inet (inlined)
    __GI_getaddrinfo (inlined)
    main (/usr/bin/ping)
    __libc_start_main (/usr/lib64/libc-2.26.so)
    _start (/usr/bin/ping)
    [root@s35lp76 perf]#

    Before:
    [root@s8360047 perf]# ./perf test -vv 58
    58: probe libc's inet_pton & backtrace it with ping :
    --- start ---
    test child forked, pid 26349
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.079 ms
    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.079/0.079/0.079/0.000 ms
    0.000 probe_libc:inet_pton:(3ff925c2060))
    test child finished with -1
    ---- end ----
    probe libc's inet_pton & backtrace it with ping: FAILED!
    [root@s8360047 perf]#

    After:
    [root@s35lp76 perf]# ./perf test -vv 57
    57: probe libc's inet_pton & backtrace it with ping :
    --- start ---
    test child forked, pid 38708
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.038 ms
    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms
    0.000 probe_libc:inet_pton:(3ff87342060))
    __GI___inet_pton (/usr/lib64/libc-2.26.so)
    gaih_inet (inlined)
    __GI_getaddrinfo (inlined)
    main (/usr/bin/ping)
    __libc_start_main (/usr/lib64/libc-2.26.so)
    _start (/usr/bin/ping)
    test child finished with 0
    ---- end ----
    probe libc's inet_pton & backtrace it with ping: Ok
    [root@s35lp76 perf]#

    On Intel the test case runs unchanged and succeeds.

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

    Thomas Richter
     
  • [ Upstream commit eabad8c6856f185f876b54c426c2cc69fe0f0a7d ]

    When setting up DWARF callchains on specific events, without using
    'record' or 'trace' --call-graph, but instead doing it like:

    perf trace -e cycles/call-graph=dwarf/

    The unwind__prepare_access() call in thread__insert_map() when we
    process PERF_RECORD_MMAP(2) metadata events were not being performed,
    precluding us from using per-event DWARF callchains, handling them just
    when we asked for all events to be DWARF, using "--call-graph dwarf".

    We do it in the PERF_RECORD_MMAP because we have to look at one of the
    executable maps to figure out the executable type (64-bit, 32-bit) of
    the DSO laid out in that mmap. Also to look at the architecture where
    the perf.data file was recorded.

    All this probably should be deferred to when we process a sample for
    some thread that has callchains, so that we do this processing only for
    the threads with samples, not for all of them.

    For now, fix using DWARF on specific events.

    Before:

    # perf trace --no-syscalls -e probe_libc:inet_pton/call-graph=dwarf/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.048 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.048/0.048/0.048/0.000 ms
    0.000 probe_libc:inet_pton:(7fe9597bb350))
    Problem processing probe_libc:inet_pton callchain, skipping...
    #

    After:

    # perf trace --no-syscalls -e probe_libc:inet_pton/call-graph=dwarf/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.060 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.060/0.060/0.060/0.000 ms
    0.000 probe_libc:inet_pton:(7fd4aa930350))
    __inet_pton (inlined)
    gaih_inet.constprop.7 (/usr/lib64/libc-2.26.so)
    __GI_getaddrinfo (inlined)
    [0xffffaa804e51af3f] (/usr/bin/ping)
    __libc_start_main (/usr/lib64/libc-2.26.so)
    [0xffffaa804e51b379] (/usr/bin/ping)
    #
    # perf trace --call-graph=dwarf --no-syscalls -e probe_libc:inet_pton/call-graph=dwarf/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.057 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.057/0.057/0.057/0.000 ms
    0.000 probe_libc:inet_pton:(7f9363b9e350))
    __inet_pton (inlined)
    gaih_inet.constprop.7 (/usr/lib64/libc-2.26.so)
    __GI_getaddrinfo (inlined)
    [0xffffa9e8a14e0f3f] (/usr/bin/ping)
    __libc_start_main (/usr/lib64/libc-2.26.so)
    [0xffffa9e8a14e1379] (/usr/bin/ping)
    #
    # perf trace --call-graph=fp --no-syscalls -e probe_libc:inet_pton/call-graph=dwarf/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.077 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.077/0.077/0.077/0.000 ms
    0.000 probe_libc:inet_pton:(7f4947e1c350))
    __inet_pton (inlined)
    gaih_inet.constprop.7 (/usr/lib64/libc-2.26.so)
    __GI_getaddrinfo (inlined)
    [0xffffaa716d88ef3f] (/usr/bin/ping)
    __libc_start_main (/usr/lib64/libc-2.26.so)
    [0xffffaa716d88f379] (/usr/bin/ping)
    #
    # perf trace --no-syscalls -e probe_libc:inet_pton/call-graph=fp/ ping -6 -c 1 ::1
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.078 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.078/0.078/0.078/0.000 ms
    0.000 probe_libc:inet_pton:(7fa157696350))
    __GI___inet_pton (/usr/lib64/libc-2.26.so)
    getaddrinfo (/usr/lib64/libc-2.26.so)
    [0xffffa9ba39c74f40] (/usr/bin/ping)
    #

    Acked-by: Namhyung Kim
    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Hendrick Brueckner
    Cc: Jiri Olsa
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: https://lkml.kernel.org/r/20180116182650.GE16107@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Arnaldo Carvalho de Melo
     

25 Feb, 2018

2 commits

  • [ Upstream commit 996548499df61babae5306544c7daf5fd39db31c ]

    Test case 21 (Number of exit events of a simple workload) fails on
    s390x. The reason is the invalid sample frequency supplied for this
    test. On s390x the minimum sample frequency is much higher (see output
    of /proc/service_levels).

    Supply a save sample frequency value for s390x to fix this. The value
    will be adjusted by the s390x CPUMF frequency convertion function to a
    value well below the sysctl kernel.perf_event_max_sample_rate value.

    Signed-off-by: Thomas Richter
    Reviewed-by: Hendrik Brueckner
    Cc: Martin Schwidefsky
    LPU-Reference: 20171123114611.93397-1-tmricht@linux.vnet.ibm.com
    Link: https://lkml.kernel.org/n/tip-1ynblyhi1n81idpido59nt1y@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter
     
  • [ Upstream commit ccafc38f1c778847ab6d53dd7933260426731cf3 ]

    This 'perf test' case fails on s390x. The 'touch' command on s390x uses
    the 'openat' system call to open the file named on the command line:

    [root@s35lp76 perf]# perf probe -l
    probe:vfs_getname (on getname_flags:72@fs/namei.c with pathname)
    [root@s35lp76 perf]# perf trace -e open touch /tmp/abc
    0.400 ( 0.015 ms): touch/27542 open(filename:
    /usr/lib/locale/locale-archive, flags: CLOEXEC) = 3
    [root@s35lp76 perf]#

    There is no 'open' system call for file '/tmp/abc'. Instead the 'openat'
    system call is used:

    [root@s35lp76 perf]# strace touch /tmp/abc
    execve("/usr/bin/touch", ["touch", "/tmp/abc"], 0x3ffd547ec98
    /* 30 vars */) = 0
    [...]
    openat(AT_FDCWD, "/tmp/abc", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
    [...]

    On s390x the 'egrep' command does not find a matching pattern and
    returns an error.

    Fix this for s390x create a platform dependent command line to enable
    the 'perf probe' call to listen to the 'openat' system call and get the
    expected output.

    Signed-off-by: Thomas-Mich Richter
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Hendrik Brueckner
    Cc: Thomas-Mich Richter
    LPU-Reference: 20171114071847.2381-1-tmricht@linux.vnet.ibm.com
    Link: http://lkml.kernel.org/n/tip-3qf38jk0prz54rhmhyu871my@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter
     

10 Dec, 2017

2 commits

  • [ Upstream commit 3440fe2790aa3d13530260af6033533b18959aee ]

    Commit d78ada4a767 ("perf tests attr: Do not store failed events") does
    not create an event file in the /tmp directory when the
    perf_open_event() system call failed.

    This can lead to a situation where not /tmp/event-xx-yy-zz result file
    exists at all (for example on a s390x virtual machine environment) where
    no CPUMF hardware is available.

    The following command then fails with a python call back chain instead
    of printing failure:

    [root@s8360046 perf]# /usr/bin/python2 ./tests/attr.py -d ./tests/attr/ \
    -p ./perf -v -ttest-stat-basic
    running './tests/attr//test-stat-basic'
    Traceback (most recent call last):
    File "./tests/attr.py", line 379, in
    main()
    File "./tests/attr.py", line 370, in main
    run_tests(options)
    File "./tests/attr.py", line 311, in run_tests
    Test(f, options).run()
    File "./tests/attr.py", line 300, in run
    self.compare(self.expect, self.result)
    File "./tests/attr.py", line 248, in compare
    exp_event.diff(res_event)
    UnboundLocalError: local variable 'res_event' referenced before assignment
    [root@s8360046 perf]#

    This patch catches this pitfall and prints an error message instead:

    [root@s8360047 perf]# /usr/bin/python2 ./tests/attr.py -d ./tests/attr/ \
    -p ./perf -vvv -ttest-stat-basic
    running './tests/attr//test-stat-basic'
    loading expected events
    Event event:base-stat
    fd = 1
    group_fd = -1
    flags = 0|8
    [....]
    sample_regs_user = 0
    sample_stack_user = 0
    'PERF_TEST_ATTR=/tmp/tmpJbMQMP ./perf stat -o /tmp/tmpJbMQMP/perf.data -e cycles kill >/dev/null 2>&1' ret '1', expected '1'
    loading result events
    compare
    matching [event:base-stat]
    match: [event:base-stat] matches []
    res_event is empty
    FAILED './tests/attr//test-stat-basic' - match failure
    [root@s8360047 perf]#

    Signed-off-by: Thomas-Mich Richter
    Acked-by: Jiri Olsa
    Cc: Heiko Carstens
    Cc: Hendrik Brueckner
    Cc: Martin Schwidefsky
    Cc: Thomas-Mich Richter
    LPU-Reference: 20170913081209.39570-1-tmricht@linux.vnet.ibm.com
    Link: http://lkml.kernel.org/n/tip-04d63nn7svfgxdhi60gq2mlm@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter
     
  • [ Upstream commit 22905582f6dd4bbd0c370fe5732c607452010c04 ]

    Command perf test -v 16 (Setup struct perf_event_attr test) always
    reports success even if the test case fails. It works correctly if you
    also specify -F (for don't fork).

    root@s35lp76 perf]# ./perf test -v 16
    15: Setup struct perf_event_attr :
    --- start ---
    running './tests/attr/test-record-no-delay'
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.002 MB /tmp/tmp4E1h7R/perf.data
    (1 samples) ]
    expected task=0, got 1
    expected precise_ip=0, got 3
    expected wakeup_events=1, got 0
    FAILED './tests/attr/test-record-no-delay' - match failure
    test child finished with 0
    ---- end ----
    Setup struct perf_event_attr: Ok

    The reason for the wrong error reporting is the return value of the
    system() library call. It is called in run_dir() file tests/attr.c and
    returns the exit status, in above case 0xff00.

    This value is given as parameter to the exit() function which can only
    handle values 0-0xff.

    The child process terminates with exit value of 0 and the parent does
    not detect any error.

    This patch corrects the error reporting and prints the correct test
    result.

    Signed-off-by: Thomas-Mich Richter
    Acked-by: Jiri Olsa
    Cc: Heiko Carstens
    Cc: Hendrik Brueckner
    Cc: Martin Schwidefsky
    Cc: Thomas-Mich Richter
    LPU-Reference: 20170913081209.39570-2-tmricht@linux.vnet.ibm.com
    Link: http://lkml.kernel.org/n/tip-rdube6rfcjsr1nzue72c7lqn@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

18 Oct, 2017

1 commit

  • In debian/ubuntu, libc.so is located at a different place,
    /lib/x86_64-linux-gnu/libc-2.23.so, so it outputs like this when testing:

    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.040 ms

    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms
    0.000 probe_libc:inet_pton:(7f0e2db741c0))
    __GI___inet_pton (/lib/x86_64-linux-gnu/libc-2.23.so)
    getaddrinfo (/lib/x86_64-linux-gnu/libc-2.23.so)
    [0xffffa9d40f34ff4d] (/bin/ping)

    Fix up the libc path to make sure this test works in more OSes.

    Committer testing:

    When this test fails one can use 'perf test -v', i.e. in verbose mode, where
    it'll show the expected backtrace, so, after applying this test:

    On Fedora 26:

    # perf test -v ping
    62: probe libc's inet_pton & backtrace it with ping :
    --- start ---
    test child forked, pid 23322
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.058 ms
    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.058/0.058/0.058/0.000 ms
    0.000 probe_libc:inet_pton:(7fe344310d80))
    __GI___inet_pton (/usr/lib64/libc-2.25.so)
    getaddrinfo (/usr/lib64/libc-2.25.so)
    _init (/usr/bin/ping)
    test child finished with 0
    ---- end ----
    probe libc's inet_pton & backtrace it with ping: Ok
    #

    Signed-off-by: Li Zhijian
    Tested-by: Arnaldo Carvalho de Melo
    Cc: Alexander Shishkin
    Cc: Kim Phillips
    Cc: Li Zhijian
    Cc: Peter Zijlstra
    Cc: Philip Li
    Link: http://lkml.kernel.org/r/1508315649-18836-1-git-send-email-lizhijian@cn.fujitsu.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Li Zhijian
     

12 Sep, 2017

1 commit

  • When cross compiling perf and I want to link against a self-compiled
    libunwind, I usually make the custom path where the libunwind headers
    exist visible by adding the libunwind prefix to the include path when
    compiling perf, i.e.:

    ~~~~~
    $ ls $HOME/projects/compiled/other/include/
    libunwind-coredump.h libunwind.h libunwind-x86_64.h
    libunwind-common.h libunwind-dynamic.h libunwind-ptrace.h
    unwind.h
    $ make EXTRA_CFLAGS="-I$HOME/projects/compiled/other/include/
    ~~~~~~

    Note the `unwind.h` header from libunwind which leads to compile
    errors when compiling tests/dwarf-unwind.c, since it shadows perf's
    util/unwind.h:

    ~~~~~
    tests/dwarf-unwind.c:41:32: error: ‘struct unwind_entry’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
    static int unwind_entry(struct unwind_entry *entry, void *arg)
    ^~~~~~~~~~~~
    tests/dwarf-unwind.c: In function ‘unwind_entry’:
    tests/dwarf-unwind.c:44:22: error: dereferencing pointer to incomplete type ‘struct unwind_entry’
    char *symbol = entry->sym ? entry->sym->name : NULL;
    ^~
    tests/dwarf-unwind.c: In function ‘unwind_thread’:
    tests/dwarf-unwind.c:92:8: error: implicit declaration of function ‘unwind__get_entries’; did you mean ‘unwind_entry’? [-Werror=implicit-function-declaration]
    err = unwind__get_entries(unwind_entry, &cnt, thread,
    ^~~~~~~~~~~~~~~~~~~
    unwind_entry
    tests/dwarf-unwind.c:92:8: error: nested extern declaration of ‘unwind__get_entries’ [-Werror=nested-externs]
    ~~~~~~

    Fix this compile error by specificing an explicit include of perf's
    unwind.h in the util folder.

    Signed-off-by: Milian Wolff
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Yao Jin
    Link: http://lkml.kernel.org/r/20170906150209.12579-1-milian.wolff@kdab.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Milian Wolff
     

02 Sep, 2017

2 commits

  • Extend sample-parsing test cases to support new sample type
    PERF_SAMPLE_PHYS_ADDR.

    Signed-off-by: Kan Liang
    Tested-by: Jiri Olsa
    Acked-by: Stephane Eranian
    Cc: Andi Kleen
    Cc: Madhavan Srinivasan
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1504026672-7304-6-git-send-email-kan.liang@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Kan Liang
     
  • 'Object code reading' test always fails on powerpc guest. Two reasons
    for the failure are:

    1. When elf section is too big (size beyond 'unsigned int' max value).
    objdump fails to disassemble from such section. This was fixed with
    commit 0f6329bd7fc ("binutils/objdump: Fix disassemble for huge elf
    sections") in binutils.

    2. When the sample is from hypervisor. Hypervisor symbols can not be
    resolved within guest and thus thread__find_addr_map() fails for such
    symbols. Fix this by ignoring hypervisor symbols in the test.

    Signed-off-by: Ravi Bangoria
    Acked-by: Adrian Hunter
    Cc: Alexander Shishkin
    Cc: Jiri Olsa
    Cc: Michael Ellerman
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: linuxppc-dev@lists.ozlabs.org
    Link: http://lkml.kernel.org/r/1504170896-7876-1-git-send-email-ravi.bangoria@linux.vnet.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Ravi Bangoria
     

23 Aug, 2017

1 commit

  • Add some simple tests to perf test to test data source printing.

    v2: Make the tests actually checked for the correct name of Forward
    v3: Adjust to new encoding

    Committer notes:

    Avoid the in place declaration to make this build with older compilers,
    for instance, in Debian 7 we get:

    tests/mem.c: In function 'test__mem':
    tests/mem.c:30:5: error: missing initializer [-Werror=missing-field-initializers]
    tests/mem.c:30:5: error: (near initialization for '(anonymous)..mem_snoop') [-Werror=missing-field-initializers]

    So just zero a struct, then go on building the unions as needed,
    reusing settings from the previous test, i.e. local -> remote, etc.

    Signed-off-by: Andi Kleen
    Acked-by: Peter Zijlstra
    Cc: Jiri Olsa
    Link: http://lkml.kernel.org/r/20170816222156.19953-5-andi@firstfloor.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Andi Kleen
     

22 Aug, 2017

2 commits

  • Enhance the expression parser for more complex metric formulas.

    - Support python style IF ELSE operators
    - Add an #SMT_On magic variable for formulas that depend on the SMT
    status.

    Example: 4 *( CPU_CLK_UNHALTED.THREAD_ANY / 2 ) if #SMT_on else cycles

    - Support MIN/MAX operations

    Example: min(1 , IDQ.MITE_UOPS / ( UPI * 16 * ( ICACHE.HIT + ICACHE.MISSES ) / 4.0 ) )

    This is useful to fix up problems caused by multiplexing.

    - Support | & ^ operators
    - Minor cleanups and fixes
    - Support an \ escape for operators. This allows to specify event names
    like c2-residency
    - Support @ as an alternative for / to be able to specify pmus without
    conflicts with operators (like msr/tsc/ as msr@tsc@)

    Example: (cstate_core@c3\\-residency@ / msr@tsc@) * 100

    Signed-off-by: Andi Kleen
    Acked-by: Jiri Olsa
    Link: http://lkml.kernel.org/r/20170811232634.30465-8-andi@firstfloor.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Andi Kleen
     
  • Fix buffer overflow for:

    % perf stat -e msr/tsc/,cstate_core/c7-residency/ true

    that causes glibc free list corruption. For some reason it doesn't
    trigger in valgrind, but it is visible in AS:

    =================================================================
    ==32681==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000003f5c at pc 0x0000005671ef bp 0x7ffdaaac9ac0 sp 0x7ffdaaac9ab0
    READ of size 4 at 0x603000003f5c thread T0
    #0 0x5671ee in perf_evsel__close_fd util/evsel.c:1196
    #1 0x56c57a in perf_evsel__close util/evsel.c:1717
    #2 0x55ed5f in perf_evlist__close util/evlist.c:1631
    #3 0x4647e1 in __run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:749
    #4 0x4648e3 in run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:767
    #5 0x46e1bc in cmd_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:2785
    #6 0x52f83d in run_builtin /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:296
    #7 0x52fd49 in handle_internal_command /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:348
    #8 0x5300de in run_argv /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:392
    #9 0x5308f3 in main /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:530
    #10 0x7f0672d13400 in __libc_start_main (/lib64/libc.so.6+0x20400)
    #11 0x428419 in _start (/home/ak/hle/obj-perf/perf+0x428419)

    0x603000003f5c is located 0 bytes to the right of 28-byte region [0x603000003f40,0x603000003f5c)
    allocated by thread T0 here:
    #0 0x7f0675139020 in calloc (/lib64/libasan.so.3+0xc7020)
    #1 0x648a2d in zalloc util/util.h:23
    #2 0x648a88 in xyarray__new util/xyarray.c:9
    #3 0x566419 in perf_evsel__alloc_fd util/evsel.c:1039
    #4 0x56b427 in perf_evsel__open util/evsel.c:1529
    #5 0x56c620 in perf_evsel__open_per_thread util/evsel.c:1730
    #6 0x461dea in create_perf_stat_counter /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:263
    #7 0x4637d7 in __run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:600
    #8 0x4648e3 in run_perf_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:767
    #9 0x46e1bc in cmd_stat /home/ak/hle/linux-hle-2.6/tools/perf/builtin-stat.c:2785
    #10 0x52f83d in run_builtin /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:296
    #11 0x52fd49 in handle_internal_command /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:348
    #12 0x5300de in run_argv /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:392
    #13 0x5308f3 in main /home/ak/hle/linux-hle-2.6/tools/perf/perf.c:530
    #14 0x7f0672d13400 in __libc_start_main (/lib64/libc.so.6+0x20400)

    The event is allocated with cpus == 1, but freed with cpus == real number
    When the evsel close function walks the file descriptors it exceeds the
    fd xyarray boundaries and reads random memory.

    v2:

    Now that xyarrays save their original dimensions we can use these to
    iterate the two dimensional fd arrays. Fix some users (close, ioctl) in
    evsel.c to use these fields directly. This allows simplifying the code
    and dropping quite a few function arguments. Adjust all callers by
    removing the unneeded arguments.

    The actual perf event reading still uses the original values from the
    evsel list.

    Signed-off-by: Andi Kleen
    Acked-by: Jiri Olsa
    Link: http://lkml.kernel.org/r/20170811232634.30465-2-andi@firstfloor.org
    [ Fix up xy_max_[xy]() -> xyarray__max_[xy]() ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Andi Kleen
     

18 Aug, 2017

2 commits


17 Aug, 2017

1 commit


16 Aug, 2017

1 commit

  • Perf's BPF prologue generator unconditionally fetches 8 bytes for
    function parameters, which causes problems on big endian machines. Thomas
    gives a detailed analysis for this problem:

    http://lkml.kernel.org/r/968ebda5-abe4-8830-8d69-49f62529d151@linux.vnet.ibm.com

    ---- 8< ----
    I investigated perf test BPF for s390x and have a question regarding
    the 38.3 subtest (bpf-prologue test) which fails on s390x.

    When I turn on trace_printk in tests/bpf-script-test-prologue.c
    I see this output in /sys/kernel/debug/tracing/trace:

    [root@s8360047 perf]# cat /sys/kernel/debug/tracing/trace
    perf-30229 [000] d..2 170161.535791: : f_mode 2001d00000000 offset:0 orig:0
    perf-30229 [000] d..2 170161.535809: : f_mode 6001f00000000 offset:0 orig:0
    perf-30229 [000] d..2 170161.535815: : f_mode 6001f00000000 offset:1 orig:0
    perf-30229 [000] d..2 170161.535819: : f_mode 2001d00000000 offset:1 orig:0
    perf-30229 [000] d..2 170161.535822: : f_mode 2001d00000000 offset:2 orig:1
    perf-30229 [000] d..2 170161.535825: : f_mode 6001f00000000 offset:2 orig:1
    perf-30229 [000] d..2 170161.535828: : f_mode 6001f00000000 offset:3 orig:1
    perf-30229 [000] d..2 170161.535832: : f_mode 2001d00000000 offset:3 orig:1
    perf-30229 [000] d..2 170161.535835: : f_mode 2001d00000000 offset:4 orig:0
    perf-30229 [000] d..2 170161.535841: : f_mode 6001f00000000 offset:4 orig:0

    [...]

    There are 3 parameters the eBPF program tests/bpf-script-test-prologue.c
    accesses: f_mode (member of struct file at offset 140) offset and orig. They
    are parameters of the lseek() system call triggered in this test case in
    function llseek_loop().

    What is really strange is the value of f_mode. It is an 8 byte value, whereas
    in the probe event it is defined as a 4 byte value. The lower 4 bytes are all
    zero and do not belong to member f_mode. The correct value should be 2001d for
    read-only and 6001f for read-write open mode.

    Here is the output of the 'perf test -vv bpf' trace:
    Try to find probe point from debuginfo.
    Matched function: null_lseek [2d9310d]
    Probe point found: null_lseek+0
    Searching 'file' variable in context.
    Converting variable file into trace event.
    converting f_mode in file
    f_mode type is unsigned int.
    Opening /sys/kernel/debug/tracing//README write=0
    Searching 'offset' variable in context.
    Converting variable offset into trace event.
    offset type is long long int.
    Searching 'orig' variable in context.
    Converting variable orig into trace event.
    orig type is int.
    Found 1 probe_trace_events.
    Opening /sys/kernel/debug/tracing//kprobe_events write=1
    Writing event: p:perf_bpf_probe/func _text+8794224 f_mode=+140(%r2):x32
    ---- 8< ----

    This patch parses the type of each argument and converts data from memory to
    expected type.

    Now the test runs successfully on 4.13.0-rc5:

    [root@s8360046 perf]# ./perf test bpf
    38: BPF filter :
    38.1: Basic BPF filtering : Ok
    38.2: BPF pinning : Ok
    38.3: BPF prologue generation : Ok
    38.4: BPF relocation checker : Ok
    [root@s8360046 perf]#

    Signed-off-by: Wang Nan
    Cc: Hendrik Brueckner
    Link: http://lkml.kernel.org/r/20170815092159.31912-1-tmricht@linux.vnet.ibm.com
    Signed-off-by: Thomas-Mich Richter
    Signed-off-by: Arnaldo Carvalho de Melo

    Wang Nan
     

15 Aug, 2017

3 commits

  • If that is the case, or if the required lib is not present, e.g.
    elfutils-devel in Fedora systems, then just skip the tests requiring
    DWARF analysis.

    Before:

    # rpm -e elfutils-devel
    # perf test ping vfs_getname
    60: Use vfs_getname probe to get syscall args filenames : FAILED!
    61: probe libc's inet_pton & backtrace it with ping : Ok
    62: Check open filename arg using perf trace + vfs_getname: FAILED!
    63: Add vfs_getname probe to get syscall args filenames : FAILED!
    #

    After:

    # perf test vfs_getname
    60: Use vfs_getname probe to get syscall args filenames : Skip
    62: Check open filename arg using perf trace + vfs_getname: Skip
    63: Add vfs_getname probe to get syscall args filenames : Skip
    #

    Then, reinstalling elfutils-devel, rebuilding the tool and running
    again:

    # perf test vfs_getname
    60: Use vfs_getname probe to get syscall args filenames : Ok
    62: Check open filename arg using perf trace + vfs_getname: Ok
    63: Add vfs_getname probe to get syscall args filenames : Ok
    #

    Reported-by: Kim Phillips
    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-d67tvn401fxrwr97pu5ihfb1@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Add a library function that checks if 'perf probe' is built into the
    tool being tested, skipping tests that need it.

    Testing it on a system after removing the library needed to build
    'probe' as a perf subcommand:

    # perf test ping vfs_getname
    59: Use vfs_getname probe to get syscall args filenames : Skip
    60: probe libc's inet_pton & backtrace it with ping : Skip
    61: Check open filename arg using perf trace + vfs_getname: Skip
    62: Add vfs_getname probe to get syscall args filenames : Skip
    # perf probe
    perf: 'probe' is not a perf-command. See 'perf --help'.
    #

    Now reinstalling elfutils-libelf-devel on this Fedora 26 system to
    rebuild perf and then retest this:

    # perf test ping vfs_getname
    60: Use vfs_getname probe to get syscall args filenames : Ok
    61: probe libc's inet_pton & backtrace it with ping : Ok
    62: Check open filename arg using perf trace + vfs_getname: Ok
    63: Add vfs_getname probe to get syscall args filenames : Ok
    #

    Reported-by: Kim Phillips
    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-ctdck2gzsskqhjzu3ebb62zm@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Namhyung Kim
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-3zxjswdbs2au3ih0rino0iy1@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

12 Aug, 2017

7 commits

  • Installs a probe on libc's inet_pton function, that will use uprobes,
    then use 'perf trace' on a ping to localhost asking for just one packet
    with the a backtrace 3 levels deep, check that it is what we expect.
    This needs no debuginfo package, all is done using the libc ELF symtab
    and the CFI info in the binaries.

    Testing it:

    # perf test ping
    61: probe libc's inet_pton & backtrace it with ping : Ok

    In verbose mode:

    # perf test -v ping
    61: probe libc's inet_pton & backtrace it with ping :
    --- start ---
    test child forked, pid 1007
    PING ::1(::1) 56 data bytes
    64 bytes from ::1: icmp_seq=1 ttl=64 time=0.058 ms
    --- ::1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.058/0.058/0.058/0.000 ms
    0.000 probe_libc:inet_pton:(7f75fce12a20))
    __GI___inet_pton (/usr/lib64/libc-2.24.so)
    getaddrinfo (/usr/lib64/libc-2.24.so)
    _init (/usr/bin/ping)
    test child finished with 0
    ---- end ----
    probe libc's inet_pton & backtrace it with ping: Ok
    #

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-idrntt4nbg15aafu8hjmv7sk@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Uses the 'perf test shell' library to add probe:vfs_getname to the
    system then use it with 'perf trace' using 'touch' to write to a temp
    file, then checks that that was captured by the vfs_getname was used by
    'perf trace', that already handles "probe:vfs_getname" if present, and
    used in the "open" syscall "filename" argument beautifier.

    Testing it:

    # perf test "trace + vfs_getname"
    61: Check open filename arg using perf trace + vfs_getname: Ok
    #

    # perf test -v "trace + vfs_getname"
    61: Check open filename arg using perf trace + vfs_getname:
    --- start ---
    test child forked, pid 30846
    Added new event:
    probe:vfs_getname (on getname_flags:72 with pathname=result->name:string)

    You can now use it in all perf tools, such as:

    perf record -e probe:vfs_getname -aR sleep 1

    2.237 ( 0.012 ms): touch/30855 open(filename: /tmp/temporary_file.kmoWQ, flags: CREAT|NOCTTY|NONBLOCK|WRONLY, mode: IRUGO|IWUGO) = 3
    test child finished with 0
    ---- end ----
    Check open filename arg using perf trace + vfs_getname: Ok
    #

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-j02nobfvvn9c7yrphdsnbqx0@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • This test uses the 'perf test shell' library to add probe:vfs_getname to the
    system then use it with 'perf record' using 'touch' to write to a temp file,
    then checks that that was captured by the vfs_getname probe in the generated
    perf.data file, with the temp file name as the pathname argument.

    Using it:

    # perf test "Use vfs_getname"
    60: Use vfs_getname probe to get syscall args filenames: Ok
    # perf test -v "Use vfs_getname"
    60: Use vfs_getname probe to get syscall args filenames:
    --- start ---
    test child forked, pid 16414
    Added new event:
    probe:vfs_getname (on getname_flags:72 with pathname=result->name:string)

    You can now use it in all perf tools, such as:

    perf record -e probe:vfs_getname -aR sleep 1

    Recording open file:
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.022 MB /tmp/vaca.perf.data.QZsn7 (13 samples) ]
    Looking at perf.data file for vfs_getname records for the file we touched:
    touch 16421 [002] 1255152.879561: probe:vfs_getname: (ffffffffa626e608) pathname="/tmp/vaca.l10SL"
    test child finished with 0
    ---- end ----
    Use vfs_getname probe to get syscall args filenames: Ok
    #

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-t555fnhbcbxnukltk23dqxur@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Multiple tests will be able to reuse these functions, to test things
    like perf report, 'trace', etc, using this probe.

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-48xagvozhouhyi8fjota6o2d@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • First perf shell test:

    # perf test vfs_getname
    60: Add vfs_getname probe to get syscall args filenames: Ok
    #

    In verbose mode:

    # perf test -v vfs_getname
    60: Add vfs_getname probe to get syscall args filenames:
    --- start ---
    test child forked, pid 19146
    Added new event:
    probe:vfs_getname (on getname_flags:72 with pathname=result->name:string)

    You can now use it in all perf tools, such as:

    perf record -e probe:vfs_getname -aR sleep 1

    test child finished with 0
    ---- end ----
    Add vfs_getname probe to get syscall args filenames: Ok
    #

    And if the vmlinux file is not found:

    # mv ../build/v4.12.0-rc6+/vmlinux ../build/v4.12.0-rc6+/vmlinux.hidden
    # perf test vfs_getname
    60: Add vfs_getname probe to get syscall args filenames: Skip
    #

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-8f3n22c1yn516ev30s603ow2@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Before:

    # perf test Synth
    39: Synthesize thread map : Ok
    41: Synthesize cpu map : Ok
    42: Synthesize stat config : Ok
    43: Synthesize stat : Ok
    44: Synthesize stat round : Ok
    45: Synthesize attr update : Ok
    # perf test list Synth
    #

    After:

    # perf test Synth
    39: Synthesize thread map : Ok
    41: Synthesize cpu map : Ok
    42: Synthesize stat config : Ok
    43: Synthesize stat : Ok
    44: Synthesize stat round : Ok
    45: Synthesize attr update : Ok
    # perf test list Synth
    39: Synthesize thread map
    41: Synthesize cpu map
    42: Synthesize stat config
    43: Synthesize stat
    44: Synthesize stat round
    45: Synthesize attr update
    #

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-v95tqqzuwawsmds3zn2mosje@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • To allow testing by directly using perf tools in scripts, checking that
    the effects on the system are the ones expected and that the output
    produced is as well the desired one.

    For instance, adding a probe at a well known location with 'perf probe',
    then checking that the results from using that probe to record are the
    desired ones, etc.

    The next csets will introduce tests using this new testing
    infrastructure.

    The scripts should return 0 for Ok, 1 for FAIL and 2 for SKIP.

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-swbpn7amrjqffh83lsr39s9p@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

11 Aug, 2017

2 commits

  • This way we'll be able to pass more test specific parameters without
    having to change this function signature.

    Will be used by the upcoming 'shell tests', shell scripts that will
    call perf tools and check if they work as expected, comparing its
    effects on the system (think 'perf probe foo') the output produced, etc.

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-wq250w7j1opbzyiynozuajbl@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Before:

    # perf test Synth
    39: Synthesize thread map : Ok
    41: Synthesize cpu map : Ok
    42: Synthesize stat config : Ok
    43: Synthesize stat : Ok
    44: Synthesize stat round : Ok
    45: Synthesize attr update : Ok
    #
    # perf test list Synth
    1: Synthesize thread map
    2: Synthesize cpu map
    3: Synthesize stat config
    4: Synthesize stat
    5: Synthesize stat round
    6: Synthesize attr update
    #

    After:

    # perf test Synth
    39: Synthesize thread map : Ok
    41: Synthesize cpu map : Ok
    42: Synthesize stat config : Ok
    43: Synthesize stat : Ok
    44: Synthesize stat round : Ok
    45: Synthesize attr update : Ok
    #
    # perf test list Synth
    39: Synthesize thread map
    41: Synthesize cpu map
    42: Synthesize stat config
    43: Synthesize stat
    44: Synthesize stat round
    45: Synthesize attr update
    #

    Cc: Adrian Hunter
    Cc: David Ahern
    Cc: Jiri Olsa
    Cc: Matt Fleming
    Cc: Michael Petlan
    Cc: Namhyung Kim
    Cc: Thomas Richter
    Cc: Wang Nan
    Link: http://lkml.kernel.org/n/tip-pjhuhkphs7o3tkbqrukfv6bz@git.kernel.org
    Fixes: e8210cefb7e1 ("perf tests: Introduce iterator function for tests")
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

19 Jul, 2017

1 commit

  • Some of the stat events are quite rare to find on common machines (like
    front end cycles).

    Adding an 'optional' term to mark such events in attr tests. Event
    marked as optional will not fail the test case if it's not found in
    results.

    Signed-off-by: Jiri Olsa
    Cc: David Ahern
    Cc: Namhyung Kim
    Cc: Peter Zijlstra
    Cc: Thomas Richter
    Link: http://lkml.kernel.org/r/20170703145030.12903-15-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Jiri Olsa