perf tools: Handle allocation failures gracefully

The callers of perf_read_values__enlarge_counters() already propagate
errors, so just print some debug diagnostics and handle allocation
failures gracefully, not trying to do silly things like 'a =
realloc(a)'.

Link: http://lkml.kernel.org/n/tip-nsmmh7uzpg35rzcl9nq7yztp@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2017-04-04 12:05:37 -03:00
parent 427748068a
commit f05082b547

View File

@ -108,24 +108,45 @@ static int perf_read_values__findnew_thread(struct perf_read_values *values,
return i; return i;
} }
static void perf_read_values__enlarge_counters(struct perf_read_values *values) static int perf_read_values__enlarge_counters(struct perf_read_values *values)
{ {
int i; char **countername;
int i, counters_max = values->counters_max * 2;
u64 *counterrawid = realloc(values->counterrawid, counters_max * sizeof(*values->counterrawid));
values->counters_max *= 2; if (!counterrawid) {
values->counterrawid = realloc(values->counterrawid, pr_debug("failed to enlarge read_values rawid array");
values->counters_max * sizeof(*values->counterrawid)); goto out_enomem;
values->countername = realloc(values->countername, }
values->counters_max * sizeof(*values->countername));
if (!values->counterrawid || !values->countername) countername = realloc(values->countername, counters_max * sizeof(*values->countername));
die("failed to enlarge read_values counters arrays"); if (!countername) {
pr_debug("failed to enlarge read_values rawid array");
goto out_free_rawid;
}
for (i = 0; i < values->threads; i++) { for (i = 0; i < values->threads; i++) {
values->value[i] = realloc(values->value[i], u64 *value = realloc(values->value[i], counters_max * sizeof(**values->value));
values->counters_max * sizeof(**values->value));
if (!values->value[i]) if (value) {
die("failed to enlarge read_values counters arrays"); pr_debug("failed to enlarge read_values ->values array");
goto out_free_name;
}
values->value[i] = value;
} }
values->counters_max = counters_max;
values->counterrawid = counterrawid;
values->countername = countername;
return 0;
out_free_name:
free(countername);
out_free_rawid:
free(counterrawid);
out_enomem:
return -ENOMEM;
} }
static int perf_read_values__findnew_counter(struct perf_read_values *values, static int perf_read_values__findnew_counter(struct perf_read_values *values,
@ -137,8 +158,11 @@ static int perf_read_values__findnew_counter(struct perf_read_values *values,
if (values->counterrawid[i] == rawid) if (values->counterrawid[i] == rawid)
return i; return i;
if (values->counters == values->counters_max) if (values->counters == values->counters_max) {
perf_read_values__enlarge_counters(values); i = perf_read_values__enlarge_counters(values);
if (i)
return i;
}
i = values->counters++; i = values->counters++;
values->counterrawid[i] = rawid; values->counterrawid[i] = rawid;