diff options
Diffstat (limited to 'profcollectd/libprofcollectd/simpleperf_etm_trace_provider.rs')
-rw-r--r-- | profcollectd/libprofcollectd/simpleperf_etm_trace_provider.rs | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/profcollectd/libprofcollectd/simpleperf_etm_trace_provider.rs b/profcollectd/libprofcollectd/simpleperf_etm_trace_provider.rs index 14911ffb..8e6933e0 100644 --- a/profcollectd/libprofcollectd/simpleperf_etm_trace_provider.rs +++ b/profcollectd/libprofcollectd/simpleperf_etm_trace_provider.rs @@ -35,17 +35,32 @@ impl TraceProvider for SimpleperfEtmTraceProvider { } fn is_ready(&self) -> bool { - simpleperf_profcollect::has_device_support() + simpleperf_profcollect::is_etm_device_available() } - fn trace(&self, trace_dir: &Path, tag: &str, sampling_period: &Duration) { + fn trace(&self, trace_dir: &Path, tag: &str, sampling_period: &Duration, binary_filter: &str) { let trace_file = trace_provider::get_path(trace_dir, tag, ETM_TRACEFILE_EXTENSION); + // Record ETM data for kernel space only when it's not filtered out by binary_filter. So we + // can get more ETM data for user space when ETM data for kernel space isn't needed. + let event_name = if binary_filter.contains("kernel") { "cs-etm" } else { "cs-etm:u" }; + let duration: String = sampling_period.as_secs_f64().to_string(); + let args: Vec<&str> = vec![ + "-a", + "-e", + event_name, + "--duration", + &duration, + "--decode-etm", + "--exclude-perf", + "--binary", + binary_filter, + "--no-dump-symbols", + "--no-dump-kernel-symbols", + "-o", + trace_file.to_str().unwrap(), + ]; - simpleperf_profcollect::record( - &trace_file, - sampling_period, - simpleperf_profcollect::RecordScope::BOTH, - ); + simpleperf_profcollect::run_record_cmd(&args); } fn process(&self, trace_dir: &Path, profile_dir: &Path, binary_filter: &str) -> Result<()> { @@ -64,7 +79,18 @@ impl TraceProvider for SimpleperfEtmTraceProvider { .ok_or_else(|| anyhow!("Malformed trace path: {}", trace_file.display()))?, ); profile_file.set_extension(ETM_PROFILE_EXTENSION); - simpleperf_profcollect::process(&trace_file, &profile_file, binary_filter); + + let args: Vec<&str> = vec![ + "-i", + trace_file.to_str().unwrap(), + "-o", + profile_file.to_str().unwrap(), + "--output", + "branch-list", + "--binary", + binary_filter, + ]; + simpleperf_profcollect::run_inject_cmd(&args); remove_file(&trace_file)?; Ok(()) }; @@ -76,10 +102,18 @@ impl TraceProvider for SimpleperfEtmTraceProvider { .filter(is_etm_extension) .try_for_each(process_trace_file) } + + fn set_log_file(&self, filename: &Path) { + simpleperf_profcollect::set_log_file(filename); + } + + fn reset_log_file(&self) { + simpleperf_profcollect::reset_log_file(); + } } impl SimpleperfEtmTraceProvider { pub fn supported() -> bool { - simpleperf_profcollect::has_driver_support() + simpleperf_profcollect::is_etm_driver_available() } } |