From: Arnaldo Carvalho de Melo <acme-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Jiri Olsa <jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Joe Mario <jmario-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
dwarves-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 3/3] dwarves print: Keep global cacheline in struct conf_fprintf
Date: Wed, 16 Dec 2015 15:29:12 -0300 [thread overview]
Message-ID: <20151216182912.GG6843@kernel.org> (raw)
In-Reply-To: <1449614826-2278-4-git-send-email-jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Em Tue, Dec 08, 2015 at 11:47:06PM +0100, Jiri Olsa escreveu:
> Together with adding cconf->base_offset to sums used
> for cacheline computation, this ensures proper cacheline
> number to be printed for nested struct. Note possitions
> of 'cacheline' lines in following outputs.
>
> Before:
> $ pahole -C task_struct -E ~/kernel/linux-perf-local/vmlinux
> struct task_struct {
> volatile long int state; /* 0 8 */
>
> --- First cacheline is ok
>
> struct task_struct * last_wakee; /* 56 8 */
> /* --- cacheline 1 boundary (64 bytes) --- */
> int wake_cpu; /* 64 4 */
>
> ...
>
> const struct sched_class * sched_class; /* 88 8 */
> struct sched_entity {
> struct load_weight {
> long unsigned int weight; /* 96 8 */
> /* typedef u32 */ unsigned int inv_weight; /* 104 4 */
> } load; /* 96 16 */
>
> --- Second one is still in relative mode and gives wrong
> alignment in wrt task_struct start
>
> unsigned int on_rq; /* 152 4 */
> /* --- cacheline 1 boundary (64 bytes) --- */
Ok, this is a bug...
> /* typedef u64 */ long long unsigned int exec_start; /* 160 8 */
> /* typedef u64 */ long long unsigned int sum_exec_runtime; /* 168 8 */
> ...
>
> After:
> $ pahole -C task_struct -E ~/kernel/linux-perf-local/vmlinux
>
> struct task_struct {
> volatile long int state; /* 0 8 */
>
> --- First cacheline is ok
>
> struct task_struct * last_wakee; /* 56 8 */
> /* --- cacheline 1 boundary (64 bytes) --- */
> int wake_cpu; /* 64 4 */
>
> ...
>
> const struct sched_class * sched_class; /* 88 8 */
> struct sched_entity {
> struct load_weight {
> long unsigned int weight; /* 96 8 */
> /* typedef u32 */ unsigned int inv_weight; /* 104 4 */
> } load; /* 96 16 */
> struct rb_node {
> long unsigned int __rb_parent_color; /* 112 8 */
> struct rb_node * rb_right; /* 120 8 */
> /* --- cacheline 2 boundary (128 bytes) --- */
Which seems fixed here, but...
> struct rb_node * rb_left; /* 128 8 */
> } run_node; /* 112 24 */
>
> --- Second one is still in relative mode and gives wrong
> alignment in wrt task_struct start
... why this one is buggy still? I.e. it should be fixed in such a way
that when we go recursively expanding structs, we know what is the
current cacheline we're on.
- Arnaldo
>
> /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
> struct list_head {
> struct list_head * next; /* 136 8 */
> struct list_head * prev; /* 144 8 */
> } group_node; /* 136 16 */
> ...
>
> Signed-off-by: Jiri Olsa <jolsa-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> ---
> dwarves.h | 1 +
> dwarves_fprintf.c | 25 ++++++++++---------------
> 2 files changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/dwarves.h b/dwarves.h
> index 73fec8ac614a..44ebf8384b9c 100644
> --- a/dwarves.h
> +++ b/dwarves.h
> @@ -56,6 +56,7 @@ struct conf_fprintf {
> int32_t type_spacing;
> int32_t name_spacing;
> uint32_t base_offset;
> + uint32_t base_cacheline;
> uint8_t indent;
> uint8_t expand_types:1;
> uint8_t expand_pointers:1;
> diff --git a/dwarves_fprintf.c b/dwarves_fprintf.c
> index 2d114210831a..72d8b08bf235 100644
> --- a/dwarves_fprintf.c
> +++ b/dwarves_fprintf.c
> @@ -1118,22 +1118,21 @@ size_t function__fprintf_stats(const struct tag *tag, const struct cu *cu,
> return printed + fprintf(fp, " */\n");
> }
>
> -static size_t class__fprintf_cacheline_boundary(uint32_t last_cacheline,
> - size_t sum, size_t sum_holes,
> +static size_t class__fprintf_cacheline_boundary(size_t sum, size_t sum_holes,
> uint8_t *newline,
> - uint32_t *cacheline,
> struct conf_fprintf *cconf,
> FILE *fp)
> {
> - const size_t real_sum = sum + sum_holes;
> + const size_t real_sum = sum + sum_holes + cconf->base_offset;
> size_t printed = 0;
> + uint32_t cacheline = real_sum / cacheline_size;
>
> - *cacheline = real_sum / cacheline_size;
> -
> - if (*cacheline > last_cacheline) {
> + if (cacheline != cconf->base_cacheline) {
> const uint32_t cacheline_pos = real_sum % cacheline_size;
> const uint32_t cacheline_in_bytes = real_sum - cacheline_pos;
>
> + cconf->base_cacheline = cacheline;
> +
> if (*newline) {
> fputc('\n', fp);
> *newline = 0;
> @@ -1144,12 +1143,12 @@ static size_t class__fprintf_cacheline_boundary(uint32_t last_cacheline,
>
> if (cacheline_pos == 0)
> printed += fprintf(fp, "/* --- cacheline %u boundary "
> - "(%u bytes) --- */\n", *cacheline,
> + "(%u bytes) --- */\n", cacheline,
> cacheline_in_bytes);
> else
> printed += fprintf(fp, "/* --- cacheline %u boundary "
> "(%u bytes) was %u bytes ago --- "
> - "*/\n", *cacheline,
> + "*/\n", cacheline,
> cacheline_in_bytes, cacheline_pos);
> }
> return printed;
> @@ -1284,10 +1283,8 @@ size_t class__fprintf(struct class *class, const struct cu *cu,
> pos->byte_offset != last->byte_offset &&
> !cconf.suppress_comments)
> printed +=
> - class__fprintf_cacheline_boundary(last_cacheline,
> - sum, sum_holes,
> + class__fprintf_cacheline_boundary(sum, sum_holes,
> &newline,
> - &last_cacheline,
> &cconf,
> fp);
> /*
> @@ -1474,10 +1471,8 @@ size_t class__fprintf(struct class *class, const struct cu *cu,
> }
>
> if (!cconf.suppress_comments)
> - printed += class__fprintf_cacheline_boundary(last_cacheline,
> - sum, sum_holes,
> + printed += class__fprintf_cacheline_boundary(sum, sum_holes,
> &newline,
> - &last_cacheline,
> &cconf, fp);
> if (!cconf.show_only_data_members)
> class__vtable_fprintf(class, cu, &cconf, fp);
> --
> 2.4.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe dwarves" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe dwarves" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2015-12-16 18:29 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-08 22:47 [RFC/PATCH 0/3] dwarves print: Cacheline accounting fixes Jiri Olsa
[not found] ` <1449614826-2278-1-git-send-email-jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-08 22:47 ` [PATCH 1/3] dwarves print: Fix holes accounting Jiri Olsa
[not found] ` <1449614826-2278-2-git-send-email-jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-16 17:58 ` Arnaldo Carvalho de Melo
[not found] ` <20151216175839.GB6843-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-16 18:05 ` Arnaldo Carvalho de Melo
[not found] ` <20151216180532.GD6843-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-16 18:10 ` Arnaldo Carvalho de Melo
2015-12-08 22:47 ` [PATCH 2/3] dwarves print: Pass into struct conf_fprintf class__fprintf_cacheline_boundary Jiri Olsa
[not found] ` <1449614826-2278-3-git-send-email-jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-16 18:00 ` Arnaldo Carvalho de Melo
[not found] ` <20151216180017.GC6843-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-17 9:17 ` Jiri Olsa
2015-12-08 22:47 ` [PATCH 3/3] dwarves print: Keep global cacheline in struct conf_fprintf Jiri Olsa
[not found] ` <1449614826-2278-4-git-send-email-jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2015-12-16 18:29 ` Arnaldo Carvalho de Melo [this message]
2015-12-16 16:57 ` [RFC/PATCH 0/3] dwarves print: Cacheline accounting fixes Jiri Olsa
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=20151216182912.GG6843@kernel.org \
--to=acme-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=dwarves-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=jmario-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=jolsa-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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.