From 78aa774e25df9882d179b8f5ecaf43a6db7c1976 Mon Sep 17 00:00:00 2001 From: Patrick Bellasi Date: Thu, 25 Feb 2016 18:46:04 +0000 Subject: [PATCH] ftrace: disable trace events not available in the target kernel In general we could be interested to define a common configuration to use across different kernels. Thus, for a given set of experiments, some trace events can be present only on some kernels and not others. This patch introduces a check for the availability of trace events by ensuring that we consider only those available in the kernel in use in the target. In case of a trace event is not supported in the target kernel we still log a warning. Signed-off-by: Patrick Bellasi --- devlib/trace/ftrace.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/devlib/trace/ftrace.py b/devlib/trace/ftrace.py index 7644dfb..8340ac1 100644 --- a/devlib/trace/ftrace.py +++ b/devlib/trace/ftrace.py @@ -75,11 +75,12 @@ class FtraceCollector(TraceCollector): self.host_binary = None self.start_time = None self.stop_time = None - self.event_string = _build_trace_events(self.events) + self.event_string = None self.function_string = None self._reset_needed = True # Setup tracing paths + self.available_events_file = self.target.path.join(self.tracing_path, 'available_events') self.available_functions_file = self.target.path.join(self.tracing_path, 'available_filter_functions') self.buffer_size_file = self.target.path.join(self.tracing_path, 'buffer_size_kb') self.current_tracer_file = self.target.path.join(self.tracing_path, 'current_tracer') @@ -104,6 +105,32 @@ class FtraceCollector(TraceCollector): raise TargetError('No trace-cmd found on device and no_install=True is specified.') self.target_binary = 'trace-cmd' + # Validate required events to be traced + available_events = self.target.execute( + 'cat {}'.format(self.available_events_file)).splitlines() + selected_events = [] + for event in self.events: + # Convert globs supported by FTrace into valid regexp globs + _event = event + if event[0] != '*': + _event = '*' + event + event_re = re.compile(_event.replace('*', '.*')) + # Select events matching the required ones + if len(filter(event_re.match, available_events)) == 0: + message = 'Event [{}] not available for tracing'.format(event) + if strict: + raise TargetError(message) + self.target.logger.warning(message) + else: + selected_events.append(event) + # If function profiling is enabled we always need at least one event. + # Thus, if not other events have been specified, try to add at least + # a tracepoint which is always available and possibly triggered few + # times. + if self.functions and len(selected_events) == 0: + selected_events = ['sched_wakeup_new'] + self.event_string = _build_trace_events(selected_events) + # Check for function tracing support if self.functions: if not self.target.file_exists(self.function_profile_file):