From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3CF88C432C0 for ; Fri, 29 Nov 2019 10:17:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 07BD720833 for ; Fri, 29 Nov 2019 10:17:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oRy4xyiy" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726897AbfK2KRx (ORCPT ); Fri, 29 Nov 2019 05:17:53 -0500 Received: from mail-lf1-f65.google.com ([209.85.167.65]:35909 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725892AbfK2KRx (ORCPT ); Fri, 29 Nov 2019 05:17:53 -0500 Received: by mail-lf1-f65.google.com with SMTP id f16so22232912lfm.3 for ; Fri, 29 Nov 2019 02:17:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7rulsqHWqiPANINuxP9O9HND35R2Nw4MwCZU59/68X0=; b=oRy4xyiynegeGTDE8/HJm0I/ZlsngiyN121WAka3Wi9MILVdLbilGLCSKWC9hmYGxP hsMVvILosP18atRKXi66dKoWjukfWkWAZ53VrUERoRxJqzAOJHQf14GDkUT8x1r6XF2B uZMOCoTGIIjlvyICT5zqovDYu/xrLHQscx8DFzEq6yk8vjbwp1A4Tyf4F3gVyP1RNMkN jDpx1zYQ2a2APJH/UmIbBLtk9gmNU51TBLU2VxtWuRxwa1kJ7Lff4gE2w+dXbVGklYft sIMTFGNK0ujr10lIk09fM3CgvFO1WOxa7/pKE4hE86j4exjQAoS5qUuej002FESQIl3A YJ9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7rulsqHWqiPANINuxP9O9HND35R2Nw4MwCZU59/68X0=; b=Xl0f4qWtAVn5jWf3pfU2tYZxT+4SO9acNPbF9hNVOtRiJeqtvc6O6k1d3HD521FtYL L9xevA2JEnynTet9OcTWuDovC7yR1tsCS3Q+xqDqP01hpCUNkpbEucgxnViB2Z7yLlEy V7pFjrTwc6iJC5UyRvW5/K4bwZmlzg/eWfL91AjOrjhuQPldpoGHufKcvPZdOrb1SsJ+ ja6jbirNCisMsAa7wGlDMEAl5PHGD6qzmN0QBwfdF3/LACyK2XggKupWbI1wqupNFRnm 0sp42rATEQNvQwM4q1xgMtuiH6QxIW3d9ecNJqqvWSA0Y9X0no/xJWkve2qrkJ38g1rj j7Iw== X-Gm-Message-State: APjAAAUyBiozTCpY/jazS/4vxsEUO1sRblbYnaJuAyKA1c24lE0edz8Q iPjMXZmepILlKeYiYA11iq3yLRRnoVg= X-Google-Smtp-Source: APXvYqx01RzxJwhvOHZCx9HYVQvpf2a4Bqx37yuRcsXJbJrY6A4KTl9vkmFHv2MrfwKgVJhasDadBQ== X-Received: by 2002:a05:6512:499:: with SMTP id v25mr32924273lfq.9.1575022669557; Fri, 29 Nov 2019 02:17:49 -0800 (PST) Received: from oberon.eng.vmware.com ([146.247.46.5]) by smtp.gmail.com with ESMTPSA id x29sm11367935lfg.45.2019.11.29.02.17.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Nov 2019 02:17:48 -0800 (PST) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v16 11/18] trace-cmd: Exchange tracing IDs between host and guest Date: Fri, 29 Nov 2019 12:17:26 +0200 Message-Id: <20191129101733.375808-12-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191129101733.375808-1-tz.stoyanov@gmail.com> References: <20191129101733.375808-1-tz.stoyanov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-trace-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org Extend the trace request and trace reply messages, to include also the IDs of host and guest tracing sessions. Those IDs are used to unambiguously match the tracing sessions, when reading trace.dat files. Signed-off-by: Tzvetomir Stoyanov (VMware) --- include/trace-cmd/trace-cmd.h | 12 ++++++++---- lib/trace-cmd/trace-msg.c | 31 +++++++++++++++++++++++-------- tracecmd/include/trace-local.h | 5 +++-- tracecmd/trace-agent.c | 12 +++++++----- tracecmd/trace-record.c | 12 +++++++++--- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h index 82def44..90fa146 100644 --- a/include/trace-cmd/trace-cmd.h +++ b/include/trace-cmd/trace-cmd.h @@ -353,16 +353,20 @@ bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle); void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle); int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, - int argc, char **argv, bool use_fifos); + int argc, char **argv, bool use_fifos, + unsigned long long trace_id); int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, - int *argc, char ***argv, bool *use_fifos); + int *argc, char ***argv, bool *use_fifos, + unsigned long long *trace_id); int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, int nr_cpus, int page_size, - unsigned int *ports, bool use_fifos); + unsigned int *ports, bool use_fifos, + unsigned long long trace_id); int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, int *nr_cpus, int *page_size, - unsigned int **ports, bool *use_fifos); + unsigned int **ports, bool *use_fifos, + unsigned long long *trace_id); /* --- ftrace instances --- */ struct tracecmd_instance { diff --git a/lib/trace-cmd/trace-msg.c b/lib/trace-cmd/trace-msg.c index 9c8a690..a34297f 100644 --- a/lib/trace-cmd/trace-msg.c +++ b/lib/trace-cmd/trace-msg.c @@ -63,12 +63,14 @@ struct tracecmd_msg_rinit { struct tracecmd_msg_trace_req { be32 flags; be32 argc; + u64 trace_id; } __attribute__((packed)); struct tracecmd_msg_trace_resp { be32 flags; be32 cpus; be32 page_size; + u64 trace_id; } __attribute__((packed)); struct tracecmd_msg_header { @@ -811,7 +813,8 @@ int tracecmd_msg_wait_close_resp(struct tracecmd_msg_handle *msg_handle) return tracecmd_msg_wait_for_cmd(msg_handle, MSG_CLOSE_RESP); } -static int make_trace_req(struct tracecmd_msg *msg, int argc, char **argv, bool use_fifos) +static int make_trace_req(struct tracecmd_msg *msg, int argc, char **argv, + bool use_fifos, unsigned long long trace_id) { size_t args_size = 0; char *p; @@ -823,6 +826,7 @@ static int make_trace_req(struct tracecmd_msg *msg, int argc, char **argv, bool msg->hdr.size = htonl(ntohl(msg->hdr.size) + args_size); msg->trace_req.flags = use_fifos ? htonl(MSG_TRACE_USE_FIFOS) : htonl(0); msg->trace_req.argc = htonl(argc); + msg->trace_req.trace_id = htonll(trace_id); msg->buf = calloc(args_size, 1); if (!msg->buf) return -ENOMEM; @@ -835,13 +839,15 @@ static int make_trace_req(struct tracecmd_msg *msg, int argc, char **argv, bool } int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, - int argc, char **argv, bool use_fifos) + int argc, char **argv, bool use_fifos, + unsigned long long trace_id) { struct tracecmd_msg msg; int ret; tracecmd_msg_init(MSG_TRACE_REQ, &msg); - ret = make_trace_req(&msg, argc, argv, use_fifos); + ret = make_trace_req(&msg, argc, argv, + use_fifos, trace_id); if (ret < 0) return ret; @@ -854,7 +860,8 @@ int tracecmd_msg_send_trace_req(struct tracecmd_msg_handle *msg_handle, * free(argv); */ int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, - int *argc, char ***argv, bool *use_fifos) + int *argc, char ***argv, bool *use_fifos, + unsigned long long *trace_id) { struct tracecmd_msg msg; char *p, *buf_end, **args; @@ -901,6 +908,7 @@ int tracecmd_msg_recv_trace_req(struct tracecmd_msg_handle *msg_handle, *argc = nr_args; *argv = args; *use_fifos = ntohl(msg.trace_req.flags) & MSG_TRACE_USE_FIFOS; + *trace_id = ntohll(msg.trace_req.trace_id); /* * On success we're passing msg.buf to the caller through argv[0] so we @@ -921,7 +929,8 @@ out: } static int make_trace_resp(struct tracecmd_msg *msg, int page_size, int nr_cpus, - unsigned int *ports, bool use_fifos) + unsigned int *ports, bool use_fifos, + unsigned long long trace_id) { int data_size; @@ -935,19 +944,22 @@ static int make_trace_resp(struct tracecmd_msg *msg, int page_size, int nr_cpus, msg->trace_resp.flags = use_fifos ? htonl(MSG_TRACE_USE_FIFOS) : htonl(0); msg->trace_resp.cpus = htonl(nr_cpus); msg->trace_resp.page_size = htonl(page_size); + msg->trace_resp.trace_id = htonll(trace_id); return 0; } int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, int nr_cpus, int page_size, - unsigned int *ports, bool use_fifos) + unsigned int *ports, bool use_fifos, + unsigned long long trace_id) { struct tracecmd_msg msg; int ret; tracecmd_msg_init(MSG_TRACE_RESP, &msg); - ret = make_trace_resp(&msg, page_size, nr_cpus, ports, use_fifos); + ret = make_trace_resp(&msg, page_size, nr_cpus, ports, + use_fifos, trace_id); if (ret < 0) return ret; @@ -956,13 +968,15 @@ int tracecmd_msg_send_trace_resp(struct tracecmd_msg_handle *msg_handle, int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, int *nr_cpus, int *page_size, - unsigned int **ports, bool *use_fifos) + unsigned int **ports, bool *use_fifos, + unsigned long long *trace_id) { struct tracecmd_msg msg; char *p, *buf_end; ssize_t buf_len; int i, ret; + memset(&msg, 0, sizeof(msg)); ret = tracecmd_msg_recv(msg_handle->fd, &msg); if (ret < 0) return ret; @@ -981,6 +995,7 @@ int tracecmd_msg_recv_trace_resp(struct tracecmd_msg_handle *msg_handle, *use_fifos = ntohl(msg.trace_resp.flags) & MSG_TRACE_USE_FIFOS; *nr_cpus = ntohl(msg.trace_resp.cpus); *page_size = ntohl(msg.trace_resp.page_size); + *trace_id = ntohll(msg.trace_resp.trace_id); *ports = calloc(*nr_cpus, sizeof(**ports)); if (!*ports) { ret = -ENOMEM; diff --git a/tracecmd/include/trace-local.h b/tracecmd/include/trace-local.h index 6203e0d..a6f79c5 100644 --- a/tracecmd/include/trace-local.h +++ b/tracecmd/include/trace-local.h @@ -98,8 +98,9 @@ void trace_usage(int argc, char **argv); int trace_record_agent(struct tracecmd_msg_handle *msg_handle, int cpus, int *fds, - int argc, char **argv, bool use_fifos); - + int argc, char **argv, + bool use_fifos, + unsigned long long trace_id); struct hook_list; void trace_init_profile(struct tracecmd_input *handle, struct hook_list *hooks, diff --git a/tracecmd/trace-agent.c b/tracecmd/trace-agent.c index 1c6e0a3..cc330b7 100644 --- a/tracecmd/trace-agent.c +++ b/tracecmd/trace-agent.c @@ -128,6 +128,7 @@ cleanup: static void agent_handle(int sd, int nr_cpus, int page_size) { struct tracecmd_msg_handle *msg_handle; + unsigned long long trace_id; unsigned int *ports; char **argv = NULL; int argc = 0; @@ -144,7 +145,8 @@ static void agent_handle(int sd, int nr_cpus, int page_size) if (!msg_handle) die("Failed to allocate message handle"); - ret = tracecmd_msg_recv_trace_req(msg_handle, &argc, &argv, &use_fifos); + ret = tracecmd_msg_recv_trace_req(msg_handle, &argc, &argv, + &use_fifos, &trace_id); if (ret < 0) die("Failed to receive trace request"); @@ -153,13 +155,13 @@ static void agent_handle(int sd, int nr_cpus, int page_size) if (!use_fifos) make_vsocks(nr_cpus, fds, ports); - + trace_id = tracecmd_generate_traceid(); ret = tracecmd_msg_send_trace_resp(msg_handle, nr_cpus, page_size, - ports, use_fifos); + ports, use_fifos, trace_id); if (ret < 0) die("Failed to send trace response"); - - trace_record_agent(msg_handle, nr_cpus, fds, argc, argv, use_fifos); + trace_record_agent(msg_handle, nr_cpus, fds, argc, argv, + use_fifos, trace_id); free(argv[0]); free(argv); diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c index 01a74f1..e51134f 100644 --- a/tracecmd/trace-record.c +++ b/tracecmd/trace-record.c @@ -3507,12 +3507,16 @@ static void connect_to_agent(struct buffer_instance *instance) die("Failed to allocate message handle"); ret = tracecmd_msg_send_trace_req(msg_handle, instance->argc, - instance->argv, use_fifos); + instance->argv, use_fifos, + top_instance.trace_id); + if (ret < 0) die("Failed to send trace request"); ret = tracecmd_msg_recv_trace_resp(msg_handle, &nr_cpus, &page_size, - &ports, &use_fifos); + &ports, &use_fifos, + &instance->trace_id); + if (ret < 0) die("Failed to receive trace response"); @@ -6117,7 +6121,8 @@ void trace_record(int argc, char **argv) int trace_record_agent(struct tracecmd_msg_handle *msg_handle, int cpus, int *fds, int argc, char **argv, - bool use_fifos) + bool use_fifos, + unsigned long long trace_id) { struct common_record_context ctx; char **argv_plus; @@ -6147,6 +6152,7 @@ int trace_record_agent(struct tracecmd_msg_handle *msg_handle, ctx.instance->flags |= BUFFER_FL_AGENT; ctx.instance->msg_handle = msg_handle; msg_handle->version = V3_PROTOCOL; + top_instance.trace_id = trace_id; record_trace(argc, argv, &ctx); free(argv_plus); -- 2.23.0