• Tony Jones's avatar
    perf script python: Add trace_context extension module to sys.modules · cc437642
    Tony Jones authored
    In Python3, the result of PyModule_Create (called from
    scripts/python/Perf-Trace-Util/Context.c) is not automatically added to
    sys.modules.  See: https://bugs.python.org/issue4592
    
    Below is the observed behavior without the fix:
    
      # ldd /usr/bin/perf | grep -i python
    	libpython3.6m.so.1.0 => /usr/lib64/libpython3.6m.so.1.0 (0x00007f8e1dfb2000)
    
      # perf record /bin/false
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.015 MB perf.data (17 samples) ]
    
      # perf script -g python | cat
      generated Python script: perf-script.py
    
      # perf script -s ./perf-script.py
      Traceback (most recent call last):
        File "./perf-script.py", line 18, in <module>
          from perf_trace_context import *
      ModuleNotFoundError: No module named 'perf_trace_context'
      Error running python script ./perf-script.py
      #
    
    Committer notes:
    
    To build with python3 use:
    
      $ make -C tools/perf PYTHON=python3
    
    Use a non-const variable to pass the 'name' arg to
    PyImport_AppendInittab(), as python2.6 has that as 'char *', which ends
    up trowing this in some environments:
    
       CC       /tmp/build/perf/util/parse-branch-options.o
      util/scripting-engines/trace-event-python.c: In function 'python_start_script':
      util/scripting-engines/trace-event-python.c:1520:2: error: passing argument 1 of 'PyImport_AppendInittab' discards 'const' qualifier from pointer target type [-Werror]
        PyImport_AppendInittab("perf_trace_context", initfunc);
        ^
      In file included from /usr/include/python2.6/Python.h:130:0,
                       from util/scripting-engines/trace-event-python.c:22:
      /usr/include/python2.6/import.h:54:17: note: expected 'char *' but argument is of type 'const char *'
       PyAPI_FUNC(int) PyImport_AppendInittab(char *name, void (*initfunc)(void));
                       ^
      cc1: all warnings being treated as errors
    Signed-off-by: default avatarTony Jones <tonyj@suse.de>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jaroslav Škarvada <jskarvad@redhat.com>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
    Cc: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com>
    Fixes: 66dfdff0 ("perf tools: Add Python 3 support")
    Link: http://lkml.kernel.org/r/20190124005229.16146-2-tonyj@suse.deSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    cc437642
trace-event-python.c 46 KB