Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1// SPDX-License-Identifier: GPL-2.0
  2/* 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}