From: Namhyung Kim <[email protected]>

When perf tries to start a workload, it relies on a pipe which the
workload was blocked for reading.  After closing the pipe on the
parent, the workload (child) can start the actual work via exec().

However, if another process was forked after creating a workload, this
mechanism cannot work since the other process (child) also inherits
the pipe, so that closing the pipe in parent cannot unblock the
workload.  Fix it by using explicit write call can then closing it.

For similar reason, the pipe fd on parent should be marked as CLOEXEC
so that it can be closed after another child exec'ed.

Signed-off-by: Namhyung Kim <[email protected]>
---
 tools/perf/util/evlist.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 89aea20984ca..4a901be599ed 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -821,6 +821,7 @@ int perf_evlist__prepare_workload(struct perf_evlist 
*evlist,
                goto out_close_pipes;
        }
 
+       fcntl(go_pipe[1], F_SETFD, FD_CLOEXEC);
        evlist->workload.cork_fd = go_pipe[1];
        close(child_ready_pipe[0]);
        return 0;
@@ -837,10 +838,17 @@ out_close_ready_pipe:
 int perf_evlist__start_workload(struct perf_evlist *evlist)
 {
        if (evlist->workload.cork_fd > 0) {
+               char bf;
+               int ret;
                /*
                 * Remove the cork, let it rip!
                 */
-               return close(evlist->workload.cork_fd);
+               ret = write(evlist->workload.cork_fd, &bf, 1);
+               if (ret < 0)
+                       perror("enable to write to pipe");
+
+               close(evlist->workload.cork_fd);
+               return ret;
        }
 
        return 0;
-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
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