Re: [PATCH 16/35] perf dlfilter: Add machine_pid and vcpu

From: Ian Rogers
Date: Tue Jul 19 2022 - 20:42:22 EST


On Mon, Jul 11, 2022 at 2:33 AM Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote:
>
> Add machine_pid and vcpu to struct perf_dlfilter_sample. The 'size' can be
> used to determine if the values are present, however machine_pid is zero if
> unused in any case. vcpu should be ignored if machine_pid is zero.
>
> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>

Acked-by: Ian Rogers <irogers@xxxxxxxxxx>

Thanks,
Ian

> ---
> tools/perf/Documentation/perf-dlfilter.txt | 22 ++++++++++++++++++++++
> tools/perf/include/perf/perf_dlfilter.h | 8 ++++++++
> tools/perf/util/dlfilter.c | 2 ++
> 3 files changed, 32 insertions(+)
>
> diff --git a/tools/perf/Documentation/perf-dlfilter.txt b/tools/perf/Documentation/perf-dlfilter.txt
> index 594f5a5a0c9e..fb22e3b31dc5 100644
> --- a/tools/perf/Documentation/perf-dlfilter.txt
> +++ b/tools/perf/Documentation/perf-dlfilter.txt
> @@ -107,9 +107,31 @@ struct perf_dlfilter_sample {
> __u64 raw_callchain_nr; /* Number of raw_callchain entries */
> const __u64 *raw_callchain; /* Refer <linux/perf_event.h> */
> const char *event;
> + __s32 machine_pid;
> + __s32 vcpu;
> };
> ----
>
> +Note: 'machine_pid' and 'vcpu' are not original members, but were added together later.
> +'size' can be used to determine their presence at run time.
> +PERF_DLFILTER_HAS_MACHINE_PID will be defined if they are present at compile time.
> +For example:
> +[source,c]
> +----
> +#include <perf/perf_dlfilter.h>
> +#include <stddef.h>
> +#include <stdbool.h>
> +
> +static inline bool have_machine_pid(const struct perf_dlfilter_sample *sample)
> +{
> +#ifdef PERF_DLFILTER_HAS_MACHINE_PID
> + return sample->size >= offsetof(struct perf_dlfilter_sample, vcpu) + sizeof(sample->vcpu);
> +#else
> + return false;
> +#endif
> +}
> +----
> +
> The perf_dlfilter_fns structure
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> diff --git a/tools/perf/include/perf/perf_dlfilter.h b/tools/perf/include/perf/perf_dlfilter.h
> index 3eef03d661b4..a26e2f129f83 100644
> --- a/tools/perf/include/perf/perf_dlfilter.h
> +++ b/tools/perf/include/perf/perf_dlfilter.h
> @@ -9,6 +9,12 @@
> #include <linux/perf_event.h>
> #include <linux/types.h>
>
> +/*
> + * The following macro can be used to determine if this header defines
> + * perf_dlfilter_sample machine_pid and vcpu.
> + */
> +#define PERF_DLFILTER_HAS_MACHINE_PID
> +
> /* Definitions for perf_dlfilter_sample flags */
> enum {
> PERF_DLFILTER_FLAG_BRANCH = 1ULL << 0,
> @@ -62,6 +68,8 @@ struct perf_dlfilter_sample {
> __u64 raw_callchain_nr; /* Number of raw_callchain entries */
> const __u64 *raw_callchain; /* Refer <linux/perf_event.h> */
> const char *event;
> + __s32 machine_pid;
> + __s32 vcpu;
> };
>
> /*
> diff --git a/tools/perf/util/dlfilter.c b/tools/perf/util/dlfilter.c
> index db964d5a52af..54e4d4495e00 100644
> --- a/tools/perf/util/dlfilter.c
> +++ b/tools/perf/util/dlfilter.c
> @@ -495,6 +495,8 @@ int dlfilter__do_filter_event(struct dlfilter *d,
> ASSIGN(misc);
> ASSIGN(raw_size);
> ASSIGN(raw_data);
> + ASSIGN(machine_pid);
> + ASSIGN(vcpu);
>
> if (sample->branch_stack) {
> d_sample.brstack_nr = sample->branch_stack->nr;
> --
> 2.25.1
>