Skip to content

Commit d621b4f

Browse files
committed
delay-kfunc: Calibrate both inner and outer loop counts
To make it possible to hit the whole range of delays, we need to vary the number of iterations in the inner loop as well, or we'll hit the loop counter limit for the outer loop. So start with a lower number of iterations for the inner loop, and increase it as part of the calibration as needed. Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
1 parent befb276 commit d621b4f

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

delay-kfunc/delay-kfunc.bpf.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@
1111
char LICENSE[] SEC("license") = "GPL";
1212

1313
#define TIME_ROUNDS 10
14-
#define TIME_ITER 100
14+
#define TIME_ITER 1000
1515

1616
struct {
1717
__uint(type, BPF_MAP_TYPE_RINGBUF);
1818
__uint(max_entries, 0x1000);
1919
} delay_ringbuf SEC(".maps");
2020

21-
__u64 loop_iterations = 10000;
21+
__u64 iterations_inner = 10000;
22+
__u64 iterations_outer = 10000;
2223
__u64 avg_delay = 100;
2324

2425
static int recurse_loop(__u64 idx, void *ctx)
@@ -28,7 +29,7 @@ static int recurse_loop(__u64 idx, void *ctx)
2829

2930
static int run_delay(__u64 idx, void *ctx)
3031
{
31-
bpf_loop(100000, recurse_loop, NULL, 0);
32+
bpf_loop(iterations_inner, recurse_loop, NULL, 0);
3233
return 0;
3334
}
3435

@@ -41,7 +42,7 @@ int BPF_PROG(delay_function)
4142
int ret;
4243

4344
start_ns = bpf_ktime_get_boot_ns();
44-
ret = bpf_loop(loop_iterations, run_delay, NULL, 0);
45+
ret = bpf_loop(iterations_outer, run_delay, NULL, 0);
4546

4647
stats = bpf_ringbuf_reserve(&delay_ringbuf, sizeof(*stats), 0);
4748
if (stats) {

delay-kfunc/delay-kfunc.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ static int process_stats_entry(void *ctx, void *data, size_t len)
106106

107107
int main(int argc, char *argv[])
108108
{
109+
unsigned long loop_outer, loop_inner;
109110
struct ring_buffer *rb = NULL;
110111
struct delay_kfunc_bpf *skel;
111-
unsigned long loop_iter;
112112
long target_delay;
113113
char *func_name;
114114
int err = -1;
@@ -131,6 +131,9 @@ int main(int argc, char *argv[])
131131
if (!skel)
132132
goto out;
133133

134+
loop_outer = skel->data->iterations_outer;
135+
loop_inner = skel->data->iterations_inner;
136+
134137
err = bpf_program__set_attach_target(skel->progs.delay_function, 0,
135138
func_name);
136139
if (err) {
@@ -149,12 +152,18 @@ int main(int argc, char *argv[])
149152
if (err)
150153
goto out;
151154

152-
loop_iter = 1 + target_delay * 1000 / skel->data->avg_delay;
153-
if (loop_iter > 1 << 23)
154-
loop_iter = 1 << 23;
155-
printf("average outer loop delay %llu ns - looping %lu times to hit target\n",
156-
skel->data->avg_delay, loop_iter);
157-
skel->data->loop_iterations = loop_iter;
155+
printf("average loop duration %llu ns / %lu iterations ",
156+
skel->data->avg_delay,
157+
loop_inner);
158+
159+
loop_outer = 1 + target_delay * 1000 / skel->data->avg_delay;
160+
while (loop_outer > 1 << 23) {
161+
loop_inner *= 10;
162+
loop_outer /= 10;
163+
}
164+
printf("- looping %lu * %lu times to hit target\n", loop_outer, loop_inner);
165+
skel->data->iterations_outer = loop_outer;
166+
skel->data->iterations_inner = loop_inner;
158167

159168
rb = ring_buffer__new(bpf_map__fd(skel->maps.delay_ringbuf),
160169
process_stats_entry,

0 commit comments

Comments
 (0)