time_in_state: don't block sched_switch events.
Returning zero in sched_switch bpf program blocks userspace
from receiving sched_switch events from perf_event_fd interface.
Bug: 149797433
Test: build and boot.
Change-Id: Icea311d6fe05d2698a624d17d47141fc735681de
diff --git a/time_in_state.c b/time_in_state.c
index cb56a93..5befc6d 100644
--- a/time_in_state.c
+++ b/time_in_state.c
@@ -45,23 +45,24 @@
DEFINE_BPF_PROG("tracepoint/sched/sched_switch", AID_ROOT, AID_SYSTEM, tp_sched_switch)
(struct switch_args* args) {
+ const int ALLOW = 1; // return 1 to avoid blocking simpleperf from receiving events.
uint32_t zero = 0;
uint64_t* last = bpf_cpu_last_update_map_lookup_elem(&zero);
- if (!last) return 0;
+ if (!last) return ALLOW;
uint64_t old_last = *last;
uint64_t time = bpf_ktime_get_ns();
*last = time;
uint32_t* active = bpf_nr_active_map_lookup_elem(&zero);
- if (!active) return 0;
+ if (!active) return ALLOW;
uint32_t cpu = bpf_get_smp_processor_id();
uint32_t* policyp = bpf_cpu_policy_map_lookup_elem(&cpu);
- if (!policyp) return 0;
+ if (!policyp) return ALLOW;
uint32_t policy = *policyp;
uint32_t* policy_active = bpf_policy_nr_active_map_lookup_elem(&policy);
- if (!policy_active) return 0;
+ if (!policy_active) return ALLOW;
uint32_t nactive = *active - 1;
uint32_t policy_nactive = *policy_active - 1;
@@ -77,7 +78,7 @@
// 2) old_last == 0, so this is the first time we've seen this CPU. Any delta will be invalid,
// and our active CPU counts don't include this CPU yet so we shouldn't decrement them even
// if we're going idle.
- if (!args->prev_pid || !old_last) return 0;
+ if (!args->prev_pid || !old_last) return ALLOW;
if (!args->next_pid) {
__sync_fetch_and_add(active, -1);
@@ -85,7 +86,7 @@
}
uint8_t* freq_idxp = bpf_policy_freq_idx_map_lookup_elem(&policy);
- if (!freq_idxp || !*freq_idxp) return 0;
+ if (!freq_idxp || !*freq_idxp) return ALLOW;
// freq_to_idx_map uses 1 as its minimum index so that *freq_idxp == 0 only when uninitialized
uint8_t freq_idx = *freq_idxp - 1;
@@ -125,7 +126,7 @@
} else {
bpf_uid_last_update_map_update_elem(&uid, &time, BPF_NOEXIST);
}
- return 0;
+ return ALLOW;
}
struct cpufreq_args {