Em Tue, Feb 25, 2014 at 10:43:47PM -0500, Don Zickus escreveu:
> Currently if a process creates a bunch of threads using pthread_create
> and then perf is run in system_wide mode, the mmaps for those threads
> are not captured with a synthesized mmap event.
> 
> The reason is those threads are not visible when walking the /proc/
> directory looking for /proc/<pid>/maps files.  Instead they are discovered
> using the /proc/<pid>/tasks file (which the synthesized comm event uses).
> 
> This causes problems when a program is trying to map a data address to a
> tid.  Because the tid has no maps, the event is dropped.  Changing the program
> to look up using the pid instead of the tid, finds the correct maps but 
> creates
> ugly hacks in the program to carry the correct tid around.
> 
> Fix this by synthesizing mmap events for each tid found in the 
> /proc/<pid>/tasks
> file.

This seems to cover two problems, the first is for mmap/mmap2 event
processing to lookup pid/tid instead of pid/pid, the other one is to
iterate thru /proc/pid/tasks/, so this needes spliting up.

Now looking at the /tasks/ part...
 
> This may not be entirely clean but it seems to work.
> 
> Signed-off-by: Don Zickus <dzic...@redhat.com>
> ---
>  tools/perf/util/event.c   | 15 +++++++++++----
>  tools/perf/util/machine.c |  4 ++--
>  2 files changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
> index 086c7c8..09c53bb 100644
> --- a/tools/perf/util/event.c
> +++ b/tools/perf/util/event.c
> @@ -93,10 +93,13 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char 
> *comm, size_t len)
>  }
>  
>  static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
> -                                      union perf_event *event, pid_t pid,
> +                                      union perf_event *event,
> +                                      union perf_event *mmap_event,
> +                                      pid_t pid,
>                                        int full,
>                                        perf_event__handler_t process,
> -                                      struct machine *machine)
> +                                      struct machine *machine,
> +                                      bool mmap_data)
>  {
>       char filename[PATH_MAX];
>       size_t size;
> @@ -168,6 +171,10 @@ static pid_t perf_event__synthesize_comm(struct 
> perf_tool *tool,
>                       tgid = -1;
>                       break;
>               }
> +
> +             /* process the thread's maps too */
> +             perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
> +                                               process, machine, mmap_data);
>       }
>  
>       closedir(tasks);
> @@ -331,8 +338,8 @@ static int __event__synthesize_thread(union perf_event 
> *comm_event,
>                                     struct perf_tool *tool,
>                                     struct machine *machine, bool mmap_data)
>  {
> -     pid_t tgid = perf_event__synthesize_comm(tool, comm_event, pid, full,
> -                                              process, machine);
> +     pid_t tgid = perf_event__synthesize_comm(tool, comm_event, mmap_event, 
> pid,
> +                                              full, process, machine, 
> mmap_data);
>       if (tgid == -1)
>               return -1;
>       return perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index 813e94e..eb26544 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -1026,7 +1026,7 @@ int machine__process_mmap2_event(struct machine 
> *machine,
>       }
>  
>       thread = machine__findnew_thread(machine, event->mmap2.pid,
> -                                     event->mmap2.pid);
> +                                     event->mmap2.tid);
>       if (thread == NULL)
>               goto out_problem;
>  
> @@ -1074,7 +1074,7 @@ int machine__process_mmap_event(struct machine 
> *machine, union perf_event *event
>       }
>  
>       thread = machine__findnew_thread(machine, event->mmap.pid,
> -                                      event->mmap.pid);
> +                                      event->mmap.tid);
>       if (thread == NULL)
>               goto out_problem;
>  
> -- 
> 1.7.11.7
--
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/

Reply via email to