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