lkml.org 
[lkml]   [2021]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 04/22] perf record: Stop threads in the end of trace streaming
    Date
    Signal thread to terminate by closing write fd of msg pipe.
    Receive THREAD_MSG__READY message as the confirmation of the
    thread's termination. Stop threads created for parallel trace
    streaming prior their stats processing.

    Acked-by: Andi Kleen <ak@linux.intel.com>
    Acked-by: Namhyung Kim <namhyung@gmail.com>
    Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
    ---
    tools/perf/builtin-record.c | 30 ++++++++++++++++++++++++++++++
    1 file changed, 30 insertions(+)

    diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
    index 3935c0fabe01..82a21da2af16 100644
    --- a/tools/perf/builtin-record.c
    +++ b/tools/perf/builtin-record.c
    @@ -112,6 +112,16 @@ struct thread_data {

    static __thread struct thread_data *thread;

    +enum thread_msg {
    + THREAD_MSG__UNDEFINED = 0,
    + THREAD_MSG__READY,
    + THREAD_MSG__MAX,
    +};
    +
    +static const char *thread_msg_tags[THREAD_MSG__MAX] = {
    + "UNDEFINED", "READY"
    +};
    +
    struct record {
    struct perf_tool tool;
    struct record_opts opts;
    @@ -1857,6 +1867,23 @@ static void record__uniquify_name(struct record *rec)
    }
    }

    +static int record__terminate_thread(struct thread_data *thread_data)
    +{
    + int res;
    + enum thread_msg ack = THREAD_MSG__UNDEFINED;
    + pid_t tid = thread_data->tid;
    +
    + close(thread_data->pipes.msg[1]);
    + res = read(thread_data->pipes.ack[0], &ack, sizeof(ack));
    + if (res != -1)
    + pr_debug2("threads[%d]: sent %s\n", tid, thread_msg_tags[ack]);
    + else
    + pr_err("threads[%d]: failed to recv msg=%s from tid=%d\n",
    + thread->tid, thread_msg_tags[ack], tid);
    +
    + return 0;
    +}
    +
    static int record__start_threads(struct record *rec)
    {
    struct thread_data *thread_data = rec->thread_data;
    @@ -1873,6 +1900,9 @@ static int record__stop_threads(struct record *rec, unsigned long *waking)
    int t;
    struct thread_data *thread_data = rec->thread_data;

    + for (t = 1; t < rec->nr_threads; t++)
    + record__terminate_thread(&thread_data[t]);
    +
    for (t = 0; t < rec->nr_threads; t++) {
    rec->samples += thread_data[t].samples;
    *waking += thread_data[t].waking;
    --
    2.19.0
    \
     
     \ /
      Last update: 2021-06-30 17:56    [W:2.480 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site