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;
 }