perf: Use sample_flags for raw_data
authorNamhyung Kim <namhyung@kernel.org>
Wed, 21 Sep 2022 22:00:32 +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 raw data field is
filled by the PMU driver.  Although it could check with the NULL,
follow the same rule with other fields.

Remove the raw field from the perf_sample_data_init() to minimize
the number of cache lines touched.

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-2-namhyung@kernel.org
arch/s390/kernel/perf_cpum_cf.c
arch/s390/kernel/perf_pai_crypto.c
arch/x86/events/amd/ibs.c
include/linux/perf_event.h
kernel/events/core.c

index f7dd3c849e68ca6e2dcc396113d788b0d4714f85..f043a7ff220b72e5e5008e8db4cf4c8d80147e9c 100644 (file)
@@ -664,6 +664,7 @@ static int cfdiag_push_sample(struct perf_event *event,
                raw.frag.data = cpuhw->stop;
                raw.size = raw.frag.size;
                data.raw = &raw;
+               data.sample_flags |= PERF_SAMPLE_RAW;
        }
 
        overflow = perf_event_overflow(event, &data, &regs);
index b38b4ae01589b20d58fa91d78b05844977f2f5e1..6826e2a69a21678aae0bd23bebaf96de0306ef04 100644 (file)
@@ -366,6 +366,7 @@ static int paicrypt_push_sample(void)
                raw.frag.data = cpump->save;
                raw.size = raw.frag.size;
                data.raw = &raw;
+               data.sample_flags |= PERF_SAMPLE_RAW;
        }
 
        overflow = perf_event_overflow(event, &data, &regs);
index ce5720bfb3504fbf4f9321cfa4f0082e783ed63c..c29a006954c71a9680a4d767130a2c416e632005 100644 (file)
@@ -781,6 +781,7 @@ fail:
                        },
                };
                data.raw = &raw;
+               data.sample_flags |= PERF_SAMPLE_RAW;
        }
 
        /*
index f4a13579b0e8ae4d85592e4882bf24254604db3c..e9b151cde491953954fa8f5adc4470771bda8556 100644 (file)
@@ -1028,7 +1028,6 @@ struct perf_sample_data {
         * minimize the cachelines touched.
         */
        u64                             sample_flags;
-       struct perf_raw_record          *raw;
        u64                             period;
 
        /*
@@ -1040,6 +1039,7 @@ struct perf_sample_data {
        union  perf_mem_data_src        data_src;
        u64                             txn;
        u64                             addr;
+       struct perf_raw_record          *raw;
 
        u64                             type;
        u64                             ip;
@@ -1078,8 +1078,7 @@ static inline void perf_sample_data_init(struct perf_sample_data *data,
                                         u64 addr, u64 period)
 {
        /* remaining struct members initialized in perf_prepare_sample() */
-       data->sample_flags = 0;
-       data->raw  = NULL;
+       data->sample_flags = PERF_SAMPLE_PERIOD;
        data->period = period;
 
        if (addr) {
index a91f74db9fe91864d1a4762a112895bfccb86104..04e19a857d4b95818b9ff118f1f93b013cec658c 100644 (file)
@@ -7332,7 +7332,7 @@ void perf_prepare_sample(struct perf_event_header *header,
                struct perf_raw_record *raw = data->raw;
                int size;
 
-               if (raw) {
+               if (raw && (data->sample_flags & PERF_SAMPLE_RAW)) {
                        struct perf_raw_frag *frag = &raw->frag;
                        u32 sum = 0;
 
@@ -7348,6 +7348,7 @@ void perf_prepare_sample(struct perf_event_header *header,
                        frag->pad = raw->size - sum;
                } else {
                        size = sizeof(u64);
+                       data->raw = NULL;
                }
 
                header->size += size;