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
 
 
        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;
 }
 
                               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;
 }
 
 
        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;
 }
 
                              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);
 
 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;
 
 
        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
                                     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;
        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;
 
        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;
        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;
        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;
 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;
        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);