Skip to content

Commit

Permalink
Fix tracefs bugs for handling non standard mount points and improve
Browse files Browse the repository at this point in the history
error messages

Signed-off-by: Daniel Hodges <[email protected]>
  • Loading branch information
hodgesds committed Dec 22, 2022
1 parent 6e1c704 commit e392454
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 20 deletions.
44 changes: 31 additions & 13 deletions events.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,16 @@ const (
// corresponding list of available events.
func AvailableEvents() (map[string][]string, error) {
events := map[string][]string{}
// BUG(hodgesds): this should ideally check mounts for debugfs
rawEvents, err := fileToStrings(TracingDir + "/available_events")
// Events are colon delimited by type so parse the type and add sub
// events appropriately.
tracefsMount, err := TraceFSMount()
if err != nil {
return events, err
}
rawEvents, err := fileToStrings(tracefsMount + "/available_events")
if err != nil {
return events, err
}
// Events are colon delimited by type so parse the type and add sub
// events appropriately.
for _, rawEvent := range rawEvents {
splits := strings.Split(rawEvent, ":")
if len(splits) <= 1 {
Expand All @@ -46,13 +49,16 @@ func AvailableEvents() (map[string][]string, error) {
// AvailableSubsystems returns a slice of available subsystems.
func AvailableSubsystems() ([]string, error) {
subsystems := []string{}
// BUG(hodgesds): this should ideally check mounts for debugfs
rawEvents, err := fileToStrings(TracingDir + "/available_events")
// Events are colon delimited by type so parse the type and add sub
// events appropriately.
tracefsMount, err := TraceFSMount()
if err != nil {
return subsystems, err
}
rawEvents, err := fileToStrings(tracefsMount + "/available_events")
if err != nil {
return subsystems, err
}
// Events are colon delimited by type so parse the type and add sub
// events appropriately.
for _, rawEvent := range rawEvents {
splits := strings.Split(rawEvent, ":")
if len(splits) <= 1 {
Expand All @@ -65,22 +71,34 @@ func AvailableSubsystems() ([]string, error) {

// AvailableTracers returns the list of available tracers.
func AvailableTracers() ([]string, error) {
return fileToStrings(TracingDir + "/available_tracers")
tracefsMount, err := TraceFSMount()
if err != nil {
return []string{}, err
}
return fileToStrings(tracefsMount + "/available_tracers")
}

// CurrentTracer returns the current tracer.
func CurrentTracer() (string, error) {
res, err := fileToStrings(TracingDir + "/current_tracer")
tracefsMount, err := TraceFSMount()
if err != nil {
return "", err
}
res, err := fileToStrings(tracefsMount + "/current_tracer")
return res[0], err
}

// GetTracepointConfig is used to get the configuration for a trace event.
func GetTracepointConfig(subsystem, event string) (uint64, error) {
res, err := fileToStrings(
TracingDir + fmt.Sprintf("/events/%s/%s/id", subsystem, event))
tracefsMount, err := TraceFSMount()
if err != nil {
return 0, err
}
res, err := fileToStrings(
tracefsMount + fmt.Sprintf("/events/%s/%s/id", subsystem, event))
if err != nil {
return 0, fmt.Errorf("Failed to get tracepoint config for %s:%s: %q", subsystem, event, err)
}
return strconv.ParseUint(res[0], 10, 64)
}

Expand Down Expand Up @@ -113,7 +131,7 @@ func ProfileTracepoint(subsystem, event string, pid, cpu int, opts ...int) (BPFP
eventOps,
)
if err != nil {
return nil, err
return nil, fmt.Errorf("Failed to open perf event for PerfEventAttr %+v: %q", eventAttr, err)
}

return &profiler{
Expand Down
10 changes: 5 additions & 5 deletions fs_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ var (
func TraceFSMount() (string, error) {
mounts, err := GetFSMount(TraceFS)
if err != nil {
return "", err
return "", fmt.Errorf("Failed to get tracefs mount: %s", err.Error())
}
if len(mounts) == 0 {
return "", ErrNoMount
return "", fmt.Errorf("Mount for tracefs not mounted")
}
return mounts[0], nil
}
Expand All @@ -54,10 +54,10 @@ func TraceFSMount() (string, error) {
func DebugFSMount() (string, error) {
mounts, err := GetFSMount(DebugFS)
if err != nil {
return "", err
return "", fmt.Errorf("Failed to find debugfs mount: %q", err)
}
if len(mounts) == 0 {
return "", ErrNoMount
return "", fmt.Errorf("Mount for debugfs not mounted")
}
return mounts[0], nil
}
Expand All @@ -67,7 +67,7 @@ func GetFSMount(mountType string) ([]string, error) {
mounts := []string{}
file, err := os.Open(ProcMounts)
if err != nil {
return mounts, err
return mounts, fmt.Errorf("Failed to find mount type %s: %q", mountType, err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
Expand Down
3 changes: 2 additions & 1 deletion group_profiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func NewGroupProfiler(pid, cpu, opts int, eventAttrs ...unix.PerfEventAttr) (Gro
opts,
)
if err != nil {
return nil, err
return nil, fmt.Errorf("Failed to open perf event with PerfEventAttr %+v %q", eventAttr, err)
}
fds[i] = fd
continue
Expand All @@ -82,6 +82,7 @@ func NewGroupProfiler(pid, cpu, opts int, eventAttrs ...unix.PerfEventAttr) (Gro
opts,
)
if err != nil {
err = fmt.Errorf("Failed to open perf event with PerfEventAtter %+v: %q", eventAttr, err)
// cleanup any old Fds
for ii, fd2 := range fds {
if ii == i {
Expand Down
2 changes: 1 addition & 1 deletion process_profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ func NewProfiler(profilerType uint32, config uint64, pid, cpu int, opts ...int)
eventOps,
)
if err != nil {
return nil, err
return nil, fmt.Errorf("Failed to open perf event for PerfEventAttr %+v: %q", eventAttr, err)
}

return &profiler{
Expand Down

0 comments on commit e392454

Please sign in to comment.