diff options
Diffstat (limited to 'tools/testing/selftests/bpf/progs/iters.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/iters.c | 28 | 
1 files changed, 25 insertions, 3 deletions
diff --git a/tools/testing/selftests/bpf/progs/iters.c b/tools/testing/selftests/bpf/progs/iters.c index c20c4e38b71c..fe971992e635 100644 --- a/tools/testing/selftests/bpf/progs/iters.c +++ b/tools/testing/selftests/bpf/progs/iters.c @@ -6,7 +6,7 @@  #include <bpf/bpf_helpers.h>  #include "bpf_misc.h" -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define ARRAY_SIZE(x) (int)(sizeof(x) / sizeof((x)[0]))  static volatile int zero = 0; @@ -676,7 +676,7 @@ static __noinline int sum(struct bpf_iter_num *it, int *arr, __u32 n)  	while ((t = bpf_iter_num_next(it))) {  		i = *t; -		if (i >= n) +		if ((__u32)i >= n)  			break;  		sum += arr[i];  	} @@ -846,7 +846,7 @@ __naked int delayed_precision_mark(void)  		"call %[bpf_iter_num_next];"  		"if r0 == 0 goto 2f;"  		"if r6 != 42 goto 3f;" -		"r7 = -32;" +		"r7 = -33;"  		"call %[bpf_get_prandom_u32];"  		"r6 = r0;"  		"goto 1b;\n" @@ -1411,4 +1411,26 @@ __naked int checkpoint_states_deletion(void)  	);  } +struct { +	int data[32]; +	int n; +} loop_data; + +SEC("raw_tp") +__success +int iter_arr_with_actual_elem_count(const void *ctx) +{ +	int i, n = loop_data.n, sum = 0; + +	if (n > ARRAY_SIZE(loop_data.data)) +		return 0; + +	bpf_for(i, 0, n) { +		/* no rechecking of i against ARRAY_SIZE(loop_data.n) */ +		sum += loop_data.data[i]; +	} + +	return sum; +} +  char _license[] SEC("license") = "GPL";  |