Skip to content

Commit

Permalink
Merge pull request namhyung#1762 from gichoel/find-tracefs-issue
Browse files Browse the repository at this point in the history
The currnet find_tracing_dir logic parses /proc/self/mounts to find
tracefs, but some cases show the number of fields in /proc/self/mounts
differs and it makes a parsing failure.

Gichoel fixes this issue with two steps as follows.
1. Try known paths at /sys/kernel/tracing and /sys/kernel/debug/tracing
2. Use setmntent/getmntent to identify tracefs from /proc/mounts.

Signed-off-by: Honggyu Kim <[email protected]>
  • Loading branch information
honggyukim authored Aug 11, 2023
2 parents e1de5c1 + a689290 commit afeda9f
Showing 1 changed file with 28 additions and 40 deletions.
68 changes: 28 additions & 40 deletions utils/tracefs.c
Original file line number Diff line number Diff line change
@@ -1,67 +1,55 @@
#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 PROC_MOUNTS_DIR_PATH "/proc/mounts"
#define TRACEFS_DIR_PATH "/sys/kernel/tracing"
#define OLD_TRACEFS_DIR_PATH "/sys/kernel/debug/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;
struct mntent *ent;
struct statfs fs;

if (TRACING_DIR)
return false;
return true;

fp = fopen(PROC_MOUNTINFO, "r");
if (!statfs(TRACEFS_DIR_PATH, &fs) && fs.f_type == TRACEFS_MAGIC) {
xasprintf(&TRACING_DIR, "%s", TRACEFS_DIR_PATH);
return true;
}
else if (!statfs(OLD_TRACEFS_DIR_PATH, &fs) && fs.f_type == TRACEFS_MAGIC) {
xasprintf(&TRACING_DIR, "%s", OLD_TRACEFS_DIR_PATH);
return true;
}

fp = setmntent(PROC_MOUNTS_DIR_PATH, "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;
while ((ent = getmntent(fp)) != NULL) {
if (!strcmp(ent->mnt_fsname, "tracefs")) {
xasprintf(&TRACING_DIR, "%s", ent->mnt_dir);
break;
}
}
endmntent(fp);

/* 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 (!TRACING_DIR) {
pr_dbg2("No tracefs or debugfs found..!\n");
return false;
}

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

char *get_tracing_file(const char *name)
Expand Down

0 comments on commit afeda9f

Please sign in to comment.