This bug is missing log files that will aid in diagnosing the problem.
While running an Ubuntu kernel (not a mainline or third-party kernel)
please enter the following command in a terminal window:

apport-collect 2008971

and then change the status of the bug to 'Confirmed'.

If, due to the nature of the issue you have encountered, you are unable
to run this command, please add a comment stating that fact and change
the bug status to 'Confirmed'.

This change has been made by an automated script, maintained by the
Ubuntu Kernel Team.

** Changed in: linux (Ubuntu)
       Status: New => Incomplete

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/2008971

Title:
  Do not sort the task scan result from /proc when synthesizing perf
  events

Status in linux package in Ubuntu:
  Incomplete

Bug description:
  [Impact]
  The perf tool use scandir() to iterate threads and sort in alphabetical order 
when synthesizing PERF_RECORD_ events.
  If the process ID is 9999 and it has one thread (tid = 10000), the thread 
will be processed before the process.
  It results in PERF_RECORD_FORK events that come before PERF_RECORD_MMAP2 
events.
  The callstack will have missing symbols for threads where `PERF_RECORD_FORK` 
events are processed before the `PERF_RECORD_MMAP2` event for the corresponding 
process. 

  [Fix]
  Do not use alphasort when calling scandir()

  363afa3aef24f5e08df6a539f5dc3aae4cddcc1a (perf synthetic-events: Don't
  sort the task scan result from /proc)

  [Test Plan]
  <test.lua>
  function update_last_pid()
    local file <close> = io.open("/proc/sys/kernel/ns_last_pid", "w")
    file:write(9997)
  end

  update_last_pid()
  os.execute("~/reproducer")

  <reproducer.cpp>
  #include <iostream>
  #include <thread>
  #include <unistd.h>

  constexpr int kThreadNum = 10;

  void thread_job() { sleep(30); }

  int main(void) {
    std::thread threads[kThreadNum];

    std::cout << "Parent process with pid " << getpid() << std::endl;

    for (int i = 0; i < kThreadNum; ++i) {
      threads[i] = std::thread(thread_job);
    }

    for (int i = 0; i < kThreadNum; ++i) {
      threads[i].join();
    }

    std::cout << "All threads have finished" << std::endl;
    return 0;
  }

  The flow is to set /proc/sys/kernel/ns_last_pid first, which represents the 
last pid allocated in the current pid namespace.
  The script (test.lua) sets ns_last_pid to 9997 and executes the reproducer 
(reproducer.cpp).
  After the reproducer creates ten threads, we execute the perf command as 
follows: perf record -F 49 -e cpu-clock -a -g sleep 20.
  Here is the result of command: perf report -f --tasks --mmaps -D | egrep -i 
'perf_record_fork|perf_record_mmap' | grep 9999

  Before applying the patch, the output of the perf command was as follows:
  0 0 0x34910 [0x40]: PERF_RECORD_FORK(9999:10000):(9999:9999)
  0 0 0x34990 [0x40]: PERF_RECORD_FORK(9999:10001):(9999:9999)
  0 0 0x34a10 [0x40]: PERF_RECORD_FORK(9999:10002):(9999:9999)
  0 0 0x34a90 [0x40]: PERF_RECORD_FORK(9999:10003):(9999:9999)
  0 0 0x34b10 [0x40]: PERF_RECORD_FORK(9999:10004):(9999:9999)
  0 0 0x34b90 [0x40]: PERF_RECORD_FORK(9999:10005):(9999:9999)
  0 0 0x34c10 [0x40]: PERF_RECORD_FORK(9999:10006):(9999:9999)
  0 0 0x34c90 [0x40]: PERF_RECORD_FORK(9999:10007):(9999:9999)
  0 0 0x34d10 [0x40]: PERF_RECORD_FORK(9999:10008):(9999:9999)
  0 0 0x34d90 [0x40]: PERF_RECORD_FORK(9999:10009):(9999:9999)
  0 0 0x34e10 [0x40]: PERF_RECORD_FORK(9999:9999):(9998:9998)
  0 0 0x34e90 [0x80]: PERF_RECORD_MMAP2 9999/9999: [0x555de0159000(0x1000) @ 
0x1000 fd:00 2097758 0]: r-xp /root/reproducer
  0 0 0x34f10 [0x90]: PERF_RECORD_MMAP2 9999/9999: [0x7f9cd17f8000(0x7c000) @ 
0xe000 fd:00 1055098 0]: r-xp /usr/lib/x86_64-linux-gnu/libm.so.6
  0 0 0x34fa0 [0x90]: PERF_RECORD_MMAP2 9999/9999: [0x7f9cd18f9000(0x195000) @ 
0x28000 fd:00 1054988 0]: r-xp /usr/lib/x86_64-linux-gnu/libc.so.6
  0 0 0x35030 [0x90]: PERF_RECORD_MMAP2 9999/9999: [0x7f9cd1afc000(0x17000) @ 
0x3000 fd:00 1054745 0]: r-xp /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
  0 0 0x350c0 [0x98]: PERF_RECORD_MMAP2 9999/9999: [0x7f9cd1bb3000(0x110000) @ 
0x9a000 fd:00 1068050 0]: r-xp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
  0 0 0x35158 [0x98]: PERF_RECORD_MMAP2 9999/9999: [0x7f9cd1d4e000(0x2a000) @ 
0x2000 fd:00 1054949 0]: r-xp /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
  0 0 0x351f0 [0x70]: PERF_RECORD_MMAP2 9999/9999: [0x7ffc983bb000(0x2000) @ 0 
00:00 0 0]: r-xp [vdso]
  0 0 0x35260 [0x78]: PERF_RECORD_MMAP2 9999/9999: [0xffffffffff600000(0x1000) 
@ 0 00:00 0 0]: --xp [vsyscall]

  After applying the patch, the output of the perf command is as follows:
  0 0 0x30c28 [0x40]: PERF_RECORD_FORK(9999:9999):(9998:9998)
  0 0 0x30ca8 [0x80]: PERF_RECORD_MMAP2 9999/9999: [0x5642c7635000(0x1000) @ 
0x1000 fd:00 2097758 0]: r-xp /root/reproducer
  0 0 0x30d28 [0x90]: PERF_RECORD_MMAP2 9999/9999: [0x7f8ada03d000(0x7c000) @ 
0xe000 fd:00 1055098 0]: r-xp /usr/lib/x86_64-linux-gnu/libm.so.6
  0 0 0x30db8 [0x90]: PERF_RECORD_MMAP2 9999/9999: [0x7f8ada13e000(0x195000) @ 
0x28000 fd:00 1054988 0]: r-xp /usr/lib/x86_64-linux-gnu/libc.so.6
  0 0 0x30e48 [0x90]: PERF_RECORD_MMAP2 9999/9999: [0x7f8ada341000(0x17000) @ 
0x3000 fd:00 1054745 0]: r-xp /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
  0 0 0x30ed8 [0x98]: PERF_RECORD_MMAP2 9999/9999: [0x7f8ada3f8000(0x110000) @ 
0x9a000 fd:00 1068050 0]: r-xp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
  0 0 0x30f70 [0x98]: PERF_RECORD_MMAP2 9999/9999: [0x7f8ada593000(0x2a000) @ 
0x2000 fd:00 1054949 0]: r-xp /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
  0 0 0x31008 [0x70]: PERF_RECORD_MMAP2 9999/9999: [0x7ffcb2116000(0x2000) @ 0 
00:00 0 0]: r-xp [vdso]
  0 0 0x31078 [0x78]: PERF_RECORD_MMAP2 9999/9999: [0xffffffffff600000(0x1000) 
@ 0 00:00 0 0]: --xp [vsyscall]
  0 0 0x310f0 [0x40]: PERF_RECORD_FORK(9999:10000):(9999:9999)
  0 0 0x31170 [0x40]: PERF_RECORD_FORK(9999:10001):(9999:9999)
  0 0 0x311f0 [0x40]: PERF_RECORD_FORK(9999:10002):(9999:9999)
  0 0 0x31270 [0x40]: PERF_RECORD_FORK(9999:10003):(9999:9999)
  0 0 0x312f0 [0x40]: PERF_RECORD_FORK(9999:10004):(9999:9999)
  0 0 0x31370 [0x40]: PERF_RECORD_FORK(9999:10005):(9999:9999)
  0 0 0x313f0 [0x40]: PERF_RECORD_FORK(9999:10006):(9999:9999)
  0 0 0x31470 [0x40]: PERF_RECORD_FORK(9999:10007):(9999:9999)
  0 0 0x314f0 [0x40]: PERF_RECORD_FORK(9999:10008):(9999:9999)
  0 0 0x31570 [0x40]: PERF_RECORD_FORK(9999:10009):(9999:9999)

  [Where problems could occur]
  The fix will apply upstream commits, so the regression can be considered as 
low.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2008971/+subscriptions


-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : kernel-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to