On Tue, Oct 08, 2019 at 09:53:24AM -0400, Liang, Kan wrote: > > > On 10/8/2019 4:31 AM, Peter Zijlstra wrote: > > On Mon, Oct 07, 2019 at 10:59:01AM -0700, [email protected] wrote: > > > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > > > index 61448c19a132..ee9ef0c4cb08 100644 > > > --- a/include/linux/perf_event.h > > > +++ b/include/linux/perf_event.h > > > @@ -100,6 +100,7 @@ struct perf_raw_record { > > > */ > > > struct perf_branch_stack { > > > __u64 nr; > > > + __u64 tos; > > > struct perf_branch_entry entries[0]; > > > }; > > > diff --git a/include/uapi/linux/perf_event.h > > > b/include/uapi/linux/perf_event.h > > > index bb7b271397a6..fe36ebb7dc2e 100644 > > > --- a/include/uapi/linux/perf_event.h > > > +++ b/include/uapi/linux/perf_event.h > > > @@ -141,8 +141,9 @@ enum perf_event_sample_format { > > > PERF_SAMPLE_TRANSACTION = 1U << 17, > > > PERF_SAMPLE_REGS_INTR = 1U << 18, > > > PERF_SAMPLE_PHYS_ADDR = 1U << 19, > > > + PERF_SAMPLE_LBR_TOS = 1U << 20, > > > - PERF_SAMPLE_MAX = 1U << 20, /* non-ABI */ > > > + PERF_SAMPLE_MAX = 1U << 21, /* non-ABI */ > > > __PERF_SAMPLE_CALLCHAIN_EARLY = 1ULL << 63, /* > > > non-ABI; internal use */ > > > }; > > > @@ -864,6 +865,7 @@ enum perf_event_type { > > > * { u64 abi; # enum perf_sample_regs_abi > > > * u64 regs[weight(mask)]; } && > > > PERF_SAMPLE_REGS_INTR > > > * { u64 phys_addr;} && > > > PERF_SAMPLE_PHYS_ADDR > > > + * { u64 tos;} && PERF_SAMPLE_LBR_TOS > > > * }; > > > */ > > > PERF_RECORD_SAMPLE = 9, > > > > I have problems with the API.. You're introducing the intel specific LBR > > naming, and adding a whole new sample type vs extending the existing > > BRANCH_STACK (like you really already do with struct perf_branch_stack). > > > So why not add a bit to PERF_SAMPLE_BRANCH_* to request the presence of > > the TOS field in the PERF_SAMPLE_BRANCH_STACK output? > > We never store PERF_SAMPLE_BRANCH_* in a sample. The perf tool cannot tell > if the sample includes TOS field.
The perf tool bloody sets the perf_event_attr::branch_sample_type value! Of course it knows to expect the TOS field when it asks for it in the first place. > There will be a problem when a new perf tool parsing the data generated by > an old kernel. ISTR perf stores the full perf_event_attr in the .data file these days, and therefore such confusion should never happen.

