1238384Sjkim// SPDX-License-Identifier: GPL-2.0
2280304Sjkim/* Copyright (C) 2023. Huawei Technologies Co., Ltd */
3280304Sjkim#include <vmlinux.h>
4280304Sjkim#include <bpf/bpf_tracing.h>
5238384Sjkim#include <bpf/bpf_helpers.h>
6238384Sjkim
7238384Sjkim#include "bpf_misc.h"
8238384Sjkim#include "bpf_experimental.h"
9238384Sjkim
10238384Sjkimstruct node_data {
11238384Sjkim	__u64 data;
12238384Sjkim	struct bpf_list_node node;
13238384Sjkim};
14280304Sjkim
15238384Sjkimstruct map_value {
16238384Sjkim	struct bpf_list_head head __contains(node_data, node);
17238384Sjkim	struct bpf_spin_lock lock;
18238384Sjkim};
19238384Sjkim
20238384Sjkimstruct {
21238384Sjkim	__uint(type, BPF_MAP_TYPE_ARRAY);
22238384Sjkim	__type(key, int);
23238384Sjkim	__type(value, struct map_value);
24238384Sjkim	__uint(max_entries, 1);
25238384Sjkim} array SEC(".maps");
26238384Sjkim
27238384Sjkimchar _license[] SEC("license") = "GPL";
28238384Sjkim
29238384Sjkimint pid = 0;
30238384Sjkimbool done = false;
31238384Sjkim
32238384SjkimSEC("fentry/" SYS_PREFIX "sys_nanosleep")
33238384Sjkimint add_to_list_in_array(void *ctx)
34238384Sjkim{
35238384Sjkim	struct map_value *value;
36238384Sjkim	struct node_data *new;
37238384Sjkim	int zero = 0;
38238384Sjkim
39238384Sjkim	if (done || (int)bpf_get_current_pid_tgid() != pid)
40238384Sjkim		return 0;
41238384Sjkim
42238384Sjkim	value = bpf_map_lookup_elem(&array, &zero);
43238384Sjkim	if (!value)
44238384Sjkim		return 0;
45238384Sjkim
46238384Sjkim	new = bpf_obj_new(typeof(*new));
47238384Sjkim	if (!new)
48238384Sjkim		return 0;
49238384Sjkim
50238384Sjkim	bpf_spin_lock(&value->lock);
51238384Sjkim	bpf_list_push_back(&value->head, &new->node);
52238384Sjkim	bpf_spin_unlock(&value->lock);
53238384Sjkim	done = true;
54238384Sjkim
55238384Sjkim	return 0;
56238384Sjkim}
57238384Sjkim