Skip to content
  • Jaroslav Škarvada's avatar
    perf tools: Add Python 3 support · 66dfdff0
    Jaroslav Škarvada authored
    
    
    Added Python 3 support while keeping Python 2.7 compatibility.
    
    Committer notes:
    
    This doesn't make it to auto detect python 3, one has to explicitely ask
    it to build with python 3 devel files, here are the instructions
    provided by Jaroslav:
    
     ---
      $ cp -a tools/perf tools/python3-perf
      $ make V=1 prefix=/usr -C tools/perf PYTHON=/usr/bin/python2 all
      $ make V=1 prefix=/usr -C tools/python3-perf PYTHON=/usr/bin/python3 all
      $ make V=1 prefix=/usr -C tools/python3-perf PYTHON=/usr/bin/python3 DESTDIR=%{buildroot} install-python_ext
      $ make V=1 prefix=/usr -C tools/perf PYTHON=/usr/bin/python2 DESTDIR=%{buildroot} install-python_ext
     ---
    
    We need to make this automatic, just like the existing tests for checking if
    the python2 devel files are in place, allowing the build with python3 if
    available, fallbacking to python2 and then just disabling it if none are
    available.
    
    So, using the PYTHON variable to build it using O= we get:
    
    Before this patch:
    
      $ rpm -q python3 python3-devel
      python3-3.6.4-7.fc27.x86_64
      python3-devel-3.6.4-7.fc27.x86_64
      $ rm -rf /tmp/build/perf/ ; mkdir -p /tmp/build/perf ; make O=/tmp/build/perf PYTHON=/usr/bin/python3 -C tools/perf install-bin
      make: Entering directory '/home/acme/git/linux/tools/perf'
      <SNIP>
      Makefile.config:670: Python 3 is not yet supported; please set
      Makefile.config:671: PYTHON and/or PYTHON_CONFIG appropriately.
      Makefile.config:672: If you also have Python 2 installed, then
      Makefile.config:673: try something like:
      Makefile.config:674:
      Makefile.config:675:   make PYTHON=python2
      Makefile.config:676:
      Makefile.config:677: Otherwise, disable Python support entirely:
      Makefile.config:678:
      Makefile.config:679:   make NO_LIBPYTHON=1
      Makefile.config:680:
      Makefile.config:681: *** .  Stop.
      make[1]: *** [Makefile.perf:212: sub-make] Error 2
      make: *** [Makefile:110: install-bin] Error 2
      make: Leaving directory '/home/acme/git/linux/tools/perf'
      $
    
    After:
    
      $ make O=/tmp/build/perf PYTHON=python3 -C tools/perf install-bin
      $ ldd ~/bin/perf | grep python
    	libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007f58a31e8000)
      $ rpm -qf /lib64/libpython3.6m.so.1.0
      python3-libs-3.6.4-7.fc27.x86_64
      $
    
    Now verify that when using the binding the right ELF file is loaded,
    using perf trace:
    
      $ perf trace -e open* perf test python
         0.051 ( 0.016 ms): perf/3927 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC           ) = 3
    <SNIP>
      18: 'import perf' in python                               :
         8.849 ( 0.013 ms): sh/3929 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC           ) = 3
    <SNIP>
        25.572 ( 0.008 ms): python3/3931 openat(dfd: CWD, filename: /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so, flags: CLOEXEC) = 3
    <SNIP>
     Ok
    <SNIP>
      $
    
    And using tools/perf/python/twatch.py, to show PERF_RECORD_ metaevents:
    
      $ python3 tools/perf/python/twatch.py
      cpu: 3, pid: 16060, tid: 16060 { type: fork, pid: 5207, ppid: 16060, tid: 5207, ptid: 16060, time: 10798513015459}
      cpu: 3, pid: 16060, tid: 16060 { type: fork, pid: 5208, ppid: 16060, tid: 5208, ptid: 16060, time: 10798513562503}
      cpu: 0, pid: 5208, tid: 5208 { type: comm, pid: 5208, tid: 5208, comm: grep }
      cpu: 2, pid: 5207, tid: 5207 { type: comm, pid: 5207, tid: 5207, comm: ps }
      cpu: 2, pid: 5207, tid: 5207 { type: exit, pid: 5207, ppid: 5207, tid: 5207, ptid: 5207, time: 10798551337484}
      cpu: 3, pid: 5208, tid: 5208 { type: exit, pid: 5208, ppid: 5208, tid: 5208, ptid: 5208, time: 10798551292153}
      cpu: 3, pid: 601, tid: 601 { type: fork, pid: 5209, ppid: 601, tid: 5209, ptid: 601, time: 10801779977324}
      ^CTraceback (most recent call last):
        File "tools/perf/python/twatch.py", line 68, in <module>
          main()
        File "tools/perf/python/twatch.py", line 40, in main
          evlist.poll(timeout = -1)
      KeyboardInterrupt
      $
    
      # ps ax|grep twatch
     5197 pts/8    S+     0:00 python3 tools/perf/python/twatch.py
      # ls -la /proc/5197/smaps
      -r--r--r--. 1 acme acme 0 Feb 19 13:14 /proc/5197/smaps
      # grep python /proc/5197/smaps
      558111307000-558111309000 r-xp 00000000 fd:00 3151710  /usr/bin/python3.6
      558111508000-558111509000 r--p 00001000 fd:00 3151710  /usr/bin/python3.6
      558111509000-55811150a000 rw-p 00002000 fd:00 3151710  /usr/bin/python3.6
      7ffad6fc1000-7ffad7008000 r-xp 00000000 00:2d 220196   /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
      7ffad7008000-7ffad7207000 ---p 00047000 00:2d 220196   /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
      7ffad7207000-7ffad7208000 r--p 00046000 00:2d 220196   /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
      7ffad7208000-7ffad7215000 rw-p 00047000 00:2d 220196   /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
      7ffadea77000-7ffaded3d000 r-xp 00000000 fd:00 3151795  /usr/lib64/libpython3.6m.so.1.0
      7ffaded3d000-7ffadef3c000 ---p 002c6000 fd:00 3151795  /usr/lib64/libpython3.6m.so.1.0
      7ffadef3c000-7ffadef42000 r--p 002c5000 fd:00 3151795  /usr/lib64/libpython3.6m.so.1.0
      7ffadef42000-7ffadefa5000 rw-p 002cb000 fd:00 3151795  /usr/lib64/libpython3.6m.so.1.0
      #
    
    And with this patch, but building normally, without specifying the
    PYTHON=python3 part, which will make it use python2 if its devel files are
    available, like in this test:
    
      $ make O=/tmp/build/perf -C tools/perf install-bin
      $ ldd ~/bin/perf | grep python
    	libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f6a44410000)
      $ ldd /tmp/build/perf/python_ext_build/lib/perf.so  | grep python
    	libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fed28a2c000)
      $
    
      [acme@jouet perf]$ tools/perf/python/twatch.py
      cpu: 0, pid: 2817, tid: 2817 { type: fork, pid: 2817, ppid: 2817, tid: 8910, ptid: 2817, time: 11126454335306}
      cpu: 0, pid: 2817, tid: 2817 { type: comm, pid: 2817, tid: 8910, comm: worker }
      $ ps ax | grep twatch.py
       8909 pts/8    S+     0:00 /usr/bin/python tools/perf/python/twatch.py
      $ grep python /proc/8909/smaps
      5579de658000-5579de659000 r-xp 00000000 fd:00 3156044  /usr/bin/python2.7
      5579de858000-5579de859000 r--p 00000000 fd:00 3156044  /usr/bin/python2.7
      5579de859000-5579de85a000 rw-p 00001000 fd:00 3156044  /usr/bin/python2.7
      7f0de01f7000-7f0de023e000 r-xp 00000000 00:2d 230695   /tmp/build/perf/python/perf.so
      7f0de023e000-7f0de043d000 ---p 00047000 00:2d 230695   /tmp/build/perf/python/perf.so
      7f0de043d000-7f0de043e000 r--p 00046000 00:2d 230695   /tmp/build/perf/python/perf.so
      7f0de043e000-7f0de044b000 rw-p 00047000 00:2d 230695   /tmp/build/perf/python/perf.so
      7f0de6f0f000-7f0de6f13000 r-xp 00000000 fd:00 134975   /usr/lib64/python2.7/lib-dynload/_localemodule.so
      7f0de6f13000-7f0de7113000 ---p 00004000 fd:00 134975   /usr/lib64/python2.7/lib-dynload/_localemodule.so
      7f0de7113000-7f0de7114000 r--p 00004000 fd:00 134975   /usr/lib64/python2.7/lib-dynload/_localemodule.so
      7f0de7114000-7f0de7115000 rw-p 00005000 fd:00 134975   /usr/lib64/python2.7/lib-dynload/_localemodule.so
      7f0de7e73000-7f0de8052000 r-xp 00000000 fd:00 3173292  /usr/lib64/libpython2.7.so.1.0
      7f0de8052000-7f0de8251000 ---p 001df000 fd:00 3173292  /usr/lib64/libpython2.7.so.1.0
      7f0de8251000-7f0de8255000 r--p 001de000 fd:00 3173292  /usr/lib64/libpython2.7.so.1.0
      7f0de8255000-7f0de8291000 rw-p 001e2000 fd:00 3173292  /usr/lib64/libpython2.7.so.1.0
      $
    
    Signed-off-by: default avatarJaroslav Škarvada <jskarvad@redhat.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    LPU-Reference: 20180119205641.24242-1-jskarvad@redhat.com
    Link: https://lkml.kernel.org/n/tip-8d7dt9kqp83vsz25hagug8fu@git.kernel.org
    
    
    [ Removed explicit check for python version, allowing it to really build with python3 ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    66dfdff0