1bd4aed0eSJiong Wang // SPDX-License-Identifier: GPL-2.0
2bd4aed0eSJiong Wang // Copyright (c) 2018 Facebook
3bd4aed0eSJiong Wang 
4bd4aed0eSJiong Wang #include <linux/bpf.h>
53e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
6bd4aed0eSJiong Wang 
71639b17cSAndrii Nakryiko struct {
81639b17cSAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_ARRAY);
91639b17cSAndrii Nakryiko 	__uint(max_entries, 1);
101639b17cSAndrii Nakryiko 	__type(key, __u32);
111639b17cSAndrii Nakryiko 	__type(value, __u64);
121639b17cSAndrii Nakryiko } cg_ids SEC(".maps");
13bd4aed0eSJiong Wang 
141639b17cSAndrii Nakryiko struct {
151639b17cSAndrii Nakryiko 	__uint(type, BPF_MAP_TYPE_ARRAY);
161639b17cSAndrii Nakryiko 	__uint(max_entries, 1);
171639b17cSAndrii Nakryiko 	__type(key, __u32);
181639b17cSAndrii Nakryiko 	__type(value, __u32);
191639b17cSAndrii Nakryiko } pidmap SEC(".maps");
20bd4aed0eSJiong Wang 
21bd4aed0eSJiong Wang SEC("tracepoint/syscalls/sys_enter_nanosleep")
trace(void * ctx)22bd4aed0eSJiong Wang int trace(void *ctx)
23bd4aed0eSJiong Wang {
24bd4aed0eSJiong Wang 	__u32 pid = bpf_get_current_pid_tgid();
25bd4aed0eSJiong Wang 	__u32 key = 0, *expected_pid;
26bd4aed0eSJiong Wang 	__u64 *val;
27bd4aed0eSJiong Wang 
28bd4aed0eSJiong Wang 	expected_pid = bpf_map_lookup_elem(&pidmap, &key);
29bd4aed0eSJiong Wang 	if (!expected_pid || *expected_pid != pid)
30bd4aed0eSJiong Wang 		return 0;
31bd4aed0eSJiong Wang 
32bd4aed0eSJiong Wang 	val = bpf_map_lookup_elem(&cg_ids, &key);
33bd4aed0eSJiong Wang 	if (val)
34bd4aed0eSJiong Wang 		*val = bpf_get_current_cgroup_id();
35bd4aed0eSJiong Wang 
36bd4aed0eSJiong Wang 	return 0;
37bd4aed0eSJiong Wang }
38bd4aed0eSJiong Wang 
39bd4aed0eSJiong Wang char _license[] SEC("license") = "GPL";
40