All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@redhat.com>
To: Stephane Eranian <eranian@google.com>
Cc: linux-kernel@vger.kernel.org, peterz@infradead.org,
	mingo@kernel.org, ak@linux.intel.com, jolsa@redhat.com,
	acme@kernel.org
Subject: Re: [PATCH v7 1/6] perf: add ability to sample machine state on interrupt
Date: Fri, 21 Nov 2014 19:26:31 -0200	[thread overview]
Message-ID: <20141121212631.GF5395@redhat.com> (raw)
In-Reply-To: <1411559322-16548-2-git-send-email-eranian@google.com>

Em Wed, Sep 24, 2014 at 01:48:37PM +0200, Stephane Eranian escreveu:
> Enable capture of interrupted machine state for each
> sample.
> 
> Registers to sample are passed per event in the
> sample_regs_intr bitmask.
> 
> To sample interrupt machine state, the
> PERF_SAMPLE_INTR_REGS must be passed in
> sample_type.
> 
> The list of available registers is arch
> dependent and provided by asm/perf_regs.h
> 
> Registers are laid out as u64 in the order
> of the bit order of sample_intr_regs.
> 
> This patch also adds a new ABI version
> PERF_ATTR_SIZE_VER4 because we extend
> the perf_event_attr struct with a new u64
> field.

So, trying to bisect a problem with how the TUI hist_entries browser
renders callchains I got stuck with:

[root@zoo acme]# perf report 
incompatible file format (rerun with -v to learn more)

[root@zoo acme]# perf report -v
file uses a more recent and unsupported ABI (8 bytes extra)

Because the perf.data file was generated with HEAD of perf/core and
probably the above warning comes from a simple check against the ABI
version...

I wonder if we can't just check that there are no sample_types that we
don't know and if not, just process the file anyway, i.e. the sample
will be parseable, no?

For now, in this case, I'll just regenerate the perf.data file with an
older tool...

- Arnaldo
 
> Reviewed-by: Jiri Olsa <jolsa@redhat.com>
> Reviewed-by: Andi Kleen <ak@linux.intel.com>
> Signed-off-by: Stephane Eranian <eranian@google.com>
> ---
>  include/linux/perf_event.h      |    7 ++++--
>  include/uapi/linux/perf_event.h |   15 ++++++++++++-
>  kernel/events/core.c            |   46 +++++++++++++++++++++++++++++++++++++--
>  3 files changed, 63 insertions(+), 5 deletions(-)
> 
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index 893a0d0..68d46d5 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -79,7 +79,7 @@ struct perf_branch_stack {
>  	struct perf_branch_entry	entries[0];
>  };
>  
> -struct perf_regs_user {
> +struct perf_regs {
>  	__u64		abi;
>  	struct pt_regs	*regs;
>  };
> @@ -600,7 +600,8 @@ struct perf_sample_data {
>  	struct perf_callchain_entry	*callchain;
>  	struct perf_raw_record		*raw;
>  	struct perf_branch_stack	*br_stack;
> -	struct perf_regs_user		regs_user;
> +	struct perf_regs		regs_user;
> +	struct perf_regs		regs_intr;
>  	u64				stack_user_size;
>  	u64				weight;
>  	/*
> @@ -630,6 +631,8 @@ static inline void perf_sample_data_init(struct perf_sample_data *data,
>  	data->weight = 0;
>  	data->data_src.val = PERF_MEM_NA;
>  	data->txn = 0;
> +	data->regs_intr.abi = PERF_SAMPLE_REGS_ABI_NONE;
> +	data->regs_intr.regs = NULL;
>  }
>  
>  extern void perf_output_sample(struct perf_output_handle *handle,
> diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
> index 9269de2..48d4a01 100644
> --- a/include/uapi/linux/perf_event.h
> +++ b/include/uapi/linux/perf_event.h
> @@ -137,8 +137,9 @@ enum perf_event_sample_format {
>  	PERF_SAMPLE_DATA_SRC			= 1U << 15,
>  	PERF_SAMPLE_IDENTIFIER			= 1U << 16,
>  	PERF_SAMPLE_TRANSACTION			= 1U << 17,
> +	PERF_SAMPLE_REGS_INTR			= 1U << 18,
>  
> -	PERF_SAMPLE_MAX = 1U << 18,		/* non-ABI */
> +	PERF_SAMPLE_MAX = 1U << 19,		/* non-ABI */
>  };
>  
>  /*
> @@ -238,6 +239,7 @@ enum perf_event_read_format {
>  #define PERF_ATTR_SIZE_VER2	80	/* add: branch_sample_type */
>  #define PERF_ATTR_SIZE_VER3	96	/* add: sample_regs_user */
>  					/* add: sample_stack_user */
> +#define PERF_ATTR_SIZE_VER4	104	/* add: sample_regs_intr */
>  
>  /*
>   * Hardware event_id to monitor via a performance monitoring event:
> @@ -334,6 +336,15 @@ struct perf_event_attr {
>  
>  	/* Align to u64. */
>  	__u32	__reserved_2;
> +	/*
> +	 * Defines set of regs to dump for each sample
> +	 * state captured on:
> +	 *  - precise = 0: PMU interrupt
> +	 *  - precise > 0: sampled instruction
> +	 *
> +	 * See asm/perf_regs.h for details.
> +	 */
> +	__u64	sample_regs_intr;
>  };
>  
>  #define perf_flags(attr)	(*(&(attr)->read_format + 1))
> @@ -686,6 +697,8 @@ enum perf_event_type {
>  	 *	{ u64			weight;   } && PERF_SAMPLE_WEIGHT
>  	 *	{ u64			data_src; } && PERF_SAMPLE_DATA_SRC
>  	 *	{ u64			transaction; } && PERF_SAMPLE_TRANSACTION
> +	 *	{ u64			abi; # enum perf_sample_regs_abi
> +	 *	  u64			regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR
>  	 * };
>  	 */
>  	PERF_RECORD_SAMPLE			= 9,
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index eaa636e..7941343 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -4430,7 +4430,7 @@ perf_output_sample_regs(struct perf_output_handle *handle,
>  	}
>  }
>  
> -static void perf_sample_regs_user(struct perf_regs_user *regs_user,
> +static void perf_sample_regs_user(struct perf_regs *regs_user,
>  				  struct pt_regs *regs)
>  {
>  	if (!user_mode(regs)) {
> @@ -4446,6 +4446,14 @@ static void perf_sample_regs_user(struct perf_regs_user *regs_user,
>  	}
>  }
>  
> +static void perf_sample_regs_intr(struct perf_regs *regs_intr,
> +				  struct pt_regs *regs)
> +{
> +	regs_intr->regs = regs;
> +	regs_intr->abi  = perf_reg_abi(current);
> +}
> +
> +
>  /*
>   * Get remaining task size from user stack pointer.
>   *
> @@ -4827,6 +4835,23 @@ void perf_output_sample(struct perf_output_handle *handle,
>  	if (sample_type & PERF_SAMPLE_TRANSACTION)
>  		perf_output_put(handle, data->txn);
>  
> +	if (sample_type & PERF_SAMPLE_REGS_INTR) {
> +		u64 abi = data->regs_intr.abi;
> +		/*
> +		 * If there are no regs to dump, notice it through
> +		 * first u64 being zero (PERF_SAMPLE_REGS_ABI_NONE).
> +		 */
> +		perf_output_put(handle, abi);
> +
> +		if (abi) {
> +			u64 mask = event->attr.sample_regs_intr;
> +
> +			perf_output_sample_regs(handle,
> +						data->regs_intr.regs,
> +						mask);
> +		}
> +	}
> +
>  	if (!event->attr.watermark) {
>  		int wakeup_events = event->attr.wakeup_events;
>  
> @@ -4913,7 +4938,7 @@ void perf_prepare_sample(struct perf_event_header *header,
>  		 * in case new sample type is added, because we could eat
>  		 * up the rest of the sample size.
>  		 */
> -		struct perf_regs_user *uregs = &data->regs_user;
> +		struct perf_regs *uregs = &data->regs_user;
>  		u16 stack_size = event->attr.sample_stack_user;
>  		u16 size = sizeof(u64);
>  
> @@ -4934,6 +4959,21 @@ void perf_prepare_sample(struct perf_event_header *header,
>  		data->stack_user_size = stack_size;
>  		header->size += size;
>  	}
> +
> +	if (sample_type & PERF_SAMPLE_REGS_INTR) {
> +		/* regs dump ABI info */
> +		int size = sizeof(u64);
> +
> +		perf_sample_regs_intr(&data->regs_intr, regs);
> +
> +		if (data->regs_intr.regs) {
> +			u64 mask = event->attr.sample_regs_intr;
> +
> +			size += hweight64(mask) * sizeof(u64);
> +		}
> +
> +		header->size += size;
> +	}
>  }
>  
>  static void perf_event_output(struct perf_event *event,
> @@ -7134,6 +7174,8 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr,
>  			ret = -EINVAL;
>  	}
>  
> +	if (attr->sample_type & PERF_SAMPLE_REGS_INTR)
> +		ret = perf_reg_validate(attr->sample_regs_intr);
>  out:
>  	return ret;
>  
> -- 
> 1.7.9.5

  parent reply	other threads:[~2014-11-21 21:26 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-24 11:48 [PATCH v7 0/6] perf: add ability to sample interrupted machine state Stephane Eranian
2014-09-24 11:48 ` [PATCH v7 1/6] perf: add ability to sample machine state on interrupt Stephane Eranian
2014-11-16 12:35   ` [tip:perf/core] perf: Add " tip-bot for Stephane Eranian
2014-11-21 21:26   ` Arnaldo Carvalho de Melo [this message]
2014-12-09 13:30     ` [PATCH v7 1/6] perf: add " Arnaldo Carvalho de Melo
2014-12-09 13:39       ` Arnaldo Carvalho de Melo
2014-12-09 13:53         ` perf tests: Fix attr tests size values interrupt Jiri Olsa
2014-12-09 13:59           ` Arnaldo Carvalho de Melo
2014-12-12  8:18           ` [tip:perf/urgent] perf tests: Fix attr tests size values to cope with machine state on interrupt ABI changes tip-bot for Jiri Olsa
2014-09-24 11:48 ` [PATCH v7 2/6] perf/x86: add support for sampling PEBS machine state registers Stephane Eranian
2014-11-16 12:35   ` [tip:perf/core] perf/x86: Add " tip-bot for Stephane Eranian
2014-09-24 11:48 ` [PATCH v7 3/6] perf tools: add core support for sampling intr machine state regs Stephane Eranian
2014-11-16 12:36   ` [tip:perf/core] perf tools: Add " tip-bot for Stephane Eranian
2014-09-24 11:48 ` [PATCH v7 4/6] perf/tests: add interrupted state sample parsing test Stephane Eranian
2014-11-16 12:36   ` [tip:perf/core] perf/tests: Add " tip-bot for Stephane Eranian
2014-09-24 11:48 ` [PATCH v7 5/6] perf record: add new -I option to sample interrupted machine state Stephane Eranian
2014-11-16 12:36   ` [tip:perf/core] perf record: Add " tip-bot for Stephane Eranian
2014-09-24 11:48 ` [PATCH v7 6/6] perf: improve perf_sample_data struct layout Stephane Eranian
2014-11-16 12:37   ` [tip:perf/core] perf: Improve the " tip-bot for Peter Zijlstra
2014-09-25  9:26 ` [PATCH v7 0/6] perf: add ability to sample interrupted machine state Peter Zijlstra
2014-09-25 10:32   ` Stephane Eranian
2014-09-25 14:29     ` Peter Zijlstra
2014-09-25 16:22       ` Stephane Eranian

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141121212631.GF5395@redhat.com \
    --to=acme@redhat.com \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=eranian@google.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.