• Leo Yan's avatar
    perf synthetic-events: Return error if procfs isn't mounted for PID namespaces · bc9c806e
    Leo Yan authored
    For perf recording, it retrieves process info by iterating nodes in proc
    fs.  If we run perf in a non-root PID namespace with command:
    
      # unshare --fork --pid perf record -e cycles -a -- test_program
    
    ... in this case, unshare command creates a child PID namespace and
    launches perf tool in it, but the issue is the proc fs is not mounted
    for the non-root PID namespace, this leads to the perf tool gathering
    process info from its parent PID namespace.
    
    We can use below command to observe the process nodes under proc fs:
    
      # unshare --pid --fork ls /proc
    1    137   1968  2128  3    342  48  62   78	     crypto	  kcore        net	      uptime
    10   138   2	 2142  30   35	 49  63   8	     devices	  keys	       pagetypeinfo   version
    11   139   20	 2143  304  36	 50  64   82	     device-tree  key-users    partitions     vmallocinfo
    12   14    2011  22    305  37	 51  65   83	     diskstats	  kmsg	       self	      vmstat
    128  140   2038  23    307  39	 52  656  84	     driver	  kpagecgroup  slabinfo       zoneinfo
    129  15    2074  24    309  4	 53  67   9	     execdomains  kpagecount   softirqs
    13   16    2094  241   31   40	 54  68   asound     fb		  kpageflags   stat
    130  164   2096  242   310  41	 55  69   buddyinfo  filesystems  loadavg      swaps
    131  17    2098  25    317  42	 56  70   bus	     fs		  locks        sys
    132  175   21	 26    32   43	 57  71   cgroups    interrupts   meminfo      sysrq-trigger
    133  179   2102  263   329  44	 58  75   cmdline    iomem	  misc	       sysvipc
    134  1875  2103  27    330  45	 59  76   config.gz  ioports	  modules      thread-self
    135  19    2117  29    333  46	 6   77   consoles   irq	  mounts       timer_list
    136  1941  2121  298   34   47	 60  773  cpuinfo    kallsyms	  mtd	       tty
    
    So it shows many existed tasks, since unshared command has not mounted
    the proc fs for the new created PID namespace, it still accesses the
    proc fs of the root PID namespace.  This leads to two prominent issues:
    
    - Firstly, PID values are mismatched between thread info and samples.
      The gathered thread info are coming from the proc fs of the root PID
      namespace, but samples record its PID from the child PID namespace.
    
    - The second issue is profiled program 'test_program' returns its forked
      PID number from the child PID namespace, perf tool wrongly uses this
      PID number to retrieve the process info via the proc fs of the root
      PID namespace.
    
    To avoid issues, we need to mount proc fs for the child PID namespace
    with the option '--mount-proc' when use unshare command:
    
      # unshare --fork --pid --mount-proc perf record -e cycles -a -- test_program
    
    Conversely, when the proc fs of the root PID namespace is used by child
    namespace, perf tool can detect the multiple PID levels and
    nsinfo__is_in_root_namespace() returns false, this patch reports error
    for this case:
    
      # unshare --fork --pid perf record -e cycles -a -- test_program
      Couldn't synthesize bpf events.
      Perf runs in non-root PID namespace but it tries to gather process info from its parent PID namespace.
      Please mount the proc file system properly, e.g. add the option '--mount-proc' for unshare command.
    Reviewed-by: default avatarJames Clark <james.clark@arm.com>
    Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Andrii Nakryiko <andrii@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: John Fastabend <john.fastabend@gmail.com>
    Cc: KP Singh <kpsingh@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: Yonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/r/20211224124014.2492751-1-leo.yan@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    bc9c806e
synthetic-events.c 54.9 KB