summaryrefslogtreecommitdiff
path: root/internal/debugfs
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-02-10 23:35:37 +0200
committerPaul Buetow <paul@buetow.org>2024-02-10 23:35:37 +0200
commitb9762202d123160c9a64b804b72e018f61fddd1d (patch)
tree56e2834fc3b2c801660d6c75ca62fea4921ecd63 /internal/debugfs
parentf70036a89d1ee5b000ad6d97031bb37f50dae778 (diff)
add debugfs.TracepointsWithF
Diffstat (limited to 'internal/debugfs')
-rw-r--r--internal/debugfs/debugfs.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/internal/debugfs/debugfs.go b/internal/debugfs/debugfs.go
new file mode 100644
index 0000000..80ac436
--- /dev/null
+++ b/internal/debugfs/debugfs.go
@@ -0,0 +1,57 @@
+package debugfs
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// Return tracepoints with 'unsigned int fd', which are I/O tracepoints on FDs
+func TracepointsWithFd() ([]string, error) {
+ return tracepointsWith("unsigned int fd")
+}
+
+func tracepointsWith(field string) ([]string, error) {
+ var tracepoints []string
+
+ matches, err := filepath.Glob("/sys/kernel/debug/tracing/events/syscalls/*/format")
+ if err != nil {
+ return tracepoints, err
+ }
+ if len(matches) == 0 {
+ return tracepoints, fmt.Errorf("Unable to gather tracepoints with FDs")
+ }
+
+ for _, formatPath := range matches {
+ has, err := hasField(formatPath, field)
+ if err != nil {
+ return tracepoints, err
+ }
+ if !has {
+ continue
+ }
+ tracepoints = append(tracepoints, filepath.Base(filepath.Dir(formatPath)))
+ }
+
+ return tracepoints, nil
+}
+
+func hasField(formatPath, field string) (bool, error) {
+ file, err := os.Open(formatPath)
+ if err != nil {
+ return false, err
+ }
+ defer file.Close()
+
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ line := scanner.Text()
+ if strings.Contains(line, fmt.Sprintf("field:%s;", field)) {
+ return true, nil
+ }
+ }
+
+ return false, nil
+}