From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>, Thomas Gleixner <tglx@linutronix.de>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Clark Williams <williams@redhat.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Jin Yao <yao.jin@linux.intel.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Andi Kleen <ak@linux.intel.com>, Jin Yao <yao.jin@intel.com>,
Kan Liang <kan.liang@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 58/63] perf block: Cleanup and refactor block info functions
Date: Thu, 7 Nov 2019 16:00:06 -0300 [thread overview]
Message-ID: <20191107190011.23924-59-acme@kernel.org> (raw)
In-Reply-To: <20191107190011.23924-1-acme@kernel.org>
From: Jin Yao <yao.jin@linux.intel.com>
We have already implemented some block-info related functions.
Now it's time to do some cleanup, refactoring and move the
functions and structures to new block-info.h/block-info.c.
v4:
---
Move code for skipping column length calculation to patch:
'perf diff: Don't use hack to skip column length calculation'
v3:
---
1. Rename the patch title
2. Rename from block.h/block.c to block-info.h/block-info.c
3. Move more common part to block-info, such as
block_info__process_sym.
4. Remove the nasty hack for skipping calculation of column
length
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Reviewed-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20191107074719.26139-3-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-diff.c | 107 +++--------------------------
tools/perf/util/Build | 1 +
tools/perf/util/block-info.c | 129 +++++++++++++++++++++++++++++++++++
tools/perf/util/block-info.h | 43 ++++++++++++
tools/perf/util/hist.c | 1 +
tools/perf/util/symbol.c | 22 ------
tools/perf/util/symbol.h | 24 -------
7 files changed, 185 insertions(+), 142 deletions(-)
create mode 100644 tools/perf/util/block-info.c
create mode 100644 tools/perf/util/block-info.h
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index faf99a81ad3e..6728568fe5c4 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -24,6 +24,7 @@
#include "util/annotate.h"
#include "util/map.h"
#include "util/spark.h"
+#include "util/block-info.h"
#include <linux/err.h>
#include <linux/zalloc.h>
#include <subcmd/pager.h>
@@ -98,8 +99,6 @@ static s64 compute_wdiff_w2;
static const char *cpu_list;
static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
-static struct addr_location dummy_al;
-
enum {
COMPUTE_DELTA,
COMPUTE_RATIO,
@@ -537,41 +536,6 @@ static void hists__baseline_only(struct hists *hists)
}
}
-static int64_t block_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
- struct hist_entry *left, struct hist_entry *right)
-{
- struct block_info *bi_l = left->block_info;
- struct block_info *bi_r = right->block_info;
- int cmp;
-
- if (!bi_l->sym || !bi_r->sym) {
- if (!bi_l->sym && !bi_r->sym)
- return 0;
- else if (!bi_l->sym)
- return -1;
- else
- return 1;
- }
-
- if (bi_l->sym == bi_r->sym) {
- if (bi_l->start == bi_r->start) {
- if (bi_l->end == bi_r->end)
- return 0;
- else
- return (int64_t)(bi_r->end - bi_l->end);
- } else
- return (int64_t)(bi_r->start - bi_l->start);
- } else {
- cmp = strcmp(bi_l->sym->name, bi_r->sym->name);
- return cmp;
- }
-
- if (bi_l->sym->start != bi_r->sym->start)
- return (int64_t)(bi_r->sym->start - bi_l->sym->start);
-
- return (int64_t)(bi_r->sym->end - bi_l->sym->end);
-}
-
static int64_t block_cycles_diff_cmp(struct hist_entry *left,
struct hist_entry *right)
{
@@ -600,67 +564,13 @@ static void init_block_hist(struct block_hist *bh)
INIT_LIST_HEAD(&bh->block_fmt.list);
INIT_LIST_HEAD(&bh->block_fmt.sort_list);
- bh->block_fmt.cmp = block_cmp;
+ bh->block_fmt.cmp = block_info__cmp;
bh->block_fmt.sort = block_sort;
perf_hpp_list__register_sort_field(&bh->block_list,
&bh->block_fmt);
bh->valid = true;
}
-static void init_block_info(struct block_info *bi, struct symbol *sym,
- struct cyc_hist *ch, int offset)
-{
- bi->sym = sym;
- bi->start = ch->start;
- bi->end = offset;
- bi->cycles = ch->cycles;
- bi->cycles_aggr = ch->cycles_aggr;
- bi->num = ch->num;
- bi->num_aggr = ch->num_aggr;
-
- memcpy(bi->cycles_spark, ch->cycles_spark,
- NUM_SPARKS * sizeof(u64));
-}
-
-static int process_block_per_sym(struct hist_entry *he)
-{
- struct annotation *notes;
- struct cyc_hist *ch;
- struct block_hist *bh;
-
- if (!he->ms.map || !he->ms.sym)
- return 0;
-
- notes = symbol__annotation(he->ms.sym);
- if (!notes || !notes->src || !notes->src->cycles_hist)
- return 0;
-
- bh = container_of(he, struct block_hist, he);
- init_block_hist(bh);
-
- ch = notes->src->cycles_hist;
- for (unsigned int i = 0; i < symbol__size(he->ms.sym); i++) {
- if (ch[i].num_aggr) {
- struct block_info *bi;
- struct hist_entry *he_block;
-
- bi = block_info__new();
- if (!bi)
- return -1;
-
- init_block_info(bi, he->ms.sym, &ch[i], i);
- he_block = hists__add_entry_block(&bh->block_hists,
- &dummy_al, bi);
- if (!he_block) {
- block_info__put(bi);
- return -1;
- }
- }
- }
-
- return 0;
-}
-
static int block_pair_cmp(struct hist_entry *a, struct hist_entry *b)
{
struct block_info *bi_a = a->block_info;
@@ -785,8 +695,11 @@ static void hists__precompute(struct hists *hists)
he = rb_entry(next, struct hist_entry, rb_node_in);
next = rb_next(&he->rb_node_in);
- if (compute == COMPUTE_CYCLES)
- process_block_per_sym(he);
+ if (compute == COMPUTE_CYCLES) {
+ bh = container_of(he, struct block_hist, he);
+ init_block_hist(bh);
+ block_info__process_sym(he, bh, NULL, 0);
+ }
data__for_each_file_new(i, d) {
pair = get_pair_data(he, d);
@@ -805,10 +718,12 @@ static void hists__precompute(struct hists *hists)
compute_wdiff(he, pair);
break;
case COMPUTE_CYCLES:
- process_block_per_sym(pair);
- bh = container_of(he, struct block_hist, he);
pair_bh = container_of(pair, struct block_hist,
he);
+ init_block_hist(pair_bh);
+ block_info__process_sym(pair, pair_bh, NULL, 0);
+
+ bh = container_of(he, struct block_hist, he);
if (bh->valid && pair_bh->valid) {
block_hists_match(&bh->block_hists,
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 39814b1806a6..b8e05a147b2b 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -1,4 +1,5 @@
perf-y += annotate.o
+perf-y += block-info.o
perf-y += block-range.o
perf-y += build-id.o
perf-y += cacheline.o
diff --git a/tools/perf/util/block-info.c b/tools/perf/util/block-info.c
new file mode 100644
index 000000000000..b9954a32b8f4
--- /dev/null
+++ b/tools/perf/util/block-info.c
@@ -0,0 +1,129 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <stdlib.h>
+#include <string.h>
+#include <linux/zalloc.h>
+#include "block-info.h"
+#include "sort.h"
+#include "annotate.h"
+#include "symbol.h"
+
+struct block_info *block_info__get(struct block_info *bi)
+{
+ if (bi)
+ refcount_inc(&bi->refcnt);
+ return bi;
+}
+
+void block_info__put(struct block_info *bi)
+{
+ if (bi && refcount_dec_and_test(&bi->refcnt))
+ free(bi);
+}
+
+struct block_info *block_info__new(void)
+{
+ struct block_info *bi = zalloc(sizeof(*bi));
+
+ if (bi)
+ refcount_set(&bi->refcnt, 1);
+ return bi;
+}
+
+int64_t block_info__cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+ struct hist_entry *left, struct hist_entry *right)
+{
+ struct block_info *bi_l = left->block_info;
+ struct block_info *bi_r = right->block_info;
+ int cmp;
+
+ if (!bi_l->sym || !bi_r->sym) {
+ if (!bi_l->sym && !bi_r->sym)
+ return 0;
+ else if (!bi_l->sym)
+ return -1;
+ else
+ return 1;
+ }
+
+ if (bi_l->sym == bi_r->sym) {
+ if (bi_l->start == bi_r->start) {
+ if (bi_l->end == bi_r->end)
+ return 0;
+ else
+ return (int64_t)(bi_r->end - bi_l->end);
+ } else
+ return (int64_t)(bi_r->start - bi_l->start);
+ } else {
+ cmp = strcmp(bi_l->sym->name, bi_r->sym->name);
+ return cmp;
+ }
+
+ if (bi_l->sym->start != bi_r->sym->start)
+ return (int64_t)(bi_r->sym->start - bi_l->sym->start);
+
+ return (int64_t)(bi_r->sym->end - bi_l->sym->end);
+}
+
+static void init_block_info(struct block_info *bi, struct symbol *sym,
+ struct cyc_hist *ch, int offset,
+ u64 total_cycles)
+{
+ bi->sym = sym;
+ bi->start = ch->start;
+ bi->end = offset;
+ bi->cycles = ch->cycles;
+ bi->cycles_aggr = ch->cycles_aggr;
+ bi->num = ch->num;
+ bi->num_aggr = ch->num_aggr;
+ bi->total_cycles = total_cycles;
+
+ memcpy(bi->cycles_spark, ch->cycles_spark,
+ NUM_SPARKS * sizeof(u64));
+}
+
+int block_info__process_sym(struct hist_entry *he, struct block_hist *bh,
+ u64 *block_cycles_aggr, u64 total_cycles)
+{
+ struct annotation *notes;
+ struct cyc_hist *ch;
+ static struct addr_location al;
+ u64 cycles = 0;
+
+ if (!he->ms.map || !he->ms.sym)
+ return 0;
+
+ memset(&al, 0, sizeof(al));
+ al.map = he->ms.map;
+ al.sym = he->ms.sym;
+
+ notes = symbol__annotation(he->ms.sym);
+ if (!notes || !notes->src || !notes->src->cycles_hist)
+ return 0;
+ ch = notes->src->cycles_hist;
+ for (unsigned int i = 0; i < symbol__size(he->ms.sym); i++) {
+ if (ch[i].num_aggr) {
+ struct block_info *bi;
+ struct hist_entry *he_block;
+
+ bi = block_info__new();
+ if (!bi)
+ return -1;
+
+ init_block_info(bi, he->ms.sym, &ch[i], i,
+ total_cycles);
+ cycles += bi->cycles_aggr / bi->num_aggr;
+
+ he_block = hists__add_entry_block(&bh->block_hists,
+ &al, bi);
+ if (!he_block) {
+ block_info__put(bi);
+ return -1;
+ }
+ }
+ }
+
+ if (block_cycles_aggr)
+ *block_cycles_aggr += cycles;
+
+ return 0;
+}
diff --git a/tools/perf/util/block-info.h b/tools/perf/util/block-info.h
new file mode 100644
index 000000000000..d55dfc2fda6f
--- /dev/null
+++ b/tools/perf/util/block-info.h
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __PERF_BLOCK_H
+#define __PERF_BLOCK_H
+
+#include <linux/types.h>
+#include <linux/refcount.h>
+#include "util/hist.h"
+#include "util/symbol.h"
+
+struct block_info {
+ struct symbol *sym;
+ u64 start;
+ u64 end;
+ u64 cycles;
+ u64 cycles_aggr;
+ s64 cycles_spark[NUM_SPARKS];
+ u64 total_cycles;
+ int num;
+ int num_aggr;
+ refcount_t refcnt;
+};
+
+struct block_hist;
+
+struct block_info *block_info__new(void);
+struct block_info *block_info__get(struct block_info *bi);
+void block_info__put(struct block_info *bi);
+
+static inline void __block_info__zput(struct block_info **bi)
+{
+ block_info__put(*bi);
+ *bi = NULL;
+}
+
+#define block_info__zput(bi) __block_info__zput(&bi)
+
+int64_t block_info__cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+ struct hist_entry *left, struct hist_entry *right);
+
+int block_info__process_sym(struct hist_entry *he, struct block_hist *bh,
+ u64 *block_cycles_aggr, u64 total_cycles);
+
+#endif /* __PERF_BLOCK_H */
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index daa6eef4fde0..a7fa061987e4 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -18,6 +18,7 @@
#include "srcline.h"
#include "symbol.h"
#include "thread.h"
+#include "block-info.h"
#include "ui/progress.h"
#include <errno.h>
#include <math.h>
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 4ad39cc6368d..2764863212b1 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -2351,25 +2351,3 @@ struct mem_info *mem_info__new(void)
refcount_set(&mi->refcnt, 1);
return mi;
}
-
-struct block_info *block_info__get(struct block_info *bi)
-{
- if (bi)
- refcount_inc(&bi->refcnt);
- return bi;
-}
-
-void block_info__put(struct block_info *bi)
-{
- if (bi && refcount_dec_and_test(&bi->refcnt))
- free(bi);
-}
-
-struct block_info *block_info__new(void)
-{
- struct block_info *bi = zalloc(sizeof(*bi));
-
- if (bi)
- refcount_set(&bi->refcnt, 1);
- return bi;
-}
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index cc2a89b99d3d..c3bd16d75d5d 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -106,18 +106,6 @@ struct ref_reloc_sym {
u64 unrelocated_addr;
};
-struct block_info {
- struct symbol *sym;
- u64 start;
- u64 end;
- u64 cycles;
- u64 cycles_aggr;
- s64 cycles_spark[NUM_SPARKS];
- int num;
- int num_aggr;
- refcount_t refcnt;
-};
-
struct addr_location {
struct machine *machine;
struct thread *thread;
@@ -291,16 +279,4 @@ static inline void __mem_info__zput(struct mem_info **mi)
#define mem_info__zput(mi) __mem_info__zput(&mi)
-struct block_info *block_info__new(void);
-struct block_info *block_info__get(struct block_info *bi);
-void block_info__put(struct block_info *bi);
-
-static inline void __block_info__zput(struct block_info **bi)
-{
- block_info__put(*bi);
- *bi = NULL;
-}
-
-#define block_info__zput(bi) __block_info__zput(&bi)
-
#endif /* __PERF_SYMBOL */
--
2.21.0
next prev parent reply other threads:[~2019-11-07 19:09 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-07 18:59 [GIT PULL] perf/core improvements and fixes Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 01/63] perf data: Correctly identify directory data files Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 02/63] perf data: Move perf_dir_version into data.h Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 03/63] perf data: Rename directory "header" file to "data" Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 04/63] perf session: Fix indent in perf_session__new()" Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 05/63] perf data: Support single perf.data file directory Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 06/63] perf record: Put a copy of kcore into the perf.data directory Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 07/63] perf llvm: Make .o saving a debug message, not an info one Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 08/63] perf cs-etm: Fix definition of macro TO_CS_QUEUE_NR Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 09/63] perf evsel: Always preserve errno while cleaning up perf_event_open failures Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 10/63] perf evsel: Avoid close(-1) Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 11/63] perf tools: Move ALLOC_LIST into a function Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 12/63] perf tools: Avoid a malloc() for array events Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 13/63] perf tests: Fix a typo Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 14/63] perf kvm: Use evlist layer api when possible Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 15/63] perf probe: Fix to find range-only function instance Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 16/63] perf probe: Walk function lines in lexical blocks Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 17/63] perf probe: Fix to show function entry line as probe-able Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 18/63] perf jevents: Fix resource leak in process_mapfile() and main() Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 19/63] perf probe: Fix wrong address verification Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 20/63] perf probe: Fix to probe a function which has no entry pc Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 21/63] perf probe: Fix to probe an inline " Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 22/63] perf probe: Fix to list probe event with correct line number Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 23/63] perf probe: Fix to show inlined function callsite without entry_pc Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 24/63] perf probe: Fix to show ranges of variables in functions " Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 25/63] perf auxtrace: Add auxtrace_cache__remove() Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 26/63] perf dso: Refactor dso_cache__read() Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 27/63] perf dso: Add dso__data_write_cache_addr() Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 28/63] perf map: Check if the map still has some refcounts on exit Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 29/63] perf map: Allow map__next() to receive a NULL arg Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 30/63] perf maps: Add for_each_entry()/_safe() iterators Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 31/63] perf map_groups: Introduce for_each_entry() and for_each_entry_safe() iterators Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 32/63] libsubcmd: Move EXTRA_FLAGS to the end to allow overriding existing flags Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 33/63] libsubcmd: Use -O0 with DEBUG=1 Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 34/63] perf tools: Splice events onto evlist even on error Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 36/63] perf vendor events intel: Update all the Intel JSON metrics from TMAM 3.6 Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 37/63] perf env: Add perf_env__numa_node() Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 38/63] perf stat: Add --per-node agregation support Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 39/63] perf tools: Fix cross compile for ARM64 Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 40/63] perf inject: Make --strip keep evsels Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 41/63] perf parse: Add parse events handle error Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 42/63] perf parse: Ensure config and str in terms are unique Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 43/63] perf parse: Add destructors for parse event terms Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 44/63] perf parse: Before yyabort-ing free components Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 45/63] perf parse: If pmu configuration fails free terms Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 46/63] perf parse: Add a deep delete for parse event terms Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 47/63] perf symbols: Remove needless checks for map->groups->machine Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 48/63] perf machine: Add kernel_dso() method Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 49/63] perf annotate: Fix heap overflow Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 50/63] perf probe: Return a better scope DIE if there is no best scope Arnaldo Carvalho de Melo
2019-11-07 18:59 ` [PATCH 51/63] perf probe: Skip end-of-sequence and non statement lines Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 52/63] perf probe: Filter out instances except for inlined subroutine and subprogram Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 53/63] perf probe: Fix to show calling lines of inlined functions Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 54/63] perf probe: Skip overlapped location on searching variables Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 55/63] perf record: Add support for limit perf output file size Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 56/63] perf tests: Fix out of bounds memory access Arnaldo Carvalho de Melo
2019-12-16 16:07 ` Naresh Kamboju
2019-12-16 16:20 ` Greg Kroah-Hartman
2019-11-07 19:00 ` [PATCH 57/63] perf diff: Don't use hack to skip column length calculation Arnaldo Carvalho de Melo
2019-11-07 19:00 ` Arnaldo Carvalho de Melo [this message]
2019-11-07 19:00 ` [PATCH 59/63] perf hist: Count the total cycles of all samples Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 60/63] perf hist: Support block formats with compare/sort/display Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 61/63] perf report: Sort by sampled cycles percent per block for stdio Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 62/63] perf report: Support --percent-limit for --total-cycles Arnaldo Carvalho de Melo
2019-11-07 19:00 ` [PATCH 63/63] perf report: Sort by sampled cycles percent per block for tui Arnaldo Carvalho de Melo
2019-11-12 11:08 ` [GIT PULL] perf/core improvements and fixes Ingo Molnar
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=20191107190011.23924-59-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=williams@redhat.com \
--cc=yao.jin@intel.com \
--cc=yao.jin@linux.intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).