Merge branch 'akpm' (patches from Andrew)
[linux-2.6-microblaze.git] / tools / perf / builtin-record.c
index 671a21c..b3509d9 100644 (file)
@@ -910,7 +910,8 @@ static int record__open(struct record *rec)
                 * Enable the dummy event when the process is forked for
                 * initial_delay, immediately for system wide.
                 */
-               if (opts->initial_delay && !pos->immediate)
+               if (opts->initial_delay && !pos->immediate &&
+                   !target__has_cpu(&opts->target))
                        pos->core.attr.enable_on_exec = 1;
                else
                        pos->immediate = 1;
@@ -1387,7 +1388,6 @@ static int record__synthesize(struct record *rec, bool tail)
        struct perf_data *data = &rec->data;
        struct record_opts *opts = &rec->opts;
        struct perf_tool *tool = &rec->tool;
-       int fd = perf_data__fd(data);
        int err = 0;
        event_op f = process_synthesized_event;
 
@@ -1395,41 +1395,12 @@ static int record__synthesize(struct record *rec, bool tail)
                return 0;
 
        if (data->is_pipe) {
-               /*
-                * We need to synthesize events first, because some
-                * features works on top of them (on report side).
-                */
-               err = perf_event__synthesize_attrs(tool, rec->evlist,
-                                                  process_synthesized_event);
-               if (err < 0) {
-                       pr_err("Couldn't synthesize attrs.\n");
-                       goto out;
-               }
-
-               err = perf_event__synthesize_features(tool, session, rec->evlist,
+               err = perf_event__synthesize_for_pipe(tool, session, data,
                                                      process_synthesized_event);
-               if (err < 0) {
-                       pr_err("Couldn't synthesize features.\n");
-                       return err;
-               }
+               if (err < 0)
+                       goto out;
 
-               if (have_tracepoints(&rec->evlist->core.entries)) {
-                       /*
-                        * FIXME err <= 0 here actually means that
-                        * there were no tracepoints so its not really
-                        * an error, just that we don't need to
-                        * synthesize anything.  We really have to
-                        * return this more properly and also
-                        * propagate errors that now are calling die()
-                        */
-                       err = perf_event__synthesize_tracing_data(tool, fd, rec->evlist,
-                                                                 process_synthesized_event);
-                       if (err <= 0) {
-                               pr_err("Couldn't record tracing data.\n");
-                               goto out;
-                       }
-                       rec->bytes_written += err;
-               }
+               rec->bytes_written += err;
        }
 
        err = perf_event__synth_time_conv(record__pick_pc(rec), tool,
@@ -1681,7 +1652,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
                signal(SIGUSR2, SIG_IGN);
        }
 
-       session = perf_session__new(data, false, tool);
+       session = perf_session__new(data, tool);
        if (IS_ERR(session)) {
                pr_err("Perf session creation failed.\n");
                return PTR_ERR(session);
@@ -2786,7 +2757,7 @@ int cmd_record(int argc, const char **argv)
 
        if (rec->opts.affinity != PERF_AFFINITY_SYS) {
                rec->affinity_mask.nbits = cpu__max_cpu();
-               rec->affinity_mask.bits = bitmap_alloc(rec->affinity_mask.nbits);
+               rec->affinity_mask.bits = bitmap_zalloc(rec->affinity_mask.nbits);
                if (!rec->affinity_mask.bits) {
                        pr_err("Failed to allocate thread mask for %zd cpus\n", rec->affinity_mask.nbits);
                        err = -ENOMEM;
@@ -2884,6 +2855,13 @@ int cmd_record(int argc, const char **argv)
        /* Enable ignoring missing threads when -u/-p option is defined. */
        rec->opts.ignore_missing_thread = rec->opts.target.uid != UINT_MAX || rec->opts.target.pid;
 
+       if (evlist__fix_hybrid_cpus(rec->evlist, rec->opts.target.cpu_list)) {
+               pr_err("failed to use cpu list %s\n",
+                      rec->opts.target.cpu_list);
+               goto out;
+       }
+
+       rec->opts.target.hybrid = perf_pmu__has_hybrid();
        err = -ENOMEM;
        if (evlist__create_maps(rec->evlist, &rec->opts.target) < 0)
                usage_with_options(record_usage, record_options);