OSDN Git Service

perf thread-stack: Allocate an array of thread stacks
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 21 Dec 2018 12:06:18 +0000 (14:06 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 2 Jan 2019 13:55:55 +0000 (10:55 -0300)
In preparation for fixing thread stack processing for the idle task,
allocate an array of thread stacks.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20181221120620.9659-7-adrian.hunter@intel.com
[ No need to check for NULL when calling zfree(), noticed by Jiri Olsa ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/thread-stack.c

index 03770af..248ed39 100644 (file)
@@ -114,20 +114,25 @@ static int thread_stack__init(struct thread_stack *ts, struct thread *thread,
 static struct thread_stack *thread_stack__new(struct thread *thread,
                                              struct call_return_processor *crp)
 {
-       struct thread_stack *ts;
-
-       ts = zalloc(sizeof(struct thread_stack));
-       if (!ts)
-               return NULL;
-
-       ts->arr_sz = 1;
-
-       if (thread_stack__init(ts, thread, crp)) {
-               free(ts);
-               return NULL;
+       struct thread_stack *ts = thread->ts, *new_ts;
+       unsigned int old_sz = ts ? ts->arr_sz : 0;
+       unsigned int new_sz = 1;
+
+       if (!ts || new_sz > old_sz) {
+               new_ts = calloc(new_sz, sizeof(*ts));
+               if (!new_ts)
+                       return NULL;
+               if (ts)
+                       memcpy(new_ts, ts, old_sz * sizeof(*ts));
+               new_ts->arr_sz = new_sz;
+               zfree(&thread->ts);
+               thread->ts = new_ts;
+               ts = new_ts;
        }
 
-       thread->ts = ts;
+       if (!ts->stack &&
+           thread_stack__init(ts, thread, crp))
+               return NULL;
 
        return ts;
 }