perf timechart: Make large arrays dynamic
authorIan Rogers <irogers@google.com>
Fri, 26 May 2023 18:33:55 +0000 (11:33 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sun, 28 May 2023 13:23:42 +0000 (10:23 -0300)
Allocate start time and state arrays when command starts rather than
using 114,688 bytes in .bss.

Signed-off-by: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20230526183401.2326121-11-irogers@google.com
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Ross Zwisler <zwisler@chromium.org>
Cc: Steven Rostedt (Google) <rostedt@goodmis.org>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Yang Jihong <yangjihong1@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org
Cc: linux-perf-users@vger.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-timechart.c

index bce1cf896f9c992f2e6e675cf5488d6409cd92b5..829d99fecfd00f9eddfc210b37f74b4dd2f00605 100644 (file)
@@ -315,10 +315,10 @@ static void pid_put_sample(struct timechart *tchart, int pid, int type,
 
 #define MAX_CPUS 4096
 
-static u64 cpus_cstate_start_times[MAX_CPUS];
-static int cpus_cstate_state[MAX_CPUS];
-static u64 cpus_pstate_start_times[MAX_CPUS];
-static u64 cpus_pstate_state[MAX_CPUS];
+static u64 *cpus_cstate_start_times;
+static int *cpus_cstate_state;
+static u64 *cpus_pstate_start_times;
+static u64 *cpus_pstate_state;
 
 static int process_comm_event(struct perf_tool *tool,
                              union perf_event *event,
@@ -1981,12 +1981,34 @@ int cmd_timechart(int argc, const char **argv)
                "perf timechart record [<options>]",
                NULL
        };
+       int ret;
+
+       cpus_cstate_start_times = calloc(MAX_CPUS, sizeof(*cpus_cstate_start_times));
+       if (!cpus_cstate_start_times)
+               return -ENOMEM;
+       cpus_cstate_state = calloc(MAX_CPUS, sizeof(*cpus_cstate_state));
+       if (!cpus_cstate_state) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       cpus_pstate_start_times = calloc(MAX_CPUS, sizeof(*cpus_pstate_start_times));
+       if (!cpus_pstate_start_times) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       cpus_pstate_state = calloc(MAX_CPUS, sizeof(*cpus_pstate_state));
+       if (!cpus_pstate_state) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
        argc = parse_options_subcommand(argc, argv, timechart_options, timechart_subcommands,
                        timechart_usage, PARSE_OPT_STOP_AT_NON_OPTION);
 
        if (tchart.power_only && tchart.tasks_only) {
                pr_err("-P and -T options cannot be used at the same time.\n");
-               return -1;
+               ret = -1;
+               goto out;
        }
 
        if (argc && strlen(argv[0]) > 2 && strstarts("record", argv[0])) {
@@ -1996,17 +2018,25 @@ int cmd_timechart(int argc, const char **argv)
 
                if (tchart.power_only && tchart.tasks_only) {
                        pr_err("-P and -T options cannot be used at the same time.\n");
-                       return -1;
+                       ret = -1;
+                       goto out;
                }
 
                if (tchart.io_only)
-                       return timechart__io_record(argc, argv);
+                       ret = timechart__io_record(argc, argv);
                else
-                       return timechart__record(&tchart, argc, argv);
+                       ret = timechart__record(&tchart, argc, argv);
+               goto out;
        } else if (argc)
                usage_with_options(timechart_usage, timechart_options);
 
        setup_pager();
 
-       return __cmd_timechart(&tchart, output_name);
+       ret = __cmd_timechart(&tchart, output_name);
+out:
+       zfree(&cpus_cstate_start_times);
+       zfree(&cpus_cstate_state);
+       zfree(&cpus_pstate_start_times);
+       zfree(&cpus_pstate_state);
+       return ret;
 }