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 <k...@templeofstupid.com>
---
 tools/perf/builtin-top.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 2bcfa46..c918fef 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -586,6 +586,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.
+        */
+       (void) unshare(CLONE_FS);
+
        perf_top__sort_new_samples(top);
 
        /*
@@ -627,6 +634,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.
+        */
+       (void) unshare(CLONE_FS);
+
        display_setup_sig();
        pthread__unblock_sigwinch();
 repeat:
@@ -1205,6 +1219,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[] = {
-- 
2.7.4

Reply via email to