On Fri, May 14, 2021 at 3:33 AM Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > > From: "Steven Rostedt (VMware)" <rostedt@xxxxxxxxxxx> > > If qemu is not found, then there's no mapping between the vCPUs of the > guest and the threads that run them. As the time sync has the agent run on > all the guest's CPUs, trace it, looking for all kvm_entry, which state > which vCPU the host thread is entering on the guest, and then use that to > create the mapping for the data files. > > Only parse for qemu if no CID is given on the command line. > > Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> > --- > Changes since v1: > - Skipped v2 (added to v3 of this patch series) > - Used some of the new APIs of libtracefs 1.2 > - Call read_qemu_guests is CID is not supplied on the command line. > > tracecmd/include/trace-local.h | 2 + > tracecmd/trace-record.c | 202 ++++++++++++++++++++++++++++++++- > 2 files changed, 203 insertions(+), 1 deletion(-) > > diff --git a/tracecmd/include/trace-local.h b/tracecmd/include/trace-local.h > index b3997d00..4c5669c9 100644 > --- a/tracecmd/include/trace-local.h > +++ b/tracecmd/include/trace-local.h > @@ -298,11 +298,13 @@ void update_first_instance(struct buffer_instance *instance, int topt); > void show_instance_file(struct buffer_instance *instance, const char *name); > > struct trace_guest { > + struct tracefs_instance *instance; > char *name; > int cid; > int pid; > int cpu_max; > int *cpu_pid; > + int *task_pids; > }; > struct trace_guest *trace_get_guest(unsigned int cid, const char *name); > bool trace_have_guests_pid(void); > diff --git a/tracecmd/trace-record.c b/tracecmd/trace-record.c > index 5dd8be4a..5219d60b 100644 > --- a/tracecmd/trace-record.c > +++ b/tracecmd/trace-record.c > @@ -3230,6 +3230,38 @@ static int do_accept(int sd) > return -1; > } > > +/* Find all the tasks associated with the guest pid */ > +static void find_tasks(struct trace_guest *guest) > +{ > + struct dirent *dent; > + char *path; > + DIR *dir; > + int ret; > + int tasks = 0; > + > + ret = asprintf(&path, "/proc/%d/task", guest->pid); > + if (ret < 0) > + return; > + > + dir = opendir(path); > + free(path); > + if (!dir) > + return; > + > + while ((dent = readdir(dir))) { > + int *pids; > + if (!(dent->d_type == DT_DIR && is_digits(dent->d_name))) > + continue; > + pids = realloc(guest->task_pids, sizeof(int) * (tasks + 2)); > + if (!pids) > + break; > + pids[tasks++] = strtol(dent->d_name, NULL, 0); > + pids[tasks] = -1; > + guest->task_pids = pids; > + } > + closedir(dir); > +} > + > static char *parse_guest_name(char *gname, int *cid, int *port) > { > struct trace_guest *guest; > @@ -3250,10 +3282,18 @@ static char *parse_guest_name(char *gname, int *cid, int *port) > } else if (is_digits(gname)) > *cid = atoi(gname); > > - read_qemu_guests(); > + if (*cid < 0) > + read_qemu_guests(); > + > + if (*cid < 0) > + return NULL; This check is not needed. If cid is not part of the string, let read_qemu_guests() to try discover the VMs, instead of returning NULL. [ ... ] -- Tzvetomir (Ceco) Stoyanov VMware Open Source Technology Center