vmscan: fix a livelock in kswapd
[pandora-kernel.git] / tools / perf / builtin-top.c
index 2d7934e..f2f3f49 100644 (file)
@@ -62,8 +62,6 @@
 #include <linux/unistd.h>
 #include <linux/types.h>
 
-#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
-
 static struct perf_top top = {
        .count_filter           = 5,
        .delay_secs             = 2,
@@ -82,6 +80,8 @@ static bool                   use_tui, use_stdio;
 
 static int                     default_interval                =      0;
 
+static bool                    kptr_restrict_warned;
+static bool                    vmlinux_warned;
 static bool                    inherit                         =  false;
 static int                     realtime_prio                   =      0;
 static bool                    group                           =  false;
@@ -740,7 +740,22 @@ static void perf_event__process_sample(const union perf_event *event,
            al.filtered)
                return;
 
+       if (!kptr_restrict_warned &&
+           symbol_conf.kptr_restrict &&
+           al.cpumode == PERF_RECORD_MISC_KERNEL) {
+               ui__warning(
+"Kernel address maps (/proc/{kallsyms,modules}) are restricted.\n\n"
+"Check /proc/sys/kernel/kptr_restrict.\n\n"
+"Kernel%s samples will not be resolved.\n",
+                         !RB_EMPTY_ROOT(&al.map->dso->symbols[MAP__FUNCTION]) ?
+                         " modules" : "");
+               if (use_browser <= 0)
+                       sleep(5);
+               kptr_restrict_warned = true;
+       }
+
        if (al.sym == NULL) {
+               const char *msg = "Kernel samples will not be resolved.\n";
                /*
                 * As we do lazy loading of symtabs we only will know if the
                 * specified vmlinux file is invalid when we actually have a
@@ -752,12 +767,20 @@ static void perf_event__process_sample(const union perf_event *event,
                 * --hide-kernel-symbols, even if the user specifies an
                 * invalid --vmlinux ;-)
                 */
-               if (al.map == machine->vmlinux_maps[MAP__FUNCTION] &&
+               if (!kptr_restrict_warned && !vmlinux_warned &&
+                   al.map == machine->vmlinux_maps[MAP__FUNCTION] &&
                    RB_EMPTY_ROOT(&al.map->dso->symbols[MAP__FUNCTION])) {
-                       ui__warning("The %s file can't be used\n",
-                                   symbol_conf.vmlinux_name);
-                       exit_browser(0);
-                       exit(1);
+                       if (symbol_conf.vmlinux_name) {
+                               ui__warning("The %s file can't be used.\n%s",
+                                           symbol_conf.vmlinux_name, msg);
+                       } else {
+                               ui__warning("A vmlinux file was not found.\n%s",
+                                           msg);
+                       }
+
+                       if (use_browser <= 0)
+                               sleep(5);
+                       vmlinux_warned = true;
                }
 
                return;