1*7e86a8c4SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
2*7e86a8c4SAndrii Nakryiko /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */
3*7e86a8c4SAndrii Nakryiko 
4*7e86a8c4SAndrii Nakryiko #include "vmlinux.h"
5*7e86a8c4SAndrii Nakryiko #include <bpf/bpf_helpers.h>
6*7e86a8c4SAndrii Nakryiko #include "bpf_misc.h"
7*7e86a8c4SAndrii Nakryiko 
8*7e86a8c4SAndrii Nakryiko struct bpf_iter_testmod_seq {
9*7e86a8c4SAndrii Nakryiko 	u64 :64;
10*7e86a8c4SAndrii Nakryiko 	u64 :64;
11*7e86a8c4SAndrii Nakryiko };
12*7e86a8c4SAndrii Nakryiko 
13*7e86a8c4SAndrii Nakryiko extern int bpf_iter_testmod_seq_new(struct bpf_iter_testmod_seq *it, s64 value, int cnt) __ksym;
14*7e86a8c4SAndrii Nakryiko extern s64 *bpf_iter_testmod_seq_next(struct bpf_iter_testmod_seq *it) __ksym;
15*7e86a8c4SAndrii Nakryiko extern void bpf_iter_testmod_seq_destroy(struct bpf_iter_testmod_seq *it) __ksym;
16*7e86a8c4SAndrii Nakryiko 
17*7e86a8c4SAndrii Nakryiko const volatile __s64 exp_empty = 0 + 1;
18*7e86a8c4SAndrii Nakryiko __s64 res_empty;
19*7e86a8c4SAndrii Nakryiko 
20*7e86a8c4SAndrii Nakryiko SEC("raw_tp/sys_enter")
21*7e86a8c4SAndrii Nakryiko __success __log_level(2)
22*7e86a8c4SAndrii Nakryiko __msg("fp-16_w=iter_testmod_seq(ref_id=1,state=active,depth=0)")
23*7e86a8c4SAndrii Nakryiko __msg("fp-16=iter_testmod_seq(ref_id=1,state=drained,depth=0)")
24*7e86a8c4SAndrii Nakryiko __msg("call bpf_iter_testmod_seq_destroy")
testmod_seq_empty(const void * ctx)25*7e86a8c4SAndrii Nakryiko int testmod_seq_empty(const void *ctx)
26*7e86a8c4SAndrii Nakryiko {
27*7e86a8c4SAndrii Nakryiko 	__s64 sum = 0, *i;
28*7e86a8c4SAndrii Nakryiko 
29*7e86a8c4SAndrii Nakryiko 	bpf_for_each(testmod_seq, i, 1000, 0) sum += *i;
30*7e86a8c4SAndrii Nakryiko 	res_empty = 1 + sum;
31*7e86a8c4SAndrii Nakryiko 
32*7e86a8c4SAndrii Nakryiko 	return 0;
33*7e86a8c4SAndrii Nakryiko }
34*7e86a8c4SAndrii Nakryiko 
35*7e86a8c4SAndrii Nakryiko const volatile __s64 exp_full = 1000000;
36*7e86a8c4SAndrii Nakryiko __s64 res_full;
37*7e86a8c4SAndrii Nakryiko 
38*7e86a8c4SAndrii Nakryiko SEC("raw_tp/sys_enter")
39*7e86a8c4SAndrii Nakryiko __success __log_level(2)
40*7e86a8c4SAndrii Nakryiko __msg("fp-16_w=iter_testmod_seq(ref_id=1,state=active,depth=0)")
41*7e86a8c4SAndrii Nakryiko __msg("fp-16=iter_testmod_seq(ref_id=1,state=drained,depth=0)")
42*7e86a8c4SAndrii Nakryiko __msg("call bpf_iter_testmod_seq_destroy")
testmod_seq_full(const void * ctx)43*7e86a8c4SAndrii Nakryiko int testmod_seq_full(const void *ctx)
44*7e86a8c4SAndrii Nakryiko {
45*7e86a8c4SAndrii Nakryiko 	__s64 sum = 0, *i;
46*7e86a8c4SAndrii Nakryiko 
47*7e86a8c4SAndrii Nakryiko 	bpf_for_each(testmod_seq, i, 1000, 1000) sum += *i;
48*7e86a8c4SAndrii Nakryiko 	res_full = sum;
49*7e86a8c4SAndrii Nakryiko 
50*7e86a8c4SAndrii Nakryiko 	return 0;
51*7e86a8c4SAndrii Nakryiko }
52*7e86a8c4SAndrii Nakryiko 
53*7e86a8c4SAndrii Nakryiko const volatile __s64 exp_truncated = 10 * 1000000;
54*7e86a8c4SAndrii Nakryiko __s64 res_truncated;
55*7e86a8c4SAndrii Nakryiko 
56*7e86a8c4SAndrii Nakryiko static volatile int zero = 0;
57*7e86a8c4SAndrii Nakryiko 
58*7e86a8c4SAndrii Nakryiko SEC("raw_tp/sys_enter")
59*7e86a8c4SAndrii Nakryiko __success __log_level(2)
60*7e86a8c4SAndrii Nakryiko __msg("fp-16_w=iter_testmod_seq(ref_id=1,state=active,depth=0)")
61*7e86a8c4SAndrii Nakryiko __msg("fp-16=iter_testmod_seq(ref_id=1,state=drained,depth=0)")
62*7e86a8c4SAndrii Nakryiko __msg("call bpf_iter_testmod_seq_destroy")
testmod_seq_truncated(const void * ctx)63*7e86a8c4SAndrii Nakryiko int testmod_seq_truncated(const void *ctx)
64*7e86a8c4SAndrii Nakryiko {
65*7e86a8c4SAndrii Nakryiko 	__s64 sum = 0, *i;
66*7e86a8c4SAndrii Nakryiko 	int cnt = zero;
67*7e86a8c4SAndrii Nakryiko 
68*7e86a8c4SAndrii Nakryiko 	bpf_for_each(testmod_seq, i, 10, 2000000) {
69*7e86a8c4SAndrii Nakryiko 		sum += *i;
70*7e86a8c4SAndrii Nakryiko 		cnt++;
71*7e86a8c4SAndrii Nakryiko 		if (cnt >= 1000000)
72*7e86a8c4SAndrii Nakryiko 			break;
73*7e86a8c4SAndrii Nakryiko 	}
74*7e86a8c4SAndrii Nakryiko 	res_truncated = sum;
75*7e86a8c4SAndrii Nakryiko 
76*7e86a8c4SAndrii Nakryiko 	return 0;
77*7e86a8c4SAndrii Nakryiko }
78*7e86a8c4SAndrii Nakryiko 
79*7e86a8c4SAndrii Nakryiko char _license[] SEC("license") = "GPL";
80