[PATCH 20/22] perf tools: Make hists col_len dynamicaly alocated
From: Jiri Olsa
Date: Sun Feb 02 2014 - 16:40:47 EST
Making hists col_len dynamicaly allocated as a support
for dynamic sort entries.
Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
Cc: Corey Ashford <cjashfor@xxxxxxxxxxxxxxxxxx>
Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxx>
Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
Cc: Paul Mackerras <paulus@xxxxxxxxx>
Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
Cc: David Ahern <dsahern@xxxxxxxxx>
---
tools/perf/util/evsel.c | 23 ++++++++++++++++-------
tools/perf/util/evsel.h | 6 +++---
tools/perf/util/hist.c | 15 +++++++++++++++
tools/perf/util/hist.h | 4 +++-
tools/perf/util/python.c | 3 +--
5 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 5baf13b..2661870 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -115,7 +115,7 @@ void perf_evsel__calc_id_pos(struct perf_evsel *evsel)
evsel->is_pos = __perf_evsel__calc_is_pos(evsel->attr.sample_type);
}
-void hists__init(struct hists *hists)
+int hists__init(struct hists *hists)
{
memset(hists, 0, sizeof(*hists));
hists->entries_in_array[0] = hists->entries_in_array[1] = RB_ROOT;
@@ -124,6 +124,12 @@ void hists__init(struct hists *hists)
hists->entries = RB_ROOT;
INIT_LIST_HEAD(&hists->sort_list);
pthread_mutex_init(&hists->lock, NULL);
+ return hists__alloc_col_len(hists, HISTC_NR_COLS);
+}
+
+static void hists__exit(struct hists *hists)
+{
+ free(hists->col_len);
}
void __perf_evsel__set_sample_bit(struct perf_evsel *evsel,
@@ -158,8 +164,8 @@ void perf_evsel__set_sample_id(struct perf_evsel *evsel,
evsel->attr.read_format |= PERF_FORMAT_ID;
}
-void perf_evsel__init(struct perf_evsel *evsel,
- struct perf_event_attr *attr, int idx)
+int perf_evsel__init(struct perf_evsel *evsel,
+ struct perf_event_attr *attr, int idx)
{
evsel->idx = idx;
evsel->attr = *attr;
@@ -167,19 +173,20 @@ void perf_evsel__init(struct perf_evsel *evsel,
evsel->unit = "";
evsel->scale = 1.0;
INIT_LIST_HEAD(&evsel->node);
- hists__init(&evsel->hists);
evsel->sample_size = __perf_evsel__sample_size(attr->sample_type);
perf_evsel__calc_id_pos(evsel);
+ return hists__init(&evsel->hists);
}
struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
{
struct perf_evsel *evsel = zalloc(sizeof(*evsel));
+ int err = -ENOMEM;
if (evsel != NULL)
- perf_evsel__init(evsel, attr, idx);
+ err = perf_evsel__init(evsel, attr, idx);
- return evsel;
+ return err ? NULL : evsel;
}
struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int idx)
@@ -203,7 +210,8 @@ struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, int
event_attr_init(&attr);
attr.config = evsel->tp_format->id;
attr.sample_period = 1;
- perf_evsel__init(evsel, &attr, idx);
+ if (perf_evsel__init(evsel, &attr, idx))
+ goto out_free;
}
return evsel;
@@ -776,6 +784,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)
assert(list_empty(&evsel->node));
perf_evsel__free_fd(evsel);
perf_evsel__free_id(evsel);
+ hists__exit(&evsel->hists);
}
void perf_evsel__delete(struct perf_evsel *evsel)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index f1b3256..cdc2681 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -114,8 +114,8 @@ static inline struct perf_evsel *perf_evsel__newtp(const char *sys, const char *
struct event_format *event_format__new(const char *sys, const char *name);
-void perf_evsel__init(struct perf_evsel *evsel,
- struct perf_event_attr *attr, int idx);
+int perf_evsel__init(struct perf_evsel *evsel,
+ struct perf_event_attr *attr, int idx);
void perf_evsel__exit(struct perf_evsel *evsel);
void perf_evsel__delete(struct perf_evsel *evsel);
@@ -272,7 +272,7 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel,
return __perf_evsel__read(evsel, ncpus, nthreads, true);
}
-void hists__init(struct hists *hists);
+int hists__init(struct hists *hists);
int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
struct perf_sample *sample);
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 92c3d76..794d0cb 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -21,6 +21,21 @@ struct callchain_param callchain_param = {
.key = CCKEY_FUNCTION
};
+int hists__alloc_col_len(struct hists *hists, int n)
+{
+ u16 *col_len = hists->col_len;
+ int old_n = hists->col_n;
+
+ col_len = realloc(col_len, n * sizeof(u16));
+ if (col_len) {
+ memset(col_len + old_n, 0, n - old_n);
+ hists->col_len = col_len;
+ hists->col_n = n;
+ }
+
+ return col_len ? 0 : -ENOMEM;
+}
+
u16 hists__col_len(struct hists *hists, enum hist_column col)
{
return hists->col_len[col];
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index ff52c3bf..c2f4bd1 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -91,7 +91,8 @@ struct hists {
struct events_stats stats;
u64 time_base;
u64 event_stream;
- u16 col_len[HISTC_NR_COLS];
+ u16 *col_len;
+ int col_n;
struct list_head sort_list;
};
@@ -168,6 +169,7 @@ void hists__filter_by_dso(struct hists *hists);
void hists__filter_by_thread(struct hists *hists);
void hists__filter_by_symbol(struct hists *hists);
+int hists__alloc_col_len(struct hists *hists, int n);
u16 hists__col_len(struct hists *hists, enum hist_column col);
void hists__set_col_len(struct hists *hists, enum hist_column col, u16 len);
bool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len);
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 122669c..b5824d2 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -605,8 +605,7 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
attr.mmap_data = mmap_data;
attr.sample_id_all = sample_id_all;
- perf_evsel__init(&pevsel->evsel, &attr, idx);
- return 0;
+ return perf_evsel__init(&pevsel->evsel, &attr, idx);
}
static void pyrf_evsel__delete(struct pyrf_evsel *pevsel)
--
1.8.3.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/