lkml.org 
[lkml]   [2022]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 06/16] 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>
    Reviewed-by: Riccardo Mancini <rickyman7@gmail.com>
    Tested-by: Riccardo Mancini <rickyman7@gmail.com>
    Signed-off-by: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
    ---
    tools/perf/builtin-record.c | 31 +++++++++++++++++++++++++++++++
    1 file changed, 31 insertions(+)

    diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
    index 163d261dd293..0e65b80927b7 100644
    --- a/tools/perf/builtin-record.c
    +++ b/tools/perf/builtin-record.c
    @@ -114,6 +114,16 @@ struct record_thread {

    static __thread struct record_thread *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;
    @@ -1886,6 +1896,24 @@ static void record__uniquify_name(struct record *rec)
    }
    }

    +static int record__terminate_thread(struct record_thread *thread_data)
    +{
    + int err;
    + enum thread_msg ack = THREAD_MSG__UNDEFINED;
    + pid_t tid = thread_data->tid;
    +
    + close(thread_data->pipes.msg[1]);
    + thread_data->pipes.msg[1] = -1;
    + err = read(thread_data->pipes.ack[0], &ack, sizeof(ack));
    + if (err > 0)
    + pr_debug2("threads[%d]: sent %s\n", tid, thread_msg_tags[ack]);
    + else
    + pr_warning("threads[%d]: failed to receive termination notification from %d\n",
    + thread->tid, tid);
    +
    + return 0;
    +}
    +
    static int record__start_threads(struct record *rec)
    {
    struct record_thread *thread_data = rec->thread_data;
    @@ -1902,6 +1930,9 @@ static int record__stop_threads(struct record *rec)
    int t;
    struct record_thread *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;

    --
    2.19.0
    \
     
     \ /
      Last update: 2022-01-17 19:35    [W:5.023 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site