perf events: Prefer union over variable length array
It is possible for casts to introduce alignment issues, prefer a union for perf_record_event_update. Signed-off-by: Ian Rogers <irogers@google.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com> Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com> Cc: Colin Ian King <colin.king@intel.com> Cc: Dave Marchevsky <davemarchevsky@fb.com> Cc: German Gomez <german.gomez@arm.com> Cc: Gustavo A. R. Silva <gustavoars@kernel.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Kees Kook <keescook@chromium.org> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Riccardo Mancini <rickyman7@gmail.com> Cc: Song Liu <songliubraving@fb.com> Cc: Stephane Eranian <eranian@google.com> Link: https://lore.kernel.org/r/20220614143353.1559597-6-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
3657ad4b0f
commit
d773c999b8
@ -233,7 +233,16 @@ struct perf_record_event_update {
|
||||
struct perf_event_header header;
|
||||
__u64 type;
|
||||
__u64 id;
|
||||
char data[];
|
||||
union {
|
||||
/* Used when type == PERF_EVENT_UPDATE__SCALE. */
|
||||
struct perf_record_event_update_scale scale;
|
||||
/* Used when type == PERF_EVENT_UPDATE__UNIT. */
|
||||
char unit[0];
|
||||
/* Used when type == PERF_EVENT_UPDATE__NAME. */
|
||||
char name[0];
|
||||
/* Used when type == PERF_EVENT_UPDATE__CPUS. */
|
||||
struct perf_record_event_update_cpus cpus;
|
||||
};
|
||||
};
|
||||
|
||||
#define MAX_EVENT_NAME 64
|
||||
|
@ -21,7 +21,7 @@ static int process_event_unit(struct perf_tool *tool __maybe_unused,
|
||||
|
||||
TEST_ASSERT_VAL("wrong id", ev->id == 123);
|
||||
TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__UNIT);
|
||||
TEST_ASSERT_VAL("wrong unit", !strcmp(ev->data, "KRAVA"));
|
||||
TEST_ASSERT_VAL("wrong unit", !strcmp(ev->unit, "KRAVA"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -31,13 +31,10 @@ static int process_event_scale(struct perf_tool *tool __maybe_unused,
|
||||
struct machine *machine __maybe_unused)
|
||||
{
|
||||
struct perf_record_event_update *ev = (struct perf_record_event_update *)event;
|
||||
struct perf_record_event_update_scale *ev_data;
|
||||
|
||||
ev_data = (struct perf_record_event_update_scale *)ev->data;
|
||||
|
||||
TEST_ASSERT_VAL("wrong id", ev->id == 123);
|
||||
TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__SCALE);
|
||||
TEST_ASSERT_VAL("wrong scale", ev_data->scale == 0.123);
|
||||
TEST_ASSERT_VAL("wrong scale", ev->scale.scale == 0.123);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -56,7 +53,7 @@ static int process_event_name(struct perf_tool *tool,
|
||||
|
||||
TEST_ASSERT_VAL("wrong id", ev->id == 123);
|
||||
TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__NAME);
|
||||
TEST_ASSERT_VAL("wrong name", !strcmp(ev->data, tmp->name));
|
||||
TEST_ASSERT_VAL("wrong name", !strcmp(ev->name, tmp->name));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -66,12 +63,9 @@ static int process_event_cpus(struct perf_tool *tool __maybe_unused,
|
||||
struct machine *machine __maybe_unused)
|
||||
{
|
||||
struct perf_record_event_update *ev = (struct perf_record_event_update *)event;
|
||||
struct perf_record_event_update_cpus *ev_data;
|
||||
struct perf_cpu_map *map;
|
||||
|
||||
ev_data = (struct perf_record_event_update_cpus *) ev->data;
|
||||
|
||||
map = cpu_map__new_data(&ev_data->cpus);
|
||||
map = cpu_map__new_data(&ev->cpus.cpus);
|
||||
|
||||
TEST_ASSERT_VAL("wrong id", ev->id == 123);
|
||||
TEST_ASSERT_VAL("wrong type", ev->type == PERF_EVENT_UPDATE__CPUS);
|
||||
|
@ -4295,8 +4295,6 @@ out:
|
||||
size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp)
|
||||
{
|
||||
struct perf_record_event_update *ev = &event->event_update;
|
||||
struct perf_record_event_update_scale *ev_scale;
|
||||
struct perf_record_event_update_cpus *ev_cpus;
|
||||
struct perf_cpu_map *map;
|
||||
size_t ret;
|
||||
|
||||
@ -4304,20 +4302,18 @@ size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp)
|
||||
|
||||
switch (ev->type) {
|
||||
case PERF_EVENT_UPDATE__SCALE:
|
||||
ev_scale = (struct perf_record_event_update_scale *)ev->data;
|
||||
ret += fprintf(fp, "... scale: %f\n", ev_scale->scale);
|
||||
ret += fprintf(fp, "... scale: %f\n", ev->scale.scale);
|
||||
break;
|
||||
case PERF_EVENT_UPDATE__UNIT:
|
||||
ret += fprintf(fp, "... unit: %s\n", ev->data);
|
||||
ret += fprintf(fp, "... unit: %s\n", ev->unit);
|
||||
break;
|
||||
case PERF_EVENT_UPDATE__NAME:
|
||||
ret += fprintf(fp, "... name: %s\n", ev->data);
|
||||
ret += fprintf(fp, "... name: %s\n", ev->name);
|
||||
break;
|
||||
case PERF_EVENT_UPDATE__CPUS:
|
||||
ev_cpus = (struct perf_record_event_update_cpus *)ev->data;
|
||||
ret += fprintf(fp, "... ");
|
||||
|
||||
map = cpu_map__new_data(&ev_cpus->cpus);
|
||||
map = cpu_map__new_data(&ev->cpus.cpus);
|
||||
if (map)
|
||||
ret += cpu_map__fprintf(map, fp);
|
||||
else
|
||||
@ -4374,8 +4370,6 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
|
||||
struct evlist **pevlist)
|
||||
{
|
||||
struct perf_record_event_update *ev = &event->event_update;
|
||||
struct perf_record_event_update_scale *ev_scale;
|
||||
struct perf_record_event_update_cpus *ev_cpus;
|
||||
struct evlist *evlist;
|
||||
struct evsel *evsel;
|
||||
struct perf_cpu_map *map;
|
||||
@ -4395,19 +4389,17 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
|
||||
switch (ev->type) {
|
||||
case PERF_EVENT_UPDATE__UNIT:
|
||||
free((char *)evsel->unit);
|
||||
evsel->unit = strdup(ev->data);
|
||||
evsel->unit = strdup(ev->unit);
|
||||
break;
|
||||
case PERF_EVENT_UPDATE__NAME:
|
||||
free(evsel->name);
|
||||
evsel->name = strdup(ev->data);
|
||||
evsel->name = strdup(ev->name);
|
||||
break;
|
||||
case PERF_EVENT_UPDATE__SCALE:
|
||||
ev_scale = (struct perf_record_event_update_scale *)ev->data;
|
||||
evsel->scale = ev_scale->scale;
|
||||
evsel->scale = ev->scale.scale;
|
||||
break;
|
||||
case PERF_EVENT_UPDATE__CPUS:
|
||||
ev_cpus = (struct perf_record_event_update_cpus *)ev->data;
|
||||
map = cpu_map__new_data(&ev_cpus->cpus);
|
||||
map = cpu_map__new_data(&ev->cpus.cpus);
|
||||
if (map) {
|
||||
perf_cpu_map__put(evsel->core.own_cpus);
|
||||
evsel->core.own_cpus = map;
|
||||
|
@ -1955,7 +1955,7 @@ int perf_event__synthesize_event_update_unit(struct perf_tool *tool, struct evse
|
||||
if (ev == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
strlcpy(ev->data, evsel->unit, size + 1);
|
||||
strlcpy(ev->unit, evsel->unit, size + 1);
|
||||
err = process(tool, (union perf_event *)ev, NULL, NULL);
|
||||
free(ev);
|
||||
return err;
|
||||
@ -1972,8 +1972,7 @@ int perf_event__synthesize_event_update_scale(struct perf_tool *tool, struct evs
|
||||
if (ev == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
ev_data = (struct perf_record_event_update_scale *)ev->data;
|
||||
ev_data->scale = evsel->scale;
|
||||
ev->scale.scale = evsel->scale;
|
||||
err = process(tool, (union perf_event *)ev, NULL, NULL);
|
||||
free(ev);
|
||||
return err;
|
||||
@ -1990,7 +1989,7 @@ int perf_event__synthesize_event_update_name(struct perf_tool *tool, struct evse
|
||||
if (ev == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
strlcpy(ev->data, evsel->name, len + 1);
|
||||
strlcpy(ev->name, evsel->name, len + 1);
|
||||
err = process(tool, (union perf_event *)ev, NULL, NULL);
|
||||
free(ev);
|
||||
return err;
|
||||
@ -1999,7 +1998,7 @@ int perf_event__synthesize_event_update_name(struct perf_tool *tool, struct evse
|
||||
int perf_event__synthesize_event_update_cpus(struct perf_tool *tool, struct evsel *evsel,
|
||||
perf_event__handler_t process)
|
||||
{
|
||||
size_t size = sizeof(struct perf_record_event_update);
|
||||
size_t size = sizeof(struct perf_event_header) + sizeof(u64) + sizeof(u64);
|
||||
struct perf_record_event_update *ev;
|
||||
int max, err;
|
||||
u16 type;
|
||||
@ -2016,8 +2015,7 @@ int perf_event__synthesize_event_update_cpus(struct perf_tool *tool, struct evse
|
||||
ev->type = PERF_EVENT_UPDATE__CPUS;
|
||||
ev->id = evsel->core.id[0];
|
||||
|
||||
cpu_map_data__synthesize((struct perf_record_cpu_map_data *)ev->data,
|
||||
evsel->core.own_cpus, type, max);
|
||||
cpu_map_data__synthesize(&ev->cpus.cpus, evsel->core.own_cpus, type, max);
|
||||
|
||||
err = process(tool, (union perf_event *)ev, NULL, NULL);
|
||||
free(ev);
|
||||
|
Loading…
Reference in New Issue
Block a user