perf: Use sample_flags for addr
authorNamhyung Kim <namhyung@kernel.org>
Wed, 21 Sep 2022 22:00:31 +0000 (15:00 -0700)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 27 Sep 2022 20:50:24 +0000 (22:50 +0200)
Use the new sample_flags to indicate whether the addr field is filled by
the PMU driver.  As most PMU drivers pass 0, it can set the flag only if
it has a non-zero value.  And use 0 in perf_sample_output() if it's not
filled already.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20220921220032.2858517-1-namhyung@kernel.org
arch/x86/events/intel/ds.c
include/linux/perf_event.h
kernel/events/core.c

index 4ba6ab6d0d92a0d8cc8812814d35115dc3caec47..d2e9ff16f6eda6a1658d26acd66c29990d1a739f 100644 (file)
@@ -1621,8 +1621,10 @@ static void setup_pebs_fixed_sample_data(struct perf_event *event,
 
 
        if ((sample_type & PERF_SAMPLE_ADDR_TYPE) &&
-           x86_pmu.intel_cap.pebs_format >= 1)
+           x86_pmu.intel_cap.pebs_format >= 1) {
                data->addr = pebs->dla;
+               data->sample_flags |= PERF_SAMPLE_ADDR;
+       }
 
        if (x86_pmu.intel_cap.pebs_format >= 2) {
                /* Only set the TSX weight when no memory weight. */
@@ -1783,8 +1785,10 @@ static void setup_pebs_adaptive_sample_data(struct perf_event *event,
                        data->sample_flags |= PERF_SAMPLE_DATA_SRC;
                }
 
-               if (sample_type & PERF_SAMPLE_ADDR_TYPE)
+               if (sample_type & PERF_SAMPLE_ADDR_TYPE) {
                        data->addr = meminfo->address;
+                       data->sample_flags |= PERF_SAMPLE_ADDR;
+               }
 
                if (sample_type & PERF_SAMPLE_TRANSACTION) {
                        data->txn = intel_get_tsx_transaction(meminfo->tsx_tuning,
index 368bdc4f563f765ec564cab1a95e66a62555e7fa..f4a13579b0e8ae4d85592e4882bf24254604db3c 100644 (file)
@@ -1028,7 +1028,6 @@ struct perf_sample_data {
         * minimize the cachelines touched.
         */
        u64                             sample_flags;
-       u64                             addr;
        struct perf_raw_record          *raw;
        u64                             period;
 
@@ -1040,6 +1039,7 @@ struct perf_sample_data {
        union perf_sample_weight        weight;
        union  perf_mem_data_src        data_src;
        u64                             txn;
+       u64                             addr;
 
        u64                             type;
        u64                             ip;
@@ -1079,9 +1079,13 @@ static inline void perf_sample_data_init(struct perf_sample_data *data,
 {
        /* remaining struct members initialized in perf_prepare_sample() */
        data->sample_flags = 0;
-       data->addr = addr;
        data->raw  = NULL;
        data->period = period;
+
+       if (addr) {
+               data->addr = addr;
+               data->sample_flags |= PERF_SAMPLE_ADDR;
+       }
 }
 
 /*
index c07e9a3ea94cbd169fb57387866db6853a24804a..a91f74db9fe91864d1a4762a112895bfccb86104 100644 (file)
@@ -7414,6 +7414,11 @@ void perf_prepare_sample(struct perf_event_header *header,
        if (filtered_sample_type & PERF_SAMPLE_TRANSACTION)
                data->txn = 0;
 
+       if (sample_type & (PERF_SAMPLE_ADDR | PERF_SAMPLE_PHYS_ADDR | PERF_SAMPLE_DATA_PAGE_SIZE)) {
+               if (filtered_sample_type & PERF_SAMPLE_ADDR)
+                       data->addr = 0;
+       }
+
        if (sample_type & PERF_SAMPLE_REGS_INTR) {
                /* regs dump ABI info */
                int size = sizeof(u64);