perf top: Support lookup of symbols in other mount namespaces.
authorKrister Johansen <kjlx@templeofstupid.com>
Thu, 6 Jul 2017 01:48:12 +0000 (18:48 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 26 Jul 2017 01:43:16 +0000 (22:43 -0300)
The perf top command needs to unshare its fs from the helper threads in
order to successfully setns(2) during its symbol lookup.  It also needs
to impelement a force flag to ignore ownership of perf-<pid>.map files.

Signed-off-by: Krister Johansen <kjlx@templeofstupid.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com>
Link: http://lkml.kernel.org/r/1499305693-1599-6-git-send-email-kjlx@templeofstupid.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-top.txt
tools/perf/builtin-top.c

index e71d63843f45d493611cef226a87915427dfa0c2..d864ea6fd367efb63e1a9411f6e74e8d42ab3428 100644 (file)
@@ -237,6 +237,10 @@ Default is to monitor all CPUS.
 --hierarchy::
        Enable hierarchy output.
 
+--force::
+       Don't do ownership validation.
+
+
 INTERACTIVE PROMPTING KEYS
 --------------------------
 
index e5a8f249077fef709a03c90d896fa4e518823230..ee954bde7e3e800d308a41af7d70acc333802b67 100644 (file)
@@ -587,6 +587,13 @@ static void *display_thread_tui(void *arg)
                .refresh        = top->delay_secs,
        };
 
+       /* In order to read symbols from other namespaces perf to  needs to call
+        * setns(2).  This isn't permitted if the struct_fs has multiple users.
+        * unshare(2) the fs so that we may continue to setns into namespaces
+        * that we're observing.
+        */
+       unshare(CLONE_FS);
+
        perf_top__sort_new_samples(top);
 
        /*
@@ -628,6 +635,13 @@ static void *display_thread(void *arg)
        struct perf_top *top = arg;
        int delay_msecs, c;
 
+       /* In order to read symbols from other namespaces perf to  needs to call
+        * setns(2).  This isn't permitted if the struct_fs has multiple users.
+        * unshare(2) the fs so that we may continue to setns into namespaces
+        * that we're observing.
+        */
+       unshare(CLONE_FS);
+
        display_setup_sig();
        pthread__unblock_sigwinch();
 repeat:
@@ -1206,6 +1220,7 @@ int cmd_top(int argc, const char **argv)
                    "Show raw trace event output (do not use print fmt or plugins)"),
        OPT_BOOLEAN(0, "hierarchy", &symbol_conf.report_hierarchy,
                    "Show entries in a hierarchy"),
+       OPT_BOOLEAN(0, "force", &symbol_conf.force, "don't complain, do it"),
        OPT_END()
        };
        const char * const top_usage[] = {