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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 42774806
...@@ -108,24 +108,45 @@ static int perf_read_values__findnew_thread(struct perf_read_values *values, ...@@ -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));
if (!counterrawid) {
pr_debug("failed to enlarge read_values rawid array");
goto out_enomem;
}
values->counters_max *= 2; countername = realloc(values->countername, counters_max * sizeof(*values->countername));
values->counterrawid = realloc(values->counterrawid, if (!countername) {
values->counters_max * sizeof(*values->counterrawid)); pr_debug("failed to enlarge read_values rawid array");
values->countername = realloc(values->countername, goto out_free_rawid;
values->counters_max * sizeof(*values->countername)); }
if (!values->counterrawid || !values->countername)
die("failed to enlarge read_values counters arrays");
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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment