mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-26 11:28:28 +00:00
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:
parent
427748068a
commit
f05082b547
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user