Commit ddc27bb8 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf timechart: Make large arrays dynamic



Allocate start time and state arrays when command starts rather than
using 114,688 bytes in .bss.

Signed-off-by: default avatarIan 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent eef4fee5
Loading
Loading
Loading
Loading
+39 −9
Original line number Diff line number Diff line
@@ -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;
}