All of lore.kernel.org
 help / color / mirror / Atom feed
From: Adrian Hunter <adrian.hunter@intel.com>
To: Jan Stancek <jstancek@redhat.com>
Cc: linux-kernel@vger.kernel.org, acme@kernel.org, jolsa@kernel.org,
	dsahern@gmail.com, cjashfor@linux.vnet.ibm.com,
	fweisbec@gmail.com, mingo@kernel.org, namhyung@kernel.org,
	paulus@samba.org, a.p.zijlstra@chello.nl
Subject: Re: [PATCH v2 1/4] perf tests: take into account address of each objdump line
Date: Thu, 3 Sep 2015 12:08:10 +0300	[thread overview]
Message-ID: <55E80DFA.7090609@intel.com> (raw)
In-Reply-To: <ad13289a55d6350f7717757c7e32c2d4286402bd.1441181335.git.jstancek@redhat.com>

On 02/09/15 11:19, Jan Stancek wrote:
> objdump output can contain repeated bytes. At the moment test reads
> all output sequentially, assuming each address is represented in
> output only once:
> 
>   ffffffff8164efb3 <retint_swapgs+0x9>:
>   ffffffff8164efb3:  c1 5d 00 eb        rcrl   $0xeb,0x0(%rbp)
>   ffffffff8164efb7:  00 4c 8b 5c        add    %cl,0x5c(%rbx,%rcx,4)
> 
>   ffffffff8164efb8 <restore_c_regs_and_iret>:
>   ffffffff8164efb8:  4c 8b 5c 24 30     mov    0x30(%rsp),%r11
>   ffffffff8164efbd:  4c 8b 54 24 38     mov    0x38(%rsp),%r10
> 
> Store objdump output to buffer according to offset calculated
> from address on each line.
> 
> Signed-off-by: Jan Stancek <jstancek@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Adrian Hunter <adrian.hunter@intel.com>
> Cc: David Ahern <dsahern@gmail.com>
> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>

Apart from a couple of nitpicks below:

Acked-by: Adrian Hunter <adrian.hunter@intel.com>

> ---
>  tools/perf/tests/code-reading.c | 51 ++++++++++++++++++++++++++++++-----------
>  1 file changed, 38 insertions(+), 13 deletions(-)
> 
> Changes in v2:
>   patch split into series
> 
> diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
> index 39c784a100a9..38ee90bc2228 100644
> --- a/tools/perf/tests/code-reading.c
> +++ b/tools/perf/tests/code-reading.c
> @@ -33,20 +33,20 @@ static unsigned int hex(char c)
>  	return c - 'A' + 10;
>  }
>  
> -static void read_objdump_line(const char *line, size_t line_len, void **buf,
> -			      size_t *len)
> +static size_t read_objdump_line(const char *line, size_t line_len, void *buf,
> +			      size_t len)

Some (e.g. checkpatch) suggest that alignment should match open parenthesis

>  {
>  	const char *p;
> -	size_t i;
> +	size_t i, j = 0;
>  
>  	/* Skip to a colon */
>  	p = strchr(line, ':');
>  	if (!p)
> -		return;
> +		return 0;
>  	i = p + 1 - line;
>  
>  	/* Read bytes */
> -	while (*len) {
> +	while (j < len) {
>  		char c1, c2;
>  
>  		/* Skip spaces */
> @@ -65,20 +65,26 @@ static void read_objdump_line(const char *line, size_t line_len, void **buf,
>  		if (i < line_len && line[i] && !isspace(line[i]))
>  			break;
>  		/* Store byte */
> -		*(unsigned char *)*buf = (hex(c1) << 4) | hex(c2);
> -		*buf += 1;
> -		*len -= 1;
> +		*(unsigned char *)buf = (hex(c1) << 4) | hex(c2);
> +		buf += 1;
> +		j++;
>  	}
> +	/* return number of successfully read bytes */
> +	return j;
>  }
>  
> -static int read_objdump_output(FILE *f, void **buf, size_t *len)
> +static int read_objdump_output(FILE *f, void *buf, size_t *len, u64 start_addr)
>  {
>  	char *line = NULL;
> -	size_t line_len;
> +	size_t line_len, off_last = 0;
>  	ssize_t ret;
>  	int err = 0;
> +	u64 addr;
> +
> +	while (off_last < *len) {
> +		size_t off, read_bytes, written_bytes;
> +		unsigned char tmp[BUFSZ];
>  
> -	while (1) {
>  		ret = getline(&line, &line_len, f);
>  		if (feof(f))
>  			break;
> @@ -87,9 +93,28 @@ static int read_objdump_output(FILE *f, void **buf, size_t *len)
>  			err = -1;
>  			break;
>  		}
> -		read_objdump_line(line, ret, buf, len);
> +
> +		/* read objdump data into temporary buffer */
> +		read_bytes = read_objdump_line(line, ret, tmp, sizeof(tmp));
> +		if (!read_bytes)
> +			continue;
> +
> +		if (sscanf(line, "%"PRIx64, &addr) != 1)
> +			continue;
> +
> +		/* copy it from temporary buffer to 'buf' according
> +		 * to address on current objdump line */

The preferred style for long (multi-line) comments is:

		/*
		 * Copy it from temporary buffer to 'buf' according
		 * to address on current objdump line.
		 */

> +		off = addr - start_addr;
> +		if (off >= *len)
> +			break;
> +		written_bytes = MIN(read_bytes, *len - off);

We don't use MIN.  Use min() instead.

> +		memcpy(buf + off, tmp, written_bytes);
> +		off_last = off + written_bytes;
>  	}
>  
> +	/* len returns number of bytes that could not be read */
> +	*len -= off_last;
> +
>  	free(line);
>  
>  	return err;
> @@ -120,7 +145,7 @@ static int read_via_objdump(const char *filename, u64 addr, void *buf,
>  		return -1;
>  	}
>  
> -	ret = read_objdump_output(f, &buf, &len);
> +	ret = read_objdump_output(f, buf, &len, addr);
>  	if (len) {
>  		pr_debug("objdump read too few bytes\n");
>  		if (!ret)
> 


  parent reply	other threads:[~2015-09-03  9:11 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-02  8:19 [PATCH v2 1/4] perf tests: take into account address of each objdump line Jan Stancek
2015-09-02  8:19 ` [PATCH v2 2/4] perf tests: make objdump disassemble zero blocks Jan Stancek
2015-09-03  9:11   ` Adrian Hunter
2015-09-03 11:23     ` [PATCH v3 " Jan Stancek
2015-09-03 11:35       ` Adrian Hunter
2015-09-03 15:14         ` Arnaldo Carvalho de Melo
2015-09-03 16:19           ` Jan Stancek
2015-09-03 16:37             ` Arnaldo Carvalho de Melo
2015-09-15  6:58       ` [tip:perf/core] perf tests: Make " tip-bot for Jan Stancek
2015-09-02  8:19 ` [PATCH v2 3/4] perf tests: stop reading if objdump output crossed sections Jan Stancek
2015-09-03  9:12   ` Adrian Hunter
2015-09-15  6:58   ` [tip:perf/core] perf tests: Stop " tip-bot for Jan Stancek
2015-09-02  8:19 ` [PATCH v2 4/4] perf tests: print objdump/dso buffers if they don't match Jan Stancek
2015-09-03  9:12   ` Adrian Hunter
2015-09-15  6:58   ` [tip:perf/core] perf tests: Print objdump/dso buffers if they don 't match tip-bot for Jan Stancek
2015-09-03  9:08 ` Adrian Hunter [this message]
2015-09-03 11:23   ` [PATCH v3 1/4] perf tests: take into account address of each objdump line Jan Stancek
2015-09-03 11:35     ` Adrian Hunter
2015-09-15  6:57 ` [tip:perf/core] perf tests: Take " tip-bot for Jan Stancek

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=55E80DFA.7090609@intel.com \
    --to=adrian.hunter@intel.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=cjashfor@linux.vnet.ibm.com \
    --cc=dsahern@gmail.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=jstancek@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.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.