brintos

brintos / linux-shallow public Read only

0
0
Text · 1.1 KiB · a45c929 Raw
57 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (C) 2023. Huawei Technologies Co., Ltd */3#include <vmlinux.h>4#include <bpf/bpf_tracing.h>5#include <bpf/bpf_helpers.h>6 7#include "bpf_misc.h"8#include "bpf_experimental.h"9 10struct node_data {11	__u64 data;12	struct bpf_list_node node;13};14 15struct map_value {16	struct bpf_list_head head __contains(node_data, node);17	struct bpf_spin_lock lock;18};19 20struct {21	__uint(type, BPF_MAP_TYPE_ARRAY);22	__type(key, int);23	__type(value, struct map_value);24	__uint(max_entries, 1);25} array SEC(".maps");26 27char _license[] SEC("license") = "GPL";28 29int pid = 0;30bool done = false;31 32SEC("fentry/" SYS_PREFIX "sys_nanosleep")33int add_to_list_in_array(void *ctx)34{35	struct map_value *value;36	struct node_data *new;37	int zero = 0;38 39	if (done || (int)bpf_get_current_pid_tgid() != pid)40		return 0;41 42	value = bpf_map_lookup_elem(&array, &zero);43	if (!value)44		return 0;45 46	new = bpf_obj_new(typeof(*new));47	if (!new)48		return 0;49 50	bpf_spin_lock(&value->lock);51	bpf_list_push_back(&value->head, &new->node);52	bpf_spin_unlock(&value->lock);53	done = true;54 55	return 0;56}57