aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2014-06-11 15:09:35 +0200
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-08-12 12:02:57 -0300
commit8d99a6ceebe862ac4afd832cdab332ee7b3b5599 (patch)
treede33ea582d7b68e6043c4f6a7fa249dd479c0ff7 /tools/perf/util/session.c
parentperf tools: Factor ordered_events__flush to be more generic (diff)
downloadlinux-dev-8d99a6ceebe862ac4afd832cdab332ee7b3b5599.tar.xz
linux-dev-8d99a6ceebe862ac4afd832cdab332ee7b3b5599.zip
perf tools: Limit ordered events queue size
Add limit to the ordered events queue allocation. This way we will be able to control the size of the queue buffers. There's no limit at the moment (it's set to (u64) -1). The config code will come in following patches. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Acked-by: David Ahern <dsahern@gmail.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jean Pihet <jean.pihet@linaro.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/n/tip-lw1ny3mk4ctb6su5ght5rsng@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 72c7b0d3d0dc..8d4538c91076 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -78,6 +78,8 @@ struct perf_session *perf_session__new(struct perf_data_file *file,
INIT_LIST_HEAD(&session->ordered_events.events);
INIT_LIST_HEAD(&session->ordered_events.cache);
INIT_LIST_HEAD(&session->ordered_events.to_free);
+ session->ordered_events.max_alloc_size = (u64) -1;
+ session->ordered_events.cur_alloc_size = 0;
machines__init(&session->machines);
if (file) {
@@ -518,7 +520,7 @@ static void queue_event(struct ordered_events *oe, struct ordered_event *new)
static struct ordered_event *alloc_event(struct ordered_events *oe)
{
struct list_head *cache = &oe->cache;
- struct ordered_event *new;
+ struct ordered_event *new = NULL;
if (!list_empty(cache)) {
new = list_entry(cache->next, struct ordered_event, list);
@@ -527,10 +529,14 @@ static struct ordered_event *alloc_event(struct ordered_events *oe)
new = oe->buffer + oe->buffer_idx;
if (++oe->buffer_idx == MAX_SAMPLE_BUFFER)
oe->buffer = NULL;
- } else {
- oe->buffer = malloc(MAX_SAMPLE_BUFFER * sizeof(*new));
+ } else if (oe->cur_alloc_size < oe->max_alloc_size) {
+ size_t size = MAX_SAMPLE_BUFFER * sizeof(*new);
+
+ oe->buffer = malloc(size);
if (!oe->buffer)
return NULL;
+
+ oe->cur_alloc_size += size;
list_add(&oe->buffer->list, &oe->to_free);
/* First entry is abused to maintain the to_free list. */