brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 55907ef Raw
107 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_experimental.h"8 9struct bin_data {10	char data[256];11	struct bpf_spin_lock lock;12};13 14struct map_value {15	struct bin_data __kptr * data;16};17 18struct {19	__uint(type, BPF_MAP_TYPE_ARRAY);20	__type(key, int);21	__type(value, struct map_value);22	__uint(max_entries, 2048);23} array SEC(".maps");24 25char _license[] SEC("license") = "GPL";26 27bool nomem_err = false;28 29static int del_array(unsigned int i, int *from)30{31	struct map_value *value;32	struct bin_data *old;33 34	value = bpf_map_lookup_elem(&array, from);35	if (!value)36		return 1;37 38	old = bpf_kptr_xchg(&value->data, NULL);39	if (old)40		bpf_obj_drop(old);41 42	(*from)++;43	return 0;44}45 46static int add_array(unsigned int i, int *from)47{48	struct bin_data *old, *new;49	struct map_value *value;50 51	value = bpf_map_lookup_elem(&array, from);52	if (!value)53		return 1;54 55	new = bpf_obj_new(typeof(*new));56	if (!new) {57		nomem_err = true;58		return 1;59	}60 61	old = bpf_kptr_xchg(&value->data, new);62	if (old)63		bpf_obj_drop(old);64 65	(*from)++;66	return 0;67}68 69static void del_then_add_array(int from)70{71	int i;72 73	i = from;74	bpf_loop(512, del_array, &i, 0);75 76	i = from;77	bpf_loop(512, add_array, &i, 0);78}79 80SEC("fentry/bpf_fentry_test1")81int BPF_PROG2(test0, int, a)82{83	del_then_add_array(0);84	return 0;85}86 87SEC("fentry/bpf_fentry_test2")88int BPF_PROG2(test1, int, a, u64, b)89{90	del_then_add_array(512);91	return 0;92}93 94SEC("fentry/bpf_fentry_test3")95int BPF_PROG2(test2, char, a, int, b, u64, c)96{97	del_then_add_array(1024);98	return 0;99}100 101SEC("fentry/bpf_fentry_test4")102int BPF_PROG2(test3, void *, a, char, b, int, c, u64, d)103{104	del_then_add_array(1536);105	return 0;106}107