Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-19 Thread Namhyung Kim
On Wed, 13 Aug 2014 17:27:56 -0300, Arnaldo Carvalho de Melo wrote:
> Em Tue, Aug 12, 2014 at 05:16:05PM +0900, Namhyung Kim escreveu:
>> The current -z option does almost nothing.  It doesn't zero the
>> existing samples so that we can see profiles of exited process after
>> last refresh.  It seems it only affects annotation.
>> 
>> This patch clears existing entries before processing if -z option is
>> given.  For this original decaying logic also moved before processing.
>
> So, this is two things bolted into one, i.e. it is not stated here why
> decaying needs to be done before resorting. I bet its because since
> we're zeroing everything, no need to decay anything, right?

Exactly.

>
> Stating more clearly what is the intent and the reason for changes helps
> reviewing.

Yep, will do better next time.

>
> Anyway, will add a note about that and apply the change.

Thank you!

>
> Also, the delete entries thing could zero total stats in struct hists,
> which is not a problem currently, because, IIRC, the collapse/resort
> logic will do that when it rotates the hists, but if we ever want to
> just delete events and then add a bunch of events without resorting, we
> will end up with bogus stats that will have the sum of the old events
> stats with the new ones.

Right.  I'll send the fix.

Thanks,
Namhyung
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-19 Thread Namhyung Kim
On Wed, 13 Aug 2014 17:27:56 -0300, Arnaldo Carvalho de Melo wrote:
 Em Tue, Aug 12, 2014 at 05:16:05PM +0900, Namhyung Kim escreveu:
 The current -z option does almost nothing.  It doesn't zero the
 existing samples so that we can see profiles of exited process after
 last refresh.  It seems it only affects annotation.
 
 This patch clears existing entries before processing if -z option is
 given.  For this original decaying logic also moved before processing.

 So, this is two things bolted into one, i.e. it is not stated here why
 decaying needs to be done before resorting. I bet its because since
 we're zeroing everything, no need to decay anything, right?

Exactly.


 Stating more clearly what is the intent and the reason for changes helps
 reviewing.

Yep, will do better next time.


 Anyway, will add a note about that and apply the change.

Thank you!


 Also, the delete entries thing could zero total stats in struct hists,
 which is not a problem currently, because, IIRC, the collapse/resort
 logic will do that when it rotates the hists, but if we ever want to
 just delete events and then add a bunch of events without resorting, we
 will end up with bogus stats that will have the sum of the old events
 stats with the new ones.

Right.  I'll send the fix.

Thanks,
Namhyung
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-13 Thread Arnaldo Carvalho de Melo
Em Tue, Aug 12, 2014 at 05:16:05PM +0900, Namhyung Kim escreveu:
> The current -z option does almost nothing.  It doesn't zero the
> existing samples so that we can see profiles of exited process after
> last refresh.  It seems it only affects annotation.
> 
> This patch clears existing entries before processing if -z option is
> given.  For this original decaying logic also moved before processing.

So, this is two things bolted into one, i.e. it is not stated here why
decaying needs to be done before resorting. I bet its because since
we're zeroing everything, no need to decay anything, right?

Stating more clearly what is the intent and the reason for changes helps
reviewing.

Anyway, will add a note about that and apply the change.

Also, the delete entries thing could zero total stats in struct hists,
which is not a problem currently, because, IIRC, the collapse/resort
logic will do that when it rotates the hists, but if we ever want to
just delete events and then add a bunch of events without resorting, we
will end up with bogus stats that will have the sum of the old events
stats with the new ones.

Thanks!

- Arnaldo
 
> Reported-by: Stephane Eranian 
> Signed-off-by: Namhyung Kim 
> ---
>  tools/perf/builtin-top.c | 23 +--
>  tools/perf/util/hist.c   | 22 ++
>  tools/perf/util/hist.h   |  1 +
>  3 files changed, 40 insertions(+), 6 deletions(-)
> 
> diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
> index 4fb6f726271c..e486501b2067 100644
> --- a/tools/perf/builtin-top.c
> +++ b/tools/perf/builtin-top.c
> @@ -276,11 +276,17 @@ static void perf_top__print_sym_table(struct perf_top 
> *top)
>   return;
>   }
>  
> + if (top->zero) {
> + hists__delete_entries(>sym_evsel->hists);
> + } else {
> + hists__decay_entries(>sym_evsel->hists,
> +  top->hide_user_symbols,
> +  top->hide_kernel_symbols);
> + }
> +
>   hists__collapse_resort(>sym_evsel->hists, NULL);
>   hists__output_resort(>sym_evsel->hists);
> - hists__decay_entries(>sym_evsel->hists,
> -  top->hide_user_symbols,
> -  top->hide_kernel_symbols);
> +
>   hists__output_recalc_col_len(>sym_evsel->hists,
>top->print_entries - printed);
>   putchar('\n');
> @@ -542,11 +548,16 @@ static void perf_top__sort_new_samples(void *arg)
>   if (t->evlist->selected != NULL)
>   t->sym_evsel = t->evlist->selected;
>  
> + if (t->zero) {
> + hists__delete_entries(>sym_evsel->hists);
> + } else {
> + hists__decay_entries(>sym_evsel->hists,
> +  t->hide_user_symbols,
> +  t->hide_kernel_symbols);
> + }
> +
>   hists__collapse_resort(>sym_evsel->hists, NULL);
>   hists__output_resort(>sym_evsel->hists);
> - hists__decay_entries(>sym_evsel->hists,
> -  t->hide_user_symbols,
> -  t->hide_kernel_symbols);
>  }
>  
>  static void *display_thread_tui(void *arg)
> diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
> index 30df6187ee02..86569fa3651d 100644
> --- a/tools/perf/util/hist.c
> +++ b/tools/perf/util/hist.c
> @@ -277,6 +277,28 @@ void hists__decay_entries(struct hists *hists, bool 
> zap_user, bool zap_kernel)
>   }
>  }
>  
> +void hists__delete_entries(struct hists *hists)
> +{
> + struct rb_node *next = rb_first(>entries);
> + struct hist_entry *n;
> +
> + while (next) {
> + n = rb_entry(next, struct hist_entry, rb_node);
> + next = rb_next(>rb_node);
> +
> + rb_erase(>rb_node, >entries);
> +
> + if (sort__need_collapse)
> + rb_erase(>rb_node_in, >entries_collapsed);
> +
> + --hists->nr_entries;
> + if (!n->filtered)
> + --hists->nr_non_filtered_entries;
> +
> + hist_entry__free(n);
> + }
> +}
> +
>  /*
>   * histogram, sorted on item, collects periods
>   */
> diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
> index 95405a8fbd95..8c9c70e18cbb 100644
> --- a/tools/perf/util/hist.h
> +++ b/tools/perf/util/hist.h
> @@ -152,6 +152,7 @@ void hists__output_resort(struct hists *hists);
>  void hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
>  
>  void hists__decay_entries(struct hists *hists, bool zap_user, bool 
> zap_kernel);
> +void hists__delete_entries(struct hists *hists);
>  void hists__output_recalc_col_len(struct hists *hists, int max_rows);
>  
>  u64 hists__total_period(struct hists *hists);
> -- 
> 2.0.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  

Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-13 Thread Arnaldo Carvalho de Melo
Em Tue, Aug 12, 2014 at 11:47:07PM -0600, David Ahern escreveu:
> On 8/12/14, 10:52 PM, Namhyung Kim wrote:
> 
> >Are you sure?  I don't recall seeing any big change in this area so I
> >guess the problem existed since long time ago.  In fact I couldn't find
> >a logic to zero/clear out existing hist entries in a hists..
> 
> Just gave a quick try. v3.4 fails; v3.1 works.

I would say it was this one, without bisecting:



commit ab81f3fd350c510730adb1ca40ef55c2b2952121
Author: Arnaldo Carvalho de Melo 
Date:   Wed Oct 5 19:16:15 2011 -0300

perf top: Reuse the 'report' hist_entry/hists classes

This actually fixes several problems we had in the old 'perf top':

1. Unresolved symbols not show, limitation that came from the old
   "KernelTop" codebase, to solve it we would need to do changes
   that would make sym_entry have most of the hist_entry fields.
2. It was using the number of samples, not the sum of sample->period.

And brings the --sort code that allows us to have all the views in
'perf report', for instance:



It ended up only honouring the zeroing logic for the annotation stuff.

Anyway, reviewing Namhyung proposed fix now.

- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-13 Thread Arnaldo Carvalho de Melo
Em Tue, Aug 12, 2014 at 11:47:07PM -0600, David Ahern escreveu:
 On 8/12/14, 10:52 PM, Namhyung Kim wrote:
 
 Are you sure?  I don't recall seeing any big change in this area so I
 guess the problem existed since long time ago.  In fact I couldn't find
 a logic to zero/clear out existing hist entries in a hists..
 
 Just gave a quick try. v3.4 fails; v3.1 works.

I would say it was this one, without bisecting:



commit ab81f3fd350c510730adb1ca40ef55c2b2952121
Author: Arnaldo Carvalho de Melo a...@redhat.com
Date:   Wed Oct 5 19:16:15 2011 -0300

perf top: Reuse the 'report' hist_entry/hists classes

This actually fixes several problems we had in the old 'perf top':

1. Unresolved symbols not show, limitation that came from the old
   KernelTop codebase, to solve it we would need to do changes
   that would make sym_entry have most of the hist_entry fields.
2. It was using the number of samples, not the sum of sample-period.

And brings the --sort code that allows us to have all the views in
'perf report', for instance:
SNIP


It ended up only honouring the zeroing logic for the annotation stuff.

Anyway, reviewing Namhyung proposed fix now.

- Arnaldo
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-13 Thread Arnaldo Carvalho de Melo
Em Tue, Aug 12, 2014 at 05:16:05PM +0900, Namhyung Kim escreveu:
 The current -z option does almost nothing.  It doesn't zero the
 existing samples so that we can see profiles of exited process after
 last refresh.  It seems it only affects annotation.
 
 This patch clears existing entries before processing if -z option is
 given.  For this original decaying logic also moved before processing.

So, this is two things bolted into one, i.e. it is not stated here why
decaying needs to be done before resorting. I bet its because since
we're zeroing everything, no need to decay anything, right?

Stating more clearly what is the intent and the reason for changes helps
reviewing.

Anyway, will add a note about that and apply the change.

Also, the delete entries thing could zero total stats in struct hists,
which is not a problem currently, because, IIRC, the collapse/resort
logic will do that when it rotates the hists, but if we ever want to
just delete events and then add a bunch of events without resorting, we
will end up with bogus stats that will have the sum of the old events
stats with the new ones.

Thanks!

- Arnaldo
 
 Reported-by: Stephane Eranian eran...@google.com
 Signed-off-by: Namhyung Kim namhy...@kernel.org
 ---
  tools/perf/builtin-top.c | 23 +--
  tools/perf/util/hist.c   | 22 ++
  tools/perf/util/hist.h   |  1 +
  3 files changed, 40 insertions(+), 6 deletions(-)
 
 diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
 index 4fb6f726271c..e486501b2067 100644
 --- a/tools/perf/builtin-top.c
 +++ b/tools/perf/builtin-top.c
 @@ -276,11 +276,17 @@ static void perf_top__print_sym_table(struct perf_top 
 *top)
   return;
   }
  
 + if (top-zero) {
 + hists__delete_entries(top-sym_evsel-hists);
 + } else {
 + hists__decay_entries(top-sym_evsel-hists,
 +  top-hide_user_symbols,
 +  top-hide_kernel_symbols);
 + }
 +
   hists__collapse_resort(top-sym_evsel-hists, NULL);
   hists__output_resort(top-sym_evsel-hists);
 - hists__decay_entries(top-sym_evsel-hists,
 -  top-hide_user_symbols,
 -  top-hide_kernel_symbols);
 +
   hists__output_recalc_col_len(top-sym_evsel-hists,
top-print_entries - printed);
   putchar('\n');
 @@ -542,11 +548,16 @@ static void perf_top__sort_new_samples(void *arg)
   if (t-evlist-selected != NULL)
   t-sym_evsel = t-evlist-selected;
  
 + if (t-zero) {
 + hists__delete_entries(t-sym_evsel-hists);
 + } else {
 + hists__decay_entries(t-sym_evsel-hists,
 +  t-hide_user_symbols,
 +  t-hide_kernel_symbols);
 + }
 +
   hists__collapse_resort(t-sym_evsel-hists, NULL);
   hists__output_resort(t-sym_evsel-hists);
 - hists__decay_entries(t-sym_evsel-hists,
 -  t-hide_user_symbols,
 -  t-hide_kernel_symbols);
  }
  
  static void *display_thread_tui(void *arg)
 diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
 index 30df6187ee02..86569fa3651d 100644
 --- a/tools/perf/util/hist.c
 +++ b/tools/perf/util/hist.c
 @@ -277,6 +277,28 @@ void hists__decay_entries(struct hists *hists, bool 
 zap_user, bool zap_kernel)
   }
  }
  
 +void hists__delete_entries(struct hists *hists)
 +{
 + struct rb_node *next = rb_first(hists-entries);
 + struct hist_entry *n;
 +
 + while (next) {
 + n = rb_entry(next, struct hist_entry, rb_node);
 + next = rb_next(n-rb_node);
 +
 + rb_erase(n-rb_node, hists-entries);
 +
 + if (sort__need_collapse)
 + rb_erase(n-rb_node_in, hists-entries_collapsed);
 +
 + --hists-nr_entries;
 + if (!n-filtered)
 + --hists-nr_non_filtered_entries;
 +
 + hist_entry__free(n);
 + }
 +}
 +
  /*
   * histogram, sorted on item, collects periods
   */
 diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
 index 95405a8fbd95..8c9c70e18cbb 100644
 --- a/tools/perf/util/hist.h
 +++ b/tools/perf/util/hist.h
 @@ -152,6 +152,7 @@ void hists__output_resort(struct hists *hists);
  void hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
  
  void hists__decay_entries(struct hists *hists, bool zap_user, bool 
 zap_kernel);
 +void hists__delete_entries(struct hists *hists);
  void hists__output_recalc_col_len(struct hists *hists, int max_rows);
  
  u64 hists__total_period(struct hists *hists);
 -- 
 2.0.0
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread David Ahern

On 8/12/14, 10:52 PM, Namhyung Kim wrote:


Are you sure?  I don't recall seeing any big change in this area so I
guess the problem existed since long time ago.  In fact I couldn't find
a logic to zero/clear out existing hist entries in a hists..


Just gave a quick try. v3.4 fails; v3.1 works.

David
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread Namhyung Kim
Hi David,

On Tue, 12 Aug 2014 13:01:41 -0600, David Ahern wrote:
> On 8/12/14, 2:16 AM, Namhyung Kim wrote:
>> The current -z option does almost nothing.  It doesn't zero the
>> existing samples so that we can see profiles of exited process after
>> last refresh.  It seems it only affects annotation.
>>
>> This patch clears existing entries before processing if -z option is
>> given.  For this original decaying logic also moved before processing.
>
> This option was broken somewhere recently. I am on vacation for
> another week, so I can't do a git bisect myself but I recall it worked
> a year or so ago. Try v3.4 as a start point.

Are you sure?  I don't recall seeing any big change in this area so I
guess the problem existed since long time ago.  In fact I couldn't find
a logic to zero/clear out existing hist entries in a hists..

Thanks,
Namhyung
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread Stephane Eranian
On Tue, Aug 12, 2014 at 10:16 AM, Namhyung Kim  wrote:
> The current -z option does almost nothing.  It doesn't zero the
> existing samples so that we can see profiles of exited process after
> last refresh.  It seems it only affects annotation.
>
> This patch clears existing entries before processing if -z option is
> given.  For this original decaying logic also moved before processing.
>
Works for me now in TUI and stdio modes. Thanks for fixing this quickly.

Tested-by: Stephane Eranian 

> Reported-by: Stephane Eranian 
> Signed-off-by: Namhyung Kim 
> ---
>  tools/perf/builtin-top.c | 23 +--
>  tools/perf/util/hist.c   | 22 ++
>  tools/perf/util/hist.h   |  1 +
>  3 files changed, 40 insertions(+), 6 deletions(-)
>
> diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
> index 4fb6f726271c..e486501b2067 100644
> --- a/tools/perf/builtin-top.c
> +++ b/tools/perf/builtin-top.c
> @@ -276,11 +276,17 @@ static void perf_top__print_sym_table(struct perf_top 
> *top)
> return;
> }
>
> +   if (top->zero) {
> +   hists__delete_entries(>sym_evsel->hists);
> +   } else {
> +   hists__decay_entries(>sym_evsel->hists,
> +top->hide_user_symbols,
> +top->hide_kernel_symbols);
> +   }
> +
> hists__collapse_resort(>sym_evsel->hists, NULL);
> hists__output_resort(>sym_evsel->hists);
> -   hists__decay_entries(>sym_evsel->hists,
> -top->hide_user_symbols,
> -top->hide_kernel_symbols);
> +
> hists__output_recalc_col_len(>sym_evsel->hists,
>  top->print_entries - printed);
> putchar('\n');
> @@ -542,11 +548,16 @@ static void perf_top__sort_new_samples(void *arg)
> if (t->evlist->selected != NULL)
> t->sym_evsel = t->evlist->selected;
>
> +   if (t->zero) {
> +   hists__delete_entries(>sym_evsel->hists);
> +   } else {
> +   hists__decay_entries(>sym_evsel->hists,
> +t->hide_user_symbols,
> +t->hide_kernel_symbols);
> +   }
> +
> hists__collapse_resort(>sym_evsel->hists, NULL);
> hists__output_resort(>sym_evsel->hists);
> -   hists__decay_entries(>sym_evsel->hists,
> -t->hide_user_symbols,
> -t->hide_kernel_symbols);
>  }
>
>  static void *display_thread_tui(void *arg)
> diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
> index 30df6187ee02..86569fa3651d 100644
> --- a/tools/perf/util/hist.c
> +++ b/tools/perf/util/hist.c
> @@ -277,6 +277,28 @@ void hists__decay_entries(struct hists *hists, bool 
> zap_user, bool zap_kernel)
> }
>  }
>
> +void hists__delete_entries(struct hists *hists)
> +{
> +   struct rb_node *next = rb_first(>entries);
> +   struct hist_entry *n;
> +
> +   while (next) {
> +   n = rb_entry(next, struct hist_entry, rb_node);
> +   next = rb_next(>rb_node);
> +
> +   rb_erase(>rb_node, >entries);
> +
> +   if (sort__need_collapse)
> +   rb_erase(>rb_node_in, >entries_collapsed);
> +
> +   --hists->nr_entries;
> +   if (!n->filtered)
> +   --hists->nr_non_filtered_entries;
> +
> +   hist_entry__free(n);
> +   }
> +}
> +
>  /*
>   * histogram, sorted on item, collects periods
>   */
> diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
> index 95405a8fbd95..8c9c70e18cbb 100644
> --- a/tools/perf/util/hist.h
> +++ b/tools/perf/util/hist.h
> @@ -152,6 +152,7 @@ void hists__output_resort(struct hists *hists);
>  void hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
>
>  void hists__decay_entries(struct hists *hists, bool zap_user, bool 
> zap_kernel);
> +void hists__delete_entries(struct hists *hists);
>  void hists__output_recalc_col_len(struct hists *hists, int max_rows);
>
>  u64 hists__total_period(struct hists *hists);
> --
> 2.0.0
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread David Ahern

On 8/12/14, 2:16 AM, Namhyung Kim wrote:

The current -z option does almost nothing.  It doesn't zero the
existing samples so that we can see profiles of exited process after
last refresh.  It seems it only affects annotation.

This patch clears existing entries before processing if -z option is
given.  For this original decaying logic also moved before processing.


This option was broken somewhere recently. I am on vacation for another 
week, so I can't do a git bisect myself but I recall it worked a year or 
so ago. Try v3.4 as a start point.


David
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread Namhyung Kim
The current -z option does almost nothing.  It doesn't zero the
existing samples so that we can see profiles of exited process after
last refresh.  It seems it only affects annotation.

This patch clears existing entries before processing if -z option is
given.  For this original decaying logic also moved before processing.

Reported-by: Stephane Eranian 
Signed-off-by: Namhyung Kim 
---
 tools/perf/builtin-top.c | 23 +--
 tools/perf/util/hist.c   | 22 ++
 tools/perf/util/hist.h   |  1 +
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 4fb6f726271c..e486501b2067 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -276,11 +276,17 @@ static void perf_top__print_sym_table(struct perf_top 
*top)
return;
}
 
+   if (top->zero) {
+   hists__delete_entries(>sym_evsel->hists);
+   } else {
+   hists__decay_entries(>sym_evsel->hists,
+top->hide_user_symbols,
+top->hide_kernel_symbols);
+   }
+
hists__collapse_resort(>sym_evsel->hists, NULL);
hists__output_resort(>sym_evsel->hists);
-   hists__decay_entries(>sym_evsel->hists,
-top->hide_user_symbols,
-top->hide_kernel_symbols);
+
hists__output_recalc_col_len(>sym_evsel->hists,
 top->print_entries - printed);
putchar('\n');
@@ -542,11 +548,16 @@ static void perf_top__sort_new_samples(void *arg)
if (t->evlist->selected != NULL)
t->sym_evsel = t->evlist->selected;
 
+   if (t->zero) {
+   hists__delete_entries(>sym_evsel->hists);
+   } else {
+   hists__decay_entries(>sym_evsel->hists,
+t->hide_user_symbols,
+t->hide_kernel_symbols);
+   }
+
hists__collapse_resort(>sym_evsel->hists, NULL);
hists__output_resort(>sym_evsel->hists);
-   hists__decay_entries(>sym_evsel->hists,
-t->hide_user_symbols,
-t->hide_kernel_symbols);
 }
 
 static void *display_thread_tui(void *arg)
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 30df6187ee02..86569fa3651d 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -277,6 +277,28 @@ void hists__decay_entries(struct hists *hists, bool 
zap_user, bool zap_kernel)
}
 }
 
+void hists__delete_entries(struct hists *hists)
+{
+   struct rb_node *next = rb_first(>entries);
+   struct hist_entry *n;
+
+   while (next) {
+   n = rb_entry(next, struct hist_entry, rb_node);
+   next = rb_next(>rb_node);
+
+   rb_erase(>rb_node, >entries);
+
+   if (sort__need_collapse)
+   rb_erase(>rb_node_in, >entries_collapsed);
+
+   --hists->nr_entries;
+   if (!n->filtered)
+   --hists->nr_non_filtered_entries;
+
+   hist_entry__free(n);
+   }
+}
+
 /*
  * histogram, sorted on item, collects periods
  */
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 95405a8fbd95..8c9c70e18cbb 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -152,6 +152,7 @@ void hists__output_resort(struct hists *hists);
 void hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
 
 void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
+void hists__delete_entries(struct hists *hists);
 void hists__output_recalc_col_len(struct hists *hists, int max_rows);
 
 u64 hists__total_period(struct hists *hists);
-- 
2.0.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread Namhyung Kim
The current -z option does almost nothing.  It doesn't zero the
existing samples so that we can see profiles of exited process after
last refresh.  It seems it only affects annotation.

This patch clears existing entries before processing if -z option is
given.  For this original decaying logic also moved before processing.

Reported-by: Stephane Eranian eran...@google.com
Signed-off-by: Namhyung Kim namhy...@kernel.org
---
 tools/perf/builtin-top.c | 23 +--
 tools/perf/util/hist.c   | 22 ++
 tools/perf/util/hist.h   |  1 +
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 4fb6f726271c..e486501b2067 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -276,11 +276,17 @@ static void perf_top__print_sym_table(struct perf_top 
*top)
return;
}
 
+   if (top-zero) {
+   hists__delete_entries(top-sym_evsel-hists);
+   } else {
+   hists__decay_entries(top-sym_evsel-hists,
+top-hide_user_symbols,
+top-hide_kernel_symbols);
+   }
+
hists__collapse_resort(top-sym_evsel-hists, NULL);
hists__output_resort(top-sym_evsel-hists);
-   hists__decay_entries(top-sym_evsel-hists,
-top-hide_user_symbols,
-top-hide_kernel_symbols);
+
hists__output_recalc_col_len(top-sym_evsel-hists,
 top-print_entries - printed);
putchar('\n');
@@ -542,11 +548,16 @@ static void perf_top__sort_new_samples(void *arg)
if (t-evlist-selected != NULL)
t-sym_evsel = t-evlist-selected;
 
+   if (t-zero) {
+   hists__delete_entries(t-sym_evsel-hists);
+   } else {
+   hists__decay_entries(t-sym_evsel-hists,
+t-hide_user_symbols,
+t-hide_kernel_symbols);
+   }
+
hists__collapse_resort(t-sym_evsel-hists, NULL);
hists__output_resort(t-sym_evsel-hists);
-   hists__decay_entries(t-sym_evsel-hists,
-t-hide_user_symbols,
-t-hide_kernel_symbols);
 }
 
 static void *display_thread_tui(void *arg)
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 30df6187ee02..86569fa3651d 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -277,6 +277,28 @@ void hists__decay_entries(struct hists *hists, bool 
zap_user, bool zap_kernel)
}
 }
 
+void hists__delete_entries(struct hists *hists)
+{
+   struct rb_node *next = rb_first(hists-entries);
+   struct hist_entry *n;
+
+   while (next) {
+   n = rb_entry(next, struct hist_entry, rb_node);
+   next = rb_next(n-rb_node);
+
+   rb_erase(n-rb_node, hists-entries);
+
+   if (sort__need_collapse)
+   rb_erase(n-rb_node_in, hists-entries_collapsed);
+
+   --hists-nr_entries;
+   if (!n-filtered)
+   --hists-nr_non_filtered_entries;
+
+   hist_entry__free(n);
+   }
+}
+
 /*
  * histogram, sorted on item, collects periods
  */
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 95405a8fbd95..8c9c70e18cbb 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -152,6 +152,7 @@ void hists__output_resort(struct hists *hists);
 void hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
 
 void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
+void hists__delete_entries(struct hists *hists);
 void hists__output_recalc_col_len(struct hists *hists, int max_rows);
 
 u64 hists__total_period(struct hists *hists);
-- 
2.0.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread David Ahern

On 8/12/14, 2:16 AM, Namhyung Kim wrote:

The current -z option does almost nothing.  It doesn't zero the
existing samples so that we can see profiles of exited process after
last refresh.  It seems it only affects annotation.

This patch clears existing entries before processing if -z option is
given.  For this original decaying logic also moved before processing.


This option was broken somewhere recently. I am on vacation for another 
week, so I can't do a git bisect myself but I recall it worked a year or 
so ago. Try v3.4 as a start point.


David
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread Stephane Eranian
On Tue, Aug 12, 2014 at 10:16 AM, Namhyung Kim namhy...@kernel.org wrote:
 The current -z option does almost nothing.  It doesn't zero the
 existing samples so that we can see profiles of exited process after
 last refresh.  It seems it only affects annotation.

 This patch clears existing entries before processing if -z option is
 given.  For this original decaying logic also moved before processing.

Works for me now in TUI and stdio modes. Thanks for fixing this quickly.

Tested-by: Stephane Eranian eran...@google.com

 Reported-by: Stephane Eranian eran...@google.com
 Signed-off-by: Namhyung Kim namhy...@kernel.org
 ---
  tools/perf/builtin-top.c | 23 +--
  tools/perf/util/hist.c   | 22 ++
  tools/perf/util/hist.h   |  1 +
  3 files changed, 40 insertions(+), 6 deletions(-)

 diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
 index 4fb6f726271c..e486501b2067 100644
 --- a/tools/perf/builtin-top.c
 +++ b/tools/perf/builtin-top.c
 @@ -276,11 +276,17 @@ static void perf_top__print_sym_table(struct perf_top 
 *top)
 return;
 }

 +   if (top-zero) {
 +   hists__delete_entries(top-sym_evsel-hists);
 +   } else {
 +   hists__decay_entries(top-sym_evsel-hists,
 +top-hide_user_symbols,
 +top-hide_kernel_symbols);
 +   }
 +
 hists__collapse_resort(top-sym_evsel-hists, NULL);
 hists__output_resort(top-sym_evsel-hists);
 -   hists__decay_entries(top-sym_evsel-hists,
 -top-hide_user_symbols,
 -top-hide_kernel_symbols);
 +
 hists__output_recalc_col_len(top-sym_evsel-hists,
  top-print_entries - printed);
 putchar('\n');
 @@ -542,11 +548,16 @@ static void perf_top__sort_new_samples(void *arg)
 if (t-evlist-selected != NULL)
 t-sym_evsel = t-evlist-selected;

 +   if (t-zero) {
 +   hists__delete_entries(t-sym_evsel-hists);
 +   } else {
 +   hists__decay_entries(t-sym_evsel-hists,
 +t-hide_user_symbols,
 +t-hide_kernel_symbols);
 +   }
 +
 hists__collapse_resort(t-sym_evsel-hists, NULL);
 hists__output_resort(t-sym_evsel-hists);
 -   hists__decay_entries(t-sym_evsel-hists,
 -t-hide_user_symbols,
 -t-hide_kernel_symbols);
  }

  static void *display_thread_tui(void *arg)
 diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
 index 30df6187ee02..86569fa3651d 100644
 --- a/tools/perf/util/hist.c
 +++ b/tools/perf/util/hist.c
 @@ -277,6 +277,28 @@ void hists__decay_entries(struct hists *hists, bool 
 zap_user, bool zap_kernel)
 }
  }

 +void hists__delete_entries(struct hists *hists)
 +{
 +   struct rb_node *next = rb_first(hists-entries);
 +   struct hist_entry *n;
 +
 +   while (next) {
 +   n = rb_entry(next, struct hist_entry, rb_node);
 +   next = rb_next(n-rb_node);
 +
 +   rb_erase(n-rb_node, hists-entries);
 +
 +   if (sort__need_collapse)
 +   rb_erase(n-rb_node_in, hists-entries_collapsed);
 +
 +   --hists-nr_entries;
 +   if (!n-filtered)
 +   --hists-nr_non_filtered_entries;
 +
 +   hist_entry__free(n);
 +   }
 +}
 +
  /*
   * histogram, sorted on item, collects periods
   */
 diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
 index 95405a8fbd95..8c9c70e18cbb 100644
 --- a/tools/perf/util/hist.h
 +++ b/tools/perf/util/hist.h
 @@ -152,6 +152,7 @@ void hists__output_resort(struct hists *hists);
  void hists__collapse_resort(struct hists *hists, struct ui_progress *prog);

  void hists__decay_entries(struct hists *hists, bool zap_user, bool 
 zap_kernel);
 +void hists__delete_entries(struct hists *hists);
  void hists__output_recalc_col_len(struct hists *hists, int max_rows);

  u64 hists__total_period(struct hists *hists);
 --
 2.0.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread Namhyung Kim
Hi David,

On Tue, 12 Aug 2014 13:01:41 -0600, David Ahern wrote:
 On 8/12/14, 2:16 AM, Namhyung Kim wrote:
 The current -z option does almost nothing.  It doesn't zero the
 existing samples so that we can see profiles of exited process after
 last refresh.  It seems it only affects annotation.

 This patch clears existing entries before processing if -z option is
 given.  For this original decaying logic also moved before processing.

 This option was broken somewhere recently. I am on vacation for
 another week, so I can't do a git bisect myself but I recall it worked
 a year or so ago. Try v3.4 as a start point.

Are you sure?  I don't recall seeing any big change in this area so I
guess the problem existed since long time ago.  In fact I couldn't find
a logic to zero/clear out existing hist entries in a hists..

Thanks,
Namhyung
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [RFC/PATCH 1/2] perf top: Fix -z option behavior

2014-08-12 Thread David Ahern

On 8/12/14, 10:52 PM, Namhyung Kim wrote:


Are you sure?  I don't recall seeing any big change in this area so I
guess the problem existed since long time ago.  In fact I couldn't find
a logic to zero/clear out existing hist entries in a hists..


Just gave a quick try. v3.4 fails; v3.1 works.

David
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/