Skip to content

Commit

Permalink
utils: Fix an issue not finding tracefs on some kernels
Browse files Browse the repository at this point in the history
When parsing /proc/self/mountinfo on some kernels, the number of fields is different and tracefs cannot be obtained.

changed methmod to check if paths of "/sys/kernel/tracing (tracefs)" and "/sys/kernel/debug (debugfs)" exist

Fixed: #1753

Signed-off-by: gichoelchoi <gichoel0295@gmail.com>
  • Loading branch information
gichoel committed Jul 25, 2023
1 parent 9dd6520 commit afef79f
Showing 1 changed file with 40 additions and 48 deletions.
88 changes: 40 additions & 48 deletions utils/tracefs.c
@@ -1,67 +1,59 @@
#include <fcntl.h>
#include <linux/magic.h>
#include <mntent.h>
#include <stdio.h>
#include <string.h>
#include <sys/vfs.h>

#include "utils/tracefs.h"
#include "utils/utils.h"

#define PROC_MOUNTINFO "/proc/self/mountinfo"
#define TRACEFS_DIR_PATH "/sys/kernel/tracing"

static char *TRACING_DIR = NULL;

static bool find_tracing_dir(void)
{
FILE *fp;
char *line = NULL, fs_type[NAME_MAX], mount_point[PATH_MAX];
static char debugfs_suffix[] = "tracing";
bool debugfs_found = false;
size_t len;

if (TRACING_DIR)
return false;

fp = fopen(PROC_MOUNTINFO, "r");
if (fp == NULL)
return false;

while (getline(&line, &len, fp) > 0) {
/*
* /proc/<pid>/mountinfo format:
* 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 .... ....
* (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11)
* mount_point fs_type
*
* (9) is the file system type, (5) is the mount point relative
* to self's root directory.
*/
sscanf(line, "%*i %*i %*u:%*u %*s %s %*s %*s - %s %*s %*s\n", mount_point, fs_type);

if (!strcmp(fs_type, "tracefs")) {
/* discard previously kept debugfs tracing dir */
if (TRACING_DIR)
free(TRACING_DIR);
xasprintf(&TRACING_DIR, "%s", mount_point);
pr_dbg2("Found tracefs at %s\n", mount_point);
pr_dbg2("Use %s as TRACING_DIR\n", TRACING_DIR);
return true;
}

if (!strcmp(fs_type, "debugfs")) {
xasprintf(&TRACING_DIR, "%s/%s", mount_point, debugfs_suffix);
pr_dbg2("Found debugfs at %s\n", mount_point);
pr_dbg2("Keep searching for tracefs...\n");
debugfs_found = true;
}
struct statfs fs;
bool found = false;

if (!statfs(TRACEFS_DIR_PATH, &fs) && fs.f_type == TRACEFS_MAGIC) {
xasprintf(&TRACING_DIR, "%s", TRACEFS_DIR_PATH);
found = true;
}
else {
struct mntent *ent;
FILE *fp;

do {
fp = setmntent("/proc/mounts", "r");
if (fp == NULL) {
break;
}

while (found != true && NULL != (ent = getmntent(fp))) {
if (!strcmp(ent->mnt_fsname, "tracefs")) {
xasprintf(&TRACING_DIR, "%s", ent->mnt_dir);
found = true;
}
else if (!strcmp(ent->mnt_fsname, "debugfs")) {
xasprintf(&TRACING_DIR, "%s/tracing", ent->mnt_dir);
found = true;
}
}

endmntent(fp);
} while (0);
}

/* we couldn't find a tracefs, but found a debugfs... */
if (debugfs_found) {
pr_dbg2("Use %s as TRACING_DIR\n", TRACING_DIR);
return true;
if (found == true) {
pr_dbg2("TRACING_DIR : %s\n", TRACING_DIR);
}
else {
pr_dbg2("tracefs or debugfs not found..! \n");
}

pr_dbg2("No tracefs or debugfs found..!\n");
return false;
return found;
}

char *get_tracing_file(const char *name)
Expand Down

0 comments on commit afef79f

Please sign in to comment.