From: Slavomir Kaslev <kaslevs@vmware.com>
To: rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org
Subject: [PATCH v14 09/13] trace-cmd: Add `trace-cmd setup-guest` command
Date: Tue, 17 Sep 2019 16:15:34 +0300 [thread overview]
Message-ID: <20190917131538.31926-10-kaslevs@vmware.com> (raw)
In-Reply-To: <20190917131538.31926-1-kaslevs@vmware.com>
Add `trace-cmd setup-guest` command that creates the necessary FIFOs for tracing
a guest over FIFOs instead of vsockets.
Signed-off-by: Slavomir Kaslev <kaslevs@vmware.com>
---
tracecmd/Makefile | 1 +
tracecmd/include/trace-local.h | 6 ++
tracecmd/trace-cmd.c | 1 +
tracecmd/trace-setup-guest.c | 178 +++++++++++++++++++++++++++++++++
tracecmd/trace-usage.c | 8 ++
5 files changed, 194 insertions(+)
create mode 100644 tracecmd/trace-setup-guest.c
diff --git a/tracecmd/Makefile b/tracecmd/Makefile
index fb85e47..29a623b 100644
--- a/tracecmd/Makefile
+++ b/tracecmd/Makefile
@@ -33,6 +33,7 @@ TRACE_CMD_OBJS += trace-usage.o
ifeq ($(VSOCK_DEFINED), 1)
TRACE_CMD_OBJS += trace-agent.o
+TRACE_CMD_OBJS += trace-setup-guest.o
endif
ALL_OBJS := $(TRACE_CMD_OBJS:%.o=$(bdir)/%.o)
diff --git a/tracecmd/include/trace-local.h b/tracecmd/include/trace-local.h
index 00a8e38..4df8686 100644
--- a/tracecmd/include/trace-local.h
+++ b/tracecmd/include/trace-local.h
@@ -14,6 +14,10 @@
#define TRACE_AGENT_DEFAULT_PORT 823
+#define GUEST_PIPE_NAME "trace-pipe-cpu"
+#define GUEST_DIR_FMT "/var/lib/trace-cmd/virt/%s"
+#define GUEST_FIFO_FMT GUEST_DIR_FMT "/" GUEST_PIPE_NAME "%d"
+
extern int quiet;
/* fix stupid glib guint64 typecasts and printf formats */
@@ -67,6 +71,8 @@ void trace_listen(int argc, char **argv);
void trace_agent(int argc, char **argv);
+void trace_setup_guest(int argc, char **argv);
+
void trace_restore(int argc, char **argv);
void trace_clear(int argc, char **argv);
diff --git a/tracecmd/trace-cmd.c b/tracecmd/trace-cmd.c
index cdaaadf..afc84a8 100644
--- a/tracecmd/trace-cmd.c
+++ b/tracecmd/trace-cmd.c
@@ -84,6 +84,7 @@ struct command commands[] = {
{"listen", trace_listen},
#ifdef VSOCK
{"agent", trace_agent},
+ {"setup-guest", trace_setup_guest},
#endif
{"split", trace_split},
{"restore", trace_restore},
diff --git a/tracecmd/trace-setup-guest.c b/tracecmd/trace-setup-guest.c
new file mode 100644
index 0000000..a6f58dc
--- /dev/null
+++ b/tracecmd/trace-setup-guest.c
@@ -0,0 +1,178 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 VMware Inc, Slavomir Kaslev <kaslevs@vmware.com>
+ *
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <grp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "trace-local.h"
+#include "trace-msg.h"
+
+static int make_dir(const char *path, mode_t mode)
+{
+ char buf[PATH_MAX+2], *p;
+
+ strncpy(buf, path, sizeof(buf));
+ if (buf[PATH_MAX])
+ return -E2BIG;
+
+ for (p = buf; *p; p++) {
+ p += strspn(p, "/");
+ p += strcspn(p, "/");
+ *p = '\0';
+ if (mkdir(buf, mode) < 0 && errno != EEXIST)
+ return -errno;
+ *p = '/';
+ }
+
+ return 0;
+}
+
+static int make_fifo(const char *path, mode_t mode)
+{
+ struct stat st;
+
+ if (!stat(path, &st)) {
+ if (S_ISFIFO(st.st_mode))
+ return 0;
+ return -EEXIST;
+ }
+
+ if (mkfifo(path, mode))
+ return -errno;
+ return 0;
+}
+
+static int make_guest_dir(const char *guest)
+{
+ char path[PATH_MAX];
+
+ snprintf(path, sizeof(path), GUEST_DIR_FMT, guest);
+ return make_dir(path, 0750);
+}
+
+static int make_guest_fifo(const char *guest, int cpu, mode_t mode)
+{
+ static const char *exts[] = {".in", ".out"};
+ char path[PATH_MAX];
+ int i, ret = 0;
+
+ for (i = 0; i < ARRAY_SIZE(exts); i++) {
+ snprintf(path, sizeof(path), GUEST_FIFO_FMT "%s",
+ guest, cpu, exts[i]);
+ ret = make_fifo(path, mode);
+ if (ret < 0)
+ break;
+ }
+
+ return ret;
+}
+
+static int make_guest_fifos(const char *guest, int nr_cpus, mode_t mode)
+{
+ int i, ret = 0;
+ mode_t mask;
+
+ mask = umask(0);
+ for (i = 0; i < nr_cpus; i++) {
+ ret = make_guest_fifo(guest, i, mode);
+ if (ret < 0)
+ break;
+ }
+ umask(mask);
+
+ return ret;
+}
+
+static void do_setup_guest(const char *guest, int nr_cpus, mode_t mode, gid_t gid)
+{
+ gid_t save_egid;
+ int ret;
+
+ if (gid != -1) {
+ save_egid = getegid();
+ ret = setegid(gid);
+ if (ret < 0)
+ pdie("failed to set effective group ID");
+ }
+
+ ret = make_guest_dir(guest);
+ if (ret < 0)
+ pdie("failed to create guest directory for %s", guest);
+
+ ret = make_guest_fifos(guest, nr_cpus, mode);
+ if (ret < 0)
+ pdie("failed to create FIFOs for %s", guest);
+
+ if (gid != -1) {
+ ret = setegid(save_egid);
+ if (ret < 0)
+ pdie("failed to restore effective group ID");
+ }
+}
+
+void trace_setup_guest(int argc, char **argv)
+{
+ struct group *group;
+ mode_t mode = 0660;
+ int nr_cpus = -1;
+ gid_t gid = -1;
+ char *guest;
+
+ if (argc < 2)
+ usage(argv);
+
+ if (strcmp(argv[1], "setup-guest") != 0)
+ usage(argv);
+
+ for (;;) {
+ int c, option_index = 0;
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {NULL, 0, NULL, 0}
+ };
+
+ c = getopt_long(argc-1, argv+1, "+hc:p:g:",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+ switch (c) {
+ case 'h':
+ usage(argv);
+ break;
+ case 'c':
+ nr_cpus = atoi(optarg);
+ break;
+ case 'p':
+ mode = strtol(optarg, NULL, 8);
+ break;
+ case 'g':
+ group = getgrnam(optarg);
+ if (!group)
+ pdie("group %s does not exist", optarg);
+ gid = group->gr_gid;
+ break;
+ default:
+ usage(argv);
+ }
+ }
+
+ if (optind != argc-2)
+ usage(argv);
+
+ guest = argv[optind+1];
+
+ if (nr_cpus <= 0)
+ pdie("invalid number of cpus for guest %s", guest);
+
+ do_setup_guest(guest, nr_cpus, mode, gid);
+}
diff --git a/tracecmd/trace-usage.c b/tracecmd/trace-usage.c
index da17df7..2caff0e 100644
--- a/tracecmd/trace-usage.c
+++ b/tracecmd/trace-usage.c
@@ -248,6 +248,14 @@ static struct usage_help usage_help[] = {
" -p port number to listen on.\n"
" -D run in daemon mode.\n"
},
+ {
+ "setup-guest",
+ "create FIFOs for tracing guest VMs",
+ " %s setup-guest -c cpus[-p perm][-g group] guest\n"
+ " -c number of guest virtual CPUs\n"
+ " -p FIFOs permissions (default: 0660)\n"
+ " -g FIFOs group owner\n"
+ },
#endif
{
"list",
--
2.20.1
next prev parent reply other threads:[~2019-09-17 13:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-17 13:15 [PATCH v14 00/13] Add VM kernel tracing over vsockets and FIFOs Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 01/13] trace-cmd: Make ports unsigned int Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 02/13] trace-cmd: Detect if vsockets are available Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 03/13] trace-cmd: Add tracecmd_create_recorder_virt() function Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 04/13] trace-cmd: Add VM tracing protocol messages Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 05/13] trace-cmd: Add buffer instance flags for tracing in guest and agent context Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 06/13] trace-cmd: Add VM kernel tracing over vsockets transport Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 07/13] trace-cmd: Use splice(2) for vsockets if available Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 08/13] trace-cmd: Switch stop recording signal to SIGUSR1 Slavomir Kaslev
2019-09-17 13:15 ` Slavomir Kaslev [this message]
2019-09-17 13:15 ` [PATCH v14 10/13] trace-cmd: Try to autodetect number of guest CPUs in setup-guest if not specified Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 11/13] trace-cmd: Add setup-guest flag for attaching FIFOs to the guest VM config Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 12/13] trace-cmd: Add VM kernel tracing over FIFO transport Slavomir Kaslev
2019-09-17 13:15 ` [PATCH v14 13/13] trace-cmd: Add support for tracing VMware Workstation VMs by name Slavomir Kaslev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190917131538.31926-10-kaslevs@vmware.com \
--to=kaslevs@vmware.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).