From 3e6a04086306d187416042a657c35e355d06f1d3 Mon Sep 17 00:00:00 2001 From: Patrick Bellasi Date: Wed, 21 Sep 2016 16:17:45 +0100 Subject: [PATCH] ftrace: ensure ftrace commands are executed as root Configuration sysfs files required by ftrace are usually accessible only by the root user. In systems where ADB does not run as root by default, the initialisation of the ftrace module fails. This patch ensure that all ftrace commands are executed with root privileges. Signed-off-by: Patrick Bellasi --- devlib/trace/ftrace.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/devlib/trace/ftrace.py b/devlib/trace/ftrace.py index 761b9d2..a40a5f4 100644 --- a/devlib/trace/ftrace.py +++ b/devlib/trace/ftrace.py @@ -107,7 +107,8 @@ class FtraceCollector(TraceCollector): # Validate required events to be traced available_events = self.target.execute( - 'cat {}'.format(self.available_events_file)).splitlines() + 'cat {}'.format(self.available_events_file), + as_root=True).splitlines() selected_events = [] for event in self.events: # Convert globs supported by FTrace into valid regexp globs @@ -138,7 +139,8 @@ class FtraceCollector(TraceCollector): 'A kernel build with CONFIG_FUNCTION_PROFILER enable is required') # Validate required functions to be traced available_functions = self.target.execute( - 'cat {}'.format(self.available_functions_file)).splitlines() + 'cat {}'.format(self.available_functions_file), + as_root=True).splitlines() selected_functions = [] for function in self.functions: if function not in available_functions: @@ -153,14 +155,16 @@ class FtraceCollector(TraceCollector): def reset(self): if self.buffer_size: self._set_buffer_size() - self.target.execute('{} reset'.format(self.target_binary), as_root=True, timeout=TIMEOUT) + self.target.execute('{} reset'.format(self.target_binary), + as_root=True, timeout=TIMEOUT) self._reset_needed = False def start(self): self.start_time = time.time() if self._reset_needed: self.reset() - self.target.execute('{} start {}'.format(self.target_binary, self.event_string), as_root=True) + self.target.execute('{} start {}'.format(self.target_binary, self.event_string), + as_root=True) if self.automark: self.mark_start() if 'cpufreq' in self.target.modules: @@ -168,22 +172,29 @@ class FtraceCollector(TraceCollector): self.target.cpufreq.trace_frequencies() # Enable kernel function profiling if self.functions: - self.target.execute('echo nop > {}'.format(self.current_tracer_file)) - self.target.execute('echo 0 > {}'.format(self.function_profile_file)) - self.target.execute('echo {} > {}'.format(self.function_string, self.ftrace_filter_file)) - self.target.execute('echo 1 > {}'.format(self.function_profile_file)) + self.target.execute('echo nop > {}'.format(self.current_tracer_file), + as_root=True) + self.target.execute('echo 0 > {}'.format(self.function_profile_file), + as_root=True) + self.target.execute('echo {} > {}'.format(self.function_string, self.ftrace_filter_file), + as_root=True) + self.target.execute('echo 1 > {}'.format(self.function_profile_file), + as_root=True) + def stop(self): # Disable kernel function profiling if self.functions: - self.target.execute('echo 1 > {}'.format(self.function_profile_file)) + self.target.execute('echo 1 > {}'.format(self.function_profile_file), + as_root=True) if 'cpufreq' in self.target.modules: self.logger.debug('Trace CPUFreq frequencies') self.target.cpufreq.trace_frequencies() self.stop_time = time.time() if self.automark: self.mark_stop() - self.target.execute('{} stop'.format(self.target_binary), timeout=TIMEOUT, as_root=True) + self.target.execute('{} stop'.format(self.target_binary), + timeout=TIMEOUT, as_root=True) self._reset_needed = True def get_trace(self, outfile):