time_in_state: track last update time per UID
This allows for optimizing reading this data by skipping UIDs that
have not been updated recently.
Bug: 138317993
Test: builds; libtimeinstate_test passes
Change-Id: Ic535d15d09dae274e47050f28a483c7d22b6ca04
Signed-off-by: Connor O'Brien <connoro@google.com>
diff --git a/time_in_state.c b/time_in_state.c
index 0b5c4b2..961ba6b 100644
--- a/time_in_state.c
+++ b/time_in_state.c
@@ -20,6 +20,7 @@
DEFINE_BPF_MAP(uid_time_in_state_map, PERCPU_HASH, time_key_t, tis_val_t, 1024)
DEFINE_BPF_MAP(uid_concurrent_times_map, PERCPU_HASH, time_key_t, concurrent_val_t, 1024)
+DEFINE_BPF_MAP(uid_last_update_map, HASH, uint32_t, uint64_t, 1024)
DEFINE_BPF_MAP(cpu_last_update_map, PERCPU_ARRAY, uint32_t, uint64_t, 1)
@@ -118,6 +119,12 @@
}
}
if (ct) ct->policy[policy_nactive % CPUS_PER_ENTRY] += delta;
+ uint64_t* uid_last_update = bpf_uid_last_update_map_lookup_elem(&uid);
+ if (uid_last_update) {
+ *uid_last_update = time;
+ } else {
+ bpf_uid_last_update_map_update_elem(&uid, &time, BPF_NOEXIST);
+ }
return 0;
}