aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <rostedt@goodmis.org>2022-05-21 20:39:35 -0400
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-05-21 21:02:52 -0400
commit66e92d97fda2192eb9487366bb8e07b7054cd465 (patch)
tree235a0503d137094ab450967f501296c651155eef
parent0dd483359fe51d5b681f67f624ccb3fe5195063e (diff)
downloadtrace-cmd-66e92d97fda2192eb9487366bb8e07b7054cd465.tar.gz
trace-cmd: Mount debugfs if needed for KVM data
The KVM offset and multiplier are in the debugfs file system. If it is not currently mounted, then try to mount it with the new tracefs API tracefs_debug_dir() which will return the debugfs file system path, and even mount it if possible (or NULL if it could not). This also removes the hard coded path for /sys/kernel/debug/kvm and removes the stat() of the directory as tracefs_debug_dir() will only return mount locations which are directories. Set libtracefs minimum version to 1.4 as that is what will have the tarcefs_debug_dir() in it. Link: https://lore.kernel.org/linux-trace-devel/20220522003935.196466-5-rostedt@goodmis.org Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--Makefile2
-rw-r--r--lib/trace-cmd/trace-timesync-kvm.c47
2 files changed, 36 insertions, 13 deletions
diff --git a/Makefile b/Makefile
index abc4ac72..34526492 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ export LIBTRACECMD_VERSION
VERSION_FILE = ltc_version.h
LIBTRACEEVENT_MIN_VERSION = 1.5
-LIBTRACEFS_MIN_VERSION = 1.3
+LIBTRACEFS_MIN_VERSION = 1.4
MAKEFLAGS += --no-print-directory
diff --git a/lib/trace-cmd/trace-timesync-kvm.c b/lib/trace-cmd/trace-timesync-kvm.c
index 671eafaf..1db63d94 100644
--- a/lib/trace-cmd/trace-timesync-kvm.c
+++ b/lib/trace-cmd/trace-timesync-kvm.c
@@ -16,7 +16,6 @@
#include "tracefs.h"
#include "trace-tsync-local.h"
-#define KVM_DEBUG_FS "/sys/kernel/debug/kvm"
#define KVM_DEBUG_OFFSET_FILE "tsc-offset"
#define KVM_DEBUG_SCALING_FILE "tsc-scaling-ratio"
#define KVM_DEBUG_FRACTION_FILE "tsc-scaling-ratio-frac-bits"
@@ -106,6 +105,24 @@ static bool kvm_scaling_check_vm_cpu(char *vname, char *cpu)
return true;
}
+static const char *kvm_debug_dir(void)
+{
+ const char *debugfs;
+ static char *kvm_dir;
+
+ if (kvm_dir)
+ return kvm_dir;
+
+ debugfs = tracefs_debug_dir();
+ if (!debugfs)
+ return NULL;
+
+ if (asprintf(&kvm_dir, "%s/kvm", debugfs) < 0)
+ return NULL;
+
+ return kvm_dir;
+}
+
/*
* Returns true if a VCPU exists with a tsc-offset file and that
* the scaling files for ratio and fraction both exist or both
@@ -116,11 +133,16 @@ static bool kvm_scaling_check_vm_cpu(char *vname, char *cpu)
static bool kvm_scaling_check_vm(char *name)
{
struct dirent *entry;
+ const char *kvm;
char *vdir;
DIR *dir;
bool valid = false;
- if (asprintf(&vdir, "%s/%s", KVM_DEBUG_FS, name) < 0)
+ kvm = kvm_debug_dir();
+ if (!kvm)
+ return false;
+
+ if (asprintf(&vdir, "%s/%s", kvm, name) < 0)
return false;
dir = opendir(vdir);
@@ -150,10 +172,15 @@ static bool kvm_scaling_check_vm(char *name)
static bool kvm_scaling_check(void)
{
struct dirent *entry;
+ const char *kvm;
DIR *dir;
bool valid = false;
- dir = opendir(KVM_DEBUG_FS);
+ kvm = kvm_debug_dir();
+ if (!kvm)
+ return false;
+
+ dir = opendir(kvm);
if (!dir)
return true;
@@ -170,18 +197,14 @@ static bool kvm_scaling_check(void)
static bool kvm_support_check(bool guest)
{
- struct stat st;
- int ret;
+ const char *kvm;
/* The kvm files are only in the host so we can ignore guests */
if (guest)
return true;
- ret = stat(KVM_DEBUG_FS, &st);
- if (ret < 0)
- return false;
-
- if (!S_ISDIR(st.st_mode))
+ kvm = kvm_debug_dir();
+ if (!kvm)
return false;
return kvm_scaling_check();
@@ -242,7 +265,7 @@ static int kvm_open_debug_files(struct kvm_clock_sync *kvm, int pid)
DIR *dir;
int i;
- dir = opendir(KVM_DEBUG_FS);
+ dir = opendir(kvm_debug_dir());
if (!dir)
goto error;
if (asprintf(&pid_str, "%d-", pid) <= 0)
@@ -251,7 +274,7 @@ static int kvm_open_debug_files(struct kvm_clock_sync *kvm, int pid)
if (!(entry->d_type == DT_DIR &&
!strncmp(entry->d_name, pid_str, strlen(pid_str))))
continue;
- asprintf(&vm_dir_str, "%s/%s", KVM_DEBUG_FS, entry->d_name);
+ asprintf(&vm_dir_str, "%s/%s", kvm_debug_dir(), entry->d_name);
break;
}
closedir(dir);