[PATCH] perf/core: Update sample_flags for raw_data in perf_output_sample

From: Athira Rajeev
Date: Wed Oct 19 2022 - 03:32:06 EST


commit 838d9bb62d13 ("perf: Use sample_flags for raw_data")
added check for PERF_SAMPLE_RAW in sample_flags in
perf_prepare_sample(). But while copying the sample in memory,
the check for sample_flags is not added in perf_output_sample().
Fix adds the same in perf_output_sample as well.

Fixes: 838d9bb62d13 ("perf: Use sample_flags for raw_data")
Signed-off-by: Athira Rajeev <atrajeev@xxxxxxxxxxxxxxxxxx>
---
kernel/events/core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 4ec3717003d5..daf387c75d33 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7099,7 +7099,7 @@ void perf_output_sample(struct perf_output_handle *ha=
ndle,
if (sample_type & PERF_SAMPLE_RAW) {
struct perf_raw_record *raw =3D data->raw;
=20
- if (raw) {
+ if (raw && (data->sample_flags & PERF_SAMPLE_RAW)) {
struct perf_raw_frag *frag =3D &raw->frag;
=20
perf_output_put(handle, raw->size);
--=20
2.31.1

Thanks
Athira

> ---
> arch/s390/kernel/perf_cpum_cf.c | 1 +
> arch/s390/kernel/perf_pai_crypto.c | 1 +
> arch/x86/events/amd/ibs.c | 1 +
> include/linux/perf_event.h | 5 ++---
> kernel/events/core.c | 3 ++-
> 5 files changed, 7 insertions(+), 4 deletions(-)
>=20
> diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum=
_cf.c
> index f7dd3c8..f043a7f 100644
> --- a/arch/s390/kernel/perf_cpum_cf.c
> +++ b/arch/s390/kernel/perf_cpum_cf.c
> @@ -664,6 +664,7 @@ static int cfdiag_push_sample(struct perf_event *even=
t,
> raw.frag.data =3D cpuhw->stop;
> raw.size =3D raw.frag.size;
> data.raw =3D &raw;
> + data.sample_flags |=3D PERF_SAMPLE_RAW;
> }
>=20
> overflow =3D perf_event_overflow(event, &data, &regs);
> diff --git a/arch/s390/kernel/perf_pai_crypto.c b/arch/s390/kernel/perf_p=
ai_crypto.c
> index b38b4ae..6826e2a 100644
> --- a/arch/s390/kernel/perf_pai_crypto.c
> +++ b/arch/s390/kernel/perf_pai_crypto.c
> @@ -366,6 +366,7 @@ static int paicrypt_push_sample(void)
> raw.frag.data =3D cpump->save;
> raw.size =3D raw.frag.size;
> data.raw =3D &raw;
> + data.sample_flags |=3D PERF_SAMPLE_RAW;
> }
>=20
> overflow =3D perf_event_overflow(event, &data, &regs);
> diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
> index ce5720b..c29a006 100644
> --- a/arch/x86/events/amd/ibs.c
> +++ b/arch/x86/events/amd/ibs.c
> @@ -781,6 +781,7 @@ fail:
> },
> };
> data.raw =3D &raw;
> + data.sample_flags |=3D PERF_SAMPLE_RAW;
> }
>=20
> /*
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index f4a1357..e9b151c 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -1028,7 +1028,6 @@ struct perf_sample_data {
> * minimize the cachelines touched.
> */
> u64 sample_flags;
> - struct perf_raw_record *raw;
> u64 period;
>=20
> /*
> @@ -1040,6 +1039,7 @@ struct perf_sample_data {
> union perf_mem_data_src data_src;
> u64 txn;
> u64 addr;
> + struct perf_raw_record *raw;
>=20
> u64 type;
> u64 ip;
> @@ -1078,8 +1078,7 @@ static inline void perf_sample_data_init(struct per=
f_sample_data *data,
> u64 addr, u64 period)
> {
> /* remaining struct members initialized in perf_prepare_sample() */
> - data->sample_flags =3D 0;
> - data->raw =3D NULL;
> + data->sample_flags =3D PERF_SAMPLE_PERIOD;
> data->period =3D period;
>=20
> if (addr) {
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index a91f74d..04e19a8 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -7332,7 +7332,7 @@ void perf_prepare_sample(struct perf_event_header *=
header,
> struct perf_raw_record *raw =3D data->raw;
> int size;
>=20
> - if (raw) {
> + if (raw && (data->sample_flags & PERF_SAMPLE_RAW)) {
> struct perf_raw_frag *frag =3D &raw->frag;
> u32 sum =3D 0;
>=20
> @@ -7348,6 +7348,7 @@ void perf_prepare_sample(struct perf_event_header *=
header,
> frag->pad =3D raw->size - sum;
> } else {
> size =3D sizeof(u64);
> + data->raw =3D NULL;
> }
>=20
> header->size +=3D size;