xref: /linux/tools/testing/selftests/bpf/progs/lru_lock_nmi.c (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1*6e1e4a9dSMykyta Yatsenko // SPDX-License-Identifier: GPL-2.0
2*6e1e4a9dSMykyta Yatsenko #include <vmlinux.h>
3*6e1e4a9dSMykyta Yatsenko #include <bpf/bpf_helpers.h>
4*6e1e4a9dSMykyta Yatsenko 
5*6e1e4a9dSMykyta Yatsenko struct {
6*6e1e4a9dSMykyta Yatsenko 	__uint(type, BPF_MAP_TYPE_LRU_HASH);
7*6e1e4a9dSMykyta Yatsenko 	__uint(max_entries, 64);
8*6e1e4a9dSMykyta Yatsenko 	__type(key, __u32);
9*6e1e4a9dSMykyta Yatsenko 	__type(value, __u64);
10*6e1e4a9dSMykyta Yatsenko } lru_map SEC(".maps");
11*6e1e4a9dSMykyta Yatsenko 
12*6e1e4a9dSMykyta Yatsenko int hits;
13*6e1e4a9dSMykyta Yatsenko 
14*6e1e4a9dSMykyta Yatsenko SEC("perf_event")
15*6e1e4a9dSMykyta Yatsenko int oncpu(void *ctx)
16*6e1e4a9dSMykyta Yatsenko {
17*6e1e4a9dSMykyta Yatsenko 	/*
18*6e1e4a9dSMykyta Yatsenko 	 * Key range deliberately wider than max_entries to force LRU
19*6e1e4a9dSMykyta Yatsenko 	 * eviction on every other update.
20*6e1e4a9dSMykyta Yatsenko 	 */
21*6e1e4a9dSMykyta Yatsenko 	__u32 key = bpf_get_prandom_u32() % 128;
22*6e1e4a9dSMykyta Yatsenko 	bool do_update = bpf_get_prandom_u32() & 1;
23*6e1e4a9dSMykyta Yatsenko 	__u64 val = 1;
24*6e1e4a9dSMykyta Yatsenko 
25*6e1e4a9dSMykyta Yatsenko 	if (do_update)
26*6e1e4a9dSMykyta Yatsenko 		bpf_map_update_elem(&lru_map, &key, &val, BPF_ANY);
27*6e1e4a9dSMykyta Yatsenko 	else
28*6e1e4a9dSMykyta Yatsenko 		bpf_map_delete_elem(&lru_map, &key);
29*6e1e4a9dSMykyta Yatsenko 	__sync_fetch_and_add(&hits, 1);
30*6e1e4a9dSMykyta Yatsenko 	return 0;
31*6e1e4a9dSMykyta Yatsenko }
32*6e1e4a9dSMykyta Yatsenko 
33*6e1e4a9dSMykyta Yatsenko char _license[] SEC("license") = "GPL";
34