Files
linux/include/linux
Andrii Nakryiko 6018e1f407 bpf: implement numbers iterator
Implement the first open-coded iterator type over a range of integers.

It's public API consists of:
  - bpf_iter_num_new() constructor, which accepts [start, end) range
    (that is, start is inclusive, end is exclusive).
  - bpf_iter_num_next() which will keep returning read-only pointer to int
    until the range is exhausted, at which point NULL will be returned.
    If bpf_iter_num_next() is kept calling after this, NULL will be
    persistently returned.
  - bpf_iter_num_destroy() destructor, which needs to be called at some
    point to clean up iterator state. BPF verifier enforces that iterator
    destructor is called at some point before BPF program exits.

Note that `start = end = X` is a valid combination to setup an empty
iterator. bpf_iter_num_new() will return 0 (success) for any such
combination.

If bpf_iter_num_new() detects invalid combination of input arguments, it
returns error, resets iterator state to, effectively, empty iterator, so
any subsequent call to bpf_iter_num_next() will keep returning NULL.

BPF verifier has no knowledge that returned integers are in the
[start, end) value range, as both `start` and `end` are not statically
known and enforced: they are runtime values.

While the implementation is pretty trivial, some care needs to be taken
to avoid overflows and underflows. Subsequent selftests will validate
correctness of [start, end) semantics, especially around extremes
(INT_MIN and INT_MAX).

Similarly to bpf_loop(), we enforce that no more than BPF_MAX_LOOPS can
be specified.

bpf_iter_num_{new,next,destroy}() is a logical evolution from bounded
BPF loops and bpf_loop() helper and is the basis for implementing
ergonomic BPF loops with no statically known or verified bounds.
Subsequent patches implement bpf_for() macro, demonstrating how this can
be wrapped into something that works and feels like a normal for() loop
in C language.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20230308184121.1165081-5-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2023-03-08 16:19:51 -08:00
..
2023-01-16 09:26:05 +01:00
2022-11-04 12:59:25 +02:00
2023-02-16 13:42:22 +01:00
2023-02-20 09:20:55 -05:00
2023-02-15 19:38:50 +01:00
2023-01-19 14:46:25 +01:00
2022-09-26 12:19:12 -07:00
2022-12-07 09:43:12 -07:00
2023-03-08 16:19:51 -08:00
2023-02-03 08:20:55 -07:00
2022-09-26 19:46:29 -07:00
2022-09-26 10:13:13 -07:00
2022-09-26 10:13:13 -07:00
2022-09-15 09:32:06 -07:00
2023-01-13 11:48:15 +01:00
2023-01-19 16:07:40 +01:00
2023-01-29 15:18:33 -07:00
2023-01-29 15:18:33 -07:00
2023-02-06 19:06:58 +01:00
2023-01-19 09:24:28 +01:00
2023-01-11 06:52:43 -05:00
2023-02-02 22:33:13 -08:00
2023-01-17 09:29:59 +01:00
2022-11-11 18:18:05 -08:00
2022-09-01 18:04:43 +02:00
2022-09-08 12:59:00 -06:00
2022-09-26 13:31:20 +02:00
2022-11-15 00:42:02 -08:00
2022-12-11 19:30:20 -08:00
2022-09-01 18:08:44 +02:00
2023-02-13 10:11:20 +02:00
2022-10-03 14:03:19 -07:00
2023-01-19 09:24:28 +01:00
2023-01-19 09:24:28 +01:00
2023-01-19 09:24:30 +01:00
2023-03-07 23:57:19 -08:00
2022-10-03 17:34:32 -07:00
2022-09-26 19:46:27 -07:00
2023-02-02 22:33:34 -08:00
2023-01-16 09:26:06 +01:00
2023-03-07 18:19:09 -08:00
2023-01-04 14:44:13 -07:00
2023-01-19 09:24:28 +01:00
2022-12-20 03:13:45 +01:00
2022-10-23 18:06:54 -04:00
2023-01-19 09:24:28 +01:00
2023-01-19 15:01:19 +01:00
2023-03-08 13:21:47 +00:00
2023-01-03 17:49:22 -08:00
2023-01-18 17:12:47 -08:00
2022-09-07 12:42:25 +01:00
2023-02-16 18:10:18 +01:00
2022-09-29 15:20:29 +02:00
2022-09-22 16:12:34 +02:00
2022-08-28 16:52:28 +01:00
2023-01-23 15:38:08 +01:00
2023-02-20 19:26:58 -05:00
2022-09-26 19:46:18 -07:00
2023-01-19 09:24:28 +01:00
2022-10-24 12:12:32 -07:00