Merge branch 'tip/perf/core-2' of git://git.kernel.org/pub/scm/linux/kernel/git/roste...
[cascardo/linux.git] / tools / perf / builtin-record.c
index e923165..5783c32 100644 (file)
 #include <sched.h>
 #include <sys/mman.h>
 
+#ifndef HAVE_ON_EXIT
+#ifndef ATEXIT_MAX
+#define ATEXIT_MAX 32
+#endif
+static int __on_exit_count = 0;
+typedef void (*on_exit_func_t) (int, void *);
+static on_exit_func_t __on_exit_funcs[ATEXIT_MAX];
+static void *__on_exit_args[ATEXIT_MAX];
+static int __exitcode = 0;
+static void __handle_on_exit_funcs(void);
+static int on_exit(on_exit_func_t function, void *arg);
+#define exit(x) (exit)(__exitcode = (x))
+
+static int on_exit(on_exit_func_t function, void *arg)
+{
+       if (__on_exit_count == ATEXIT_MAX)
+               return -ENOMEM;
+       else if (__on_exit_count == 0)
+               atexit(__handle_on_exit_funcs);
+       __on_exit_funcs[__on_exit_count] = function;
+       __on_exit_args[__on_exit_count++] = arg;
+       return 0;
+}
+
+static void __handle_on_exit_funcs(void)
+{
+       int i;
+       for (i = 0; i < __on_exit_count; i++)
+               __on_exit_funcs[i] (__exitcode, __on_exit_args[i]);
+}
+#endif
+
 enum write_mode_t {
        WRITE_FORCE,
        WRITE_APPEND
@@ -285,6 +317,11 @@ try_again:
                                          perf_evsel__name(pos));
                                rc = -err;
                                goto out;
+                       } else if ((err == EOPNOTSUPP) && (attr->precise_ip)) {
+                               ui__error("\'precise\' request may not be supported. "
+                                         "Try removing 'p' modifier\n");
+                               rc = -err;
+                               goto out;
                        }
 
                        printf("\n");
@@ -326,7 +363,8 @@ try_again:
                               "or try again with a smaller value of -m/--mmap_pages.\n"
                               "(current value: %d)\n", opts->mmap_pages);
                        rc = -errno;
-               } else if (!is_power_of_2(opts->mmap_pages)) {
+               } else if (!is_power_of_2(opts->mmap_pages) &&
+                          (opts->mmap_pages != UINT_MAX)) {
                        pr_err("--mmap_pages/-m value must be a power of two.");
                        rc = -EINVAL;
                } else {