1*5697683eSKumar Kartikeya Dwivedi // SPDX-License-Identifier: GPL-2.0
2*5697683eSKumar Kartikeya Dwivedi /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
3*5697683eSKumar Kartikeya Dwivedi #include <vmlinux.h>
4*5697683eSKumar Kartikeya Dwivedi #include <bpf/bpf_tracing.h>
5*5697683eSKumar Kartikeya Dwivedi #include <bpf/bpf_helpers.h>
6*5697683eSKumar Kartikeya Dwivedi #include "bpf_misc.h"
7*5697683eSKumar Kartikeya Dwivedi #include "bpf_experimental.h"
8*5697683eSKumar Kartikeya Dwivedi
9*5697683eSKumar Kartikeya Dwivedi struct arr_elem {
10*5697683eSKumar Kartikeya Dwivedi struct bpf_res_spin_lock lock;
11*5697683eSKumar Kartikeya Dwivedi };
12*5697683eSKumar Kartikeya Dwivedi
13*5697683eSKumar Kartikeya Dwivedi struct {
14*5697683eSKumar Kartikeya Dwivedi __uint(type, BPF_MAP_TYPE_ARRAY);
15*5697683eSKumar Kartikeya Dwivedi __uint(max_entries, 1);
16*5697683eSKumar Kartikeya Dwivedi __type(key, int);
17*5697683eSKumar Kartikeya Dwivedi __type(value, struct arr_elem);
18*5697683eSKumar Kartikeya Dwivedi } arrmap SEC(".maps");
19*5697683eSKumar Kartikeya Dwivedi
20*5697683eSKumar Kartikeya Dwivedi #define ENOSPC 28
21*5697683eSKumar Kartikeya Dwivedi #define _STR "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
22*5697683eSKumar Kartikeya Dwivedi
23*5697683eSKumar Kartikeya Dwivedi int size;
24*5697683eSKumar Kartikeya Dwivedi
25*5697683eSKumar Kartikeya Dwivedi SEC("syscall")
26*5697683eSKumar Kartikeya Dwivedi __success __retval(0)
stream_exhaust(void * ctx)27*5697683eSKumar Kartikeya Dwivedi int stream_exhaust(void *ctx)
28*5697683eSKumar Kartikeya Dwivedi {
29*5697683eSKumar Kartikeya Dwivedi /* Use global variable for loop convergence. */
30*5697683eSKumar Kartikeya Dwivedi size = 0;
31*5697683eSKumar Kartikeya Dwivedi bpf_repeat(BPF_MAX_LOOPS) {
32*5697683eSKumar Kartikeya Dwivedi if (bpf_stream_printk(BPF_STDOUT, _STR) == -ENOSPC && size == 99954)
33*5697683eSKumar Kartikeya Dwivedi return 0;
34*5697683eSKumar Kartikeya Dwivedi size += sizeof(_STR) - 1;
35*5697683eSKumar Kartikeya Dwivedi }
36*5697683eSKumar Kartikeya Dwivedi return 1;
37*5697683eSKumar Kartikeya Dwivedi }
38*5697683eSKumar Kartikeya Dwivedi
39*5697683eSKumar Kartikeya Dwivedi SEC("syscall")
40*5697683eSKumar Kartikeya Dwivedi __success __retval(0)
stream_cond_break(void * ctx)41*5697683eSKumar Kartikeya Dwivedi int stream_cond_break(void *ctx)
42*5697683eSKumar Kartikeya Dwivedi {
43*5697683eSKumar Kartikeya Dwivedi while (can_loop)
44*5697683eSKumar Kartikeya Dwivedi ;
45*5697683eSKumar Kartikeya Dwivedi return 0;
46*5697683eSKumar Kartikeya Dwivedi }
47*5697683eSKumar Kartikeya Dwivedi
48*5697683eSKumar Kartikeya Dwivedi SEC("syscall")
49*5697683eSKumar Kartikeya Dwivedi __success __retval(0)
stream_deadlock(void * ctx)50*5697683eSKumar Kartikeya Dwivedi int stream_deadlock(void *ctx)
51*5697683eSKumar Kartikeya Dwivedi {
52*5697683eSKumar Kartikeya Dwivedi struct bpf_res_spin_lock *lock, *nlock;
53*5697683eSKumar Kartikeya Dwivedi
54*5697683eSKumar Kartikeya Dwivedi lock = bpf_map_lookup_elem(&arrmap, &(int){0});
55*5697683eSKumar Kartikeya Dwivedi if (!lock)
56*5697683eSKumar Kartikeya Dwivedi return 1;
57*5697683eSKumar Kartikeya Dwivedi nlock = bpf_map_lookup_elem(&arrmap, &(int){0});
58*5697683eSKumar Kartikeya Dwivedi if (!nlock)
59*5697683eSKumar Kartikeya Dwivedi return 1;
60*5697683eSKumar Kartikeya Dwivedi if (bpf_res_spin_lock(lock))
61*5697683eSKumar Kartikeya Dwivedi return 1;
62*5697683eSKumar Kartikeya Dwivedi if (bpf_res_spin_lock(nlock)) {
63*5697683eSKumar Kartikeya Dwivedi bpf_res_spin_unlock(lock);
64*5697683eSKumar Kartikeya Dwivedi return 0;
65*5697683eSKumar Kartikeya Dwivedi }
66*5697683eSKumar Kartikeya Dwivedi bpf_res_spin_unlock(nlock);
67*5697683eSKumar Kartikeya Dwivedi bpf_res_spin_unlock(lock);
68*5697683eSKumar Kartikeya Dwivedi return 1;
69*5697683eSKumar Kartikeya Dwivedi }
70*5697683eSKumar Kartikeya Dwivedi
71*5697683eSKumar Kartikeya Dwivedi SEC("syscall")
72*5697683eSKumar Kartikeya Dwivedi __success __retval(0)
stream_syscall(void * ctx)73*5697683eSKumar Kartikeya Dwivedi int stream_syscall(void *ctx)
74*5697683eSKumar Kartikeya Dwivedi {
75*5697683eSKumar Kartikeya Dwivedi bpf_stream_printk(BPF_STDOUT, "foo");
76*5697683eSKumar Kartikeya Dwivedi return 0;
77*5697683eSKumar Kartikeya Dwivedi }
78*5697683eSKumar Kartikeya Dwivedi
79*5697683eSKumar Kartikeya Dwivedi char _license[] SEC("license") = "GPL";
80