const volatile pid_t targ_pid = 0;
 
 struct {
-       __uint(type, BPF_MAP_TYPE_HASH);
-       __uint(max_entries, 10240);
-       __type(key, u32);
+       __uint(type, BPF_MAP_TYPE_TASK_STORAGE);
+       __uint(map_flags, BPF_F_NO_PREALLOC);
+       __type(key, int);
        __type(value, u64);
 } start SEC(".maps");
 
 
 /* record enqueue timestamp */
 __always_inline
-static int trace_enqueue(u32 tgid, u32 pid)
+static int trace_enqueue(struct task_struct *t)
 {
-       u64 ts;
+       u32 pid = t->pid;
+       u64 *ptr;
 
        if (!pid || (targ_pid && targ_pid != pid))
                return 0;
 
-       ts = bpf_ktime_get_ns();
-       bpf_map_update_elem(&start, &pid, &ts, 0);
+       ptr = bpf_task_storage_get(&start, t, 0,
+                                  BPF_LOCAL_STORAGE_GET_F_CREATE);
+       if (!ptr)
+               return 0;
+
+       *ptr = bpf_ktime_get_ns();
        return 0;
 }
 
        /* TP_PROTO(struct task_struct *p) */
        struct task_struct *p = (void *)ctx[0];
 
-       return trace_enqueue(p->tgid, p->pid);
+       return trace_enqueue(p);
 }
 
 SEC("tp_btf/sched_wakeup_new")
        /* TP_PROTO(struct task_struct *p) */
        struct task_struct *p = (void *)ctx[0];
 
-       return trace_enqueue(p->tgid, p->pid);
+       return trace_enqueue(p);
 }
 
 SEC("tp_btf/sched_switch")
 
        /* ivcsw: treat like an enqueue event and store timestamp */
        if (prev->state == TASK_RUNNING)
-               trace_enqueue(prev->tgid, prev->pid);
+               trace_enqueue(prev);
 
        pid = next->pid;
 
+       /* For pid mismatch, save a bpf_task_storage_get */
+       if (!pid || (targ_pid && targ_pid != pid))
+               return 0;
+
        /* fetch timestamp and calculate delta */
-       tsp = bpf_map_lookup_elem(&start, &pid);
+       tsp = bpf_task_storage_get(&start, next, 0, 0);
        if (!tsp)
                return 0;   /* missed enqueue */
 
        bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU,
                              &event, sizeof(event));
 
-       bpf_map_delete_elem(&start, &pid);
+       bpf_task_storage_delete(&start, next);
        return 0;
 }