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) 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) 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) 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) 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