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