diff options
Diffstat (limited to 'tools/testing/selftests/bpf/progs/timer_mim.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/timer_mim.c | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/tools/testing/selftests/bpf/progs/timer_mim.c b/tools/testing/selftests/bpf/progs/timer_mim.c new file mode 100644 index 000000000000..2fee7ab105ef --- /dev/null +++ b/tools/testing/selftests/bpf/progs/timer_mim.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2021 Facebook */ +#include <linux/bpf.h> +#include <time.h> +#include <errno.h> +#include <bpf/bpf_helpers.h> +#include "bpf_tcp_helpers.h" + +char _license[] SEC("license") = "GPL"; +struct hmap_elem { +	int pad; /* unused */ +	struct bpf_timer timer; +}; + +struct inner_map { +	__uint(type, BPF_MAP_TYPE_HASH); +	__uint(max_entries, 1024); +	__type(key, int); +	__type(value, struct hmap_elem); +} inner_htab SEC(".maps"); + +#define ARRAY_KEY 1 +#define HASH_KEY 1234 + +struct outer_arr { +	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); +	__uint(max_entries, 2); +	__uint(key_size, sizeof(int)); +	__uint(value_size, sizeof(int)); +	__array(values, struct inner_map); +} outer_arr SEC(".maps") = { +	.values = { [ARRAY_KEY] = &inner_htab }, +}; + +__u64 err; +__u64 ok; +__u64 cnt; + +static int timer_cb1(void *map, int *key, struct hmap_elem *val); + +static int timer_cb2(void *map, int *key, struct hmap_elem *val) +{ +	cnt++; +	bpf_timer_set_callback(&val->timer, timer_cb1); +	if (bpf_timer_start(&val->timer, 1000, 0)) +		err |= 1; +	ok |= 1; +	return 0; +} + +/* callback for inner hash map */ +static int timer_cb1(void *map, int *key, struct hmap_elem *val) +{ +	cnt++; +	bpf_timer_set_callback(&val->timer, timer_cb2); +	if (bpf_timer_start(&val->timer, 1000, 0)) +		err |= 2; +	/* Do a lookup to make sure 'map' and 'key' pointers are correct */ +	bpf_map_lookup_elem(map, key); +	ok |= 2; +	return 0; +} + +SEC("fentry/bpf_fentry_test1") +int BPF_PROG(test1, int a) +{ +	struct hmap_elem init = {}; +	struct bpf_map *inner_map; +	struct hmap_elem *val; +	int array_key = ARRAY_KEY; +	int hash_key = HASH_KEY; + +	inner_map = bpf_map_lookup_elem(&outer_arr, &array_key); +	if (!inner_map) +		return 0; + +	bpf_map_update_elem(inner_map, &hash_key, &init, 0); +	val = bpf_map_lookup_elem(inner_map, &hash_key); +	if (!val) +		return 0; + +	bpf_timer_init(&val->timer, inner_map, CLOCK_MONOTONIC); +	if (bpf_timer_set_callback(&val->timer, timer_cb1)) +		err |= 4; +	if (bpf_timer_start(&val->timer, 0, 0)) +		err |= 8; +	return 0; +} | 
