Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / tools / perf / util / evsel.c
index 52c7d8884741c33b6f00ed938c934bdf900c57b3..5d7037ef7d3b7d43f0b38822e4de50131ab6b4d2 100644 (file)
@@ -37,6 +37,7 @@ static struct {
        bool clockid;
        bool clockid_wrong;
        bool lbr_flags;
+       bool write_backward;
 } perf_missing_features;
 
 static clockid_t clockid;
@@ -1376,6 +1377,8 @@ fallback_missing_features:
        if (perf_missing_features.lbr_flags)
                evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS |
                                     PERF_SAMPLE_BRANCH_NO_CYCLES);
+       if (perf_missing_features.write_backward)
+               evsel->attr.write_backward = false;
 retry_sample_id:
        if (perf_missing_features.sample_id_all)
                evsel->attr.sample_id_all = 0;
@@ -1438,6 +1441,12 @@ retry_open:
                                err = -EINVAL;
                                goto out_close;
                        }
+
+                       if (evsel->overwrite &&
+                           perf_missing_features.write_backward) {
+                               err = -EINVAL;
+                               goto out_close;
+                       }
                }
        }
 
@@ -1500,6 +1509,10 @@ try_fallback:
                          PERF_SAMPLE_BRANCH_NO_FLAGS))) {
                perf_missing_features.lbr_flags = true;
                goto fallback_missing_features;
+       } else if (!perf_missing_features.write_backward &&
+                       evsel->attr.write_backward) {
+               perf_missing_features.write_backward = true;
+               goto fallback_missing_features;
        }
 
 out_close: