}
        }
 
-       perf_evlist__enable(evsel_list);
+       /*
+        * When perf is starting the traced process, all the events
+        * (apart from group members) have enable_on_exec=1 set,
+        * so don't spoil it by prematurely enabling them.
+        */
+       if (!perf_target__none(&opts->target))
+               perf_evlist__enable(evsel_list);
 
        /*
         * Let the child rip
                        waking++;
                }
 
-               if (done)
+               /*
+                * When perf is starting the traced process, at the end events
+                * die with the process and we wait for that. Thus no need to
+                * disable events in this case.
+                */
+               if (done && !perf_target__none(&opts->target))
                        perf_evlist__disable(evsel_list);
        }
 
 
        return evsel->name ?: "unknown";
 }
 
+/*
+ * The enable_on_exec/disabled value strategy:
+ *
+ *  1) For any type of traced program:
+ *    - all independent events and group leaders are disabled
+ *    - all group members are enabled
+ *
+ *     Group members are ruled by group leaders. They need to
+ *     be enabled, because the group scheduling relies on that.
+ *
+ *  2) For traced programs executed by perf:
+ *     - all independent events and group leaders have
+ *       enable_on_exec set
+ *     - we don't specifically enable or disable any event during
+ *       the record command
+ *
+ *     Independent events and group leaders are initially disabled
+ *     and get enabled by exec. Group members are ruled by group
+ *     leaders as stated in 1).
+ *
+ *  3) For traced programs attached by perf (pid/tid):
+ *     - we specifically enable or disable all events during
+ *       the record command
+ *
+ *     When attaching events to already running traced we
+ *     enable/disable events specifically, as there's no
+ *     initial traced exec call.
+ */
 void perf_evsel__config(struct perf_evsel *evsel,
                        struct perf_record_opts *opts)
 {
        struct perf_event_attr *attr = &evsel->attr;
        int track = !evsel->idx; /* only the first counter needs these */
 
-       attr->disabled = 1;
        attr->sample_id_all = opts->sample_id_all_missing ? 0 : 1;
        attr->inherit       = !opts->no_inherit;
        attr->read_format   = PERF_FORMAT_TOTAL_TIME_ENABLED |
        attr->mmap = track;
        attr->comm = track;
 
+       /*
+        * XXX see the function comment above
+        *
+        * Disabling only independent events or group leaders,
+        * keeping group members enabled.
+        */
+       if (!evsel->leader)
+               attr->disabled = 1;
+
+       /*
+        * Setting enable_on_exec for independent events and
+        * group leaders for traced executed by perf.
+        */
        if (perf_target__none(&opts->target) && (!evsel->leader))
                attr->enable_on_exec = 1;
 }