-1

I am trying to iterate a linked list in BPF, can I use bpf_loop for this?, if so how?

Tried using bpf_loops, but it required a fixed number to bound the loops, what way I can do that?

1 Answers1

1

These are the comments for bpf_loop.

bpf_loop

For nr_loops, call callback_fn function with callback_ctx as the context parameter. The callback_fn should be a static function and the callback_ctx should be a pointer to the stack. The flags is used to control certain aspects of the helper. Currently, the flags must be 0. Currently, nr_loops is limited to 1 << 23 (~8 million) loops.

long (*callback_fn)(u32 index, void *ctx);

where index is the current index in the loop. The index is zero-indexed.

If callback_fn returns 0, the helper will continue to the next loop. If return value is 1, the helper will skip the rest of the loops and return. Other return values are not used now, and will be rejected by the verifier.

Returns The number of loops performed, -EINVAL for invalid flags, -E2BIG if nr_loops exceeds the maximum number of loops.

  • You can pass the linked list via the callback_ctx which is shared between iterations.
  • You can hardcode the number of loops to the max of 1 << 23 (~8 million) (perhaps less, it depends on how the verifier imposes penalties).
  • If you can advance the linked list you do so and perform whatever logic you want.
  • If you are done or at the end of the linked list you return 1 to break out of the loop.
  • If you expect to need more than 8M iterations, you can at least detect when you are not done by looking at the return value (perhaps running a second loop, I don't know if that is allowed or not)
Dylan Reimerink
  • 5,874
  • 2
  • 15
  • 21