On Wed, Sep 23, 2015 at 12:09:20AM -0300, Arnaldo Carvalho de Melo wrote: > Le 23 sept. 2015 12:04 AM, "Namhyung Kim" <namhy...@kernel.org> a écrit : > > > > Hi Arnaldo, > > > > On Tue, Sep 22, 2015 at 04:48:25PM -0300, Arnaldo Carvalho de Melo wrote: > > > Humm, I think it is working by accident, as you're not allocating space > > > for machine->id_hdr_size, please take a look at > > > perf_event__synthesize_thread_map(). > > > > > > Right now its not a problem this line in perf_event__prepare_comm(): > > > > > > memset(event->comm.comm + size, 0, machine->id_hdr_size); > > > > > > Because perf_event is an union and some of its elements, like mmap/mmap2 > > > have that PATH_MAX part, but its just a matter of the id_hdr_size > > > becoming bigger than that and we'll have a problem... > > > > Right. I'll send a fix to include the id_hdr part. > > Thanks!
>From 10123021c4e55f14d3bb8e6cc576694bb76d6699 Mon Sep 17 00:00:00 2001 From: Namhyung Kim <namhy...@kernel.org> Date: Wed, 23 Sep 2015 11:51:40 +0900 Subject: [PATCH] perf record: Allocate area for sample_id_hdr in a synthesized comm event A previous patch added a synthesized comm event for forked child process but it missed that the event should contain area for sample_id_hdr at the end. It worked by accident since the perf_event union contains bigger event structs like mmap_events. This patch fixes it by dynamically allocating event struct including those area like in perf_event__synthesize_thread_map(). Reported-by: Arnaldo Carvalho de Melo <a...@kernel.org> Signed-off-by: Namhyung Kim <namhy...@kernel.org> --- tools/perf/builtin-record.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 6d8302d4612f..5e01c070dbf2 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -637,7 +637,13 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) * Let the child rip */ if (forks) { - union perf_event event; + union perf_event *event; + + event = malloc(sizeof(event->comm) + machine->id_hdr_size); + if (event == NULL) { + err = -ENOMEM; + goto out_child; + } /* * Some H/W events are generated before COMM event @@ -645,10 +651,11 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) * cannot see a correct process name for those events. * Synthesize COMM event to prevent it. */ - perf_event__synthesize_comm(tool, &event, + perf_event__synthesize_comm(tool, event, rec->evlist->workload.pid, process_synthesized_event, - &session->machines.host); + machine); + free(event); perf_evlist__start_workload(rec->evlist); } -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/