BPF List
 help / color / mirror / Atom feed
* [PATCH v6 bpf-next 0/4] bpf: Introduce may_goto and cond_break
@ 2024-03-06  3:19 Alexei Starovoitov
  2024-03-06  3:19 ` [PATCH v6 bpf-next 1/4] bpf: Introduce may_goto instruction Alexei Starovoitov
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: Alexei Starovoitov @ 2024-03-06  3:19 UTC (permalink / raw)
  To: bpf
  Cc: daniel, andrii, martin.lau, memxor, eddyz87, john.fastabend,
	kernel-team

From: Alexei Starovoitov <ast@kernel.org>

v5 -> v6:
- Rename BPF_JMA to BPF_JCOND
- Addressed Andrii's review comments

v4 -> v5:
- rewrote patch 1 to avoid fake may_goto_reg and use 'u32 may_goto_cnt' instead.
  This way may_goto handling is similar to bpf_loop() processing.
- fixed bug in patch 2 that RANGE_WITHIN should not use
  rold->type == NOT_INIT as a safe signal.
- patch 3 fixed negative offset computation in cond_break macro
- using bpf_arena and cond_break recompiled lib/glob.c as bpf prog
  and it works! It will be added as a selftest to arena series.

v3 -> v4:
- fix drained issue reported by John.
  may_goto insn could be implemented with sticky state (once
  reaches 0 it stays 0), but the verifier shouldn't assume that.
  It has to explore both branches.
  Arguably drained iterator state shouldn't be there at all.
  bpf_iter_css_next() is not sticky. Can be fixed, but auditing all
  iterators for stickiness. That's an orthogonal discussion.
- explained JMA name reasons in patch 1
- fixed test_progs-no_alu32 issue and added another test

v2 -> v3: Major change
- drop bpf_can_loop() kfunc and introduce may_goto instruction instead
  kfunc is a function call while may_goto doesn't consume any registers
  and LLVM can produce much better code due to less register pressure.
- instead of counting from zero to BPF_MAX_LOOPS start from it instead
  and break out of the loop when count reaches zero
- use may_goto instruction in cond_break macro
- recognize that 'exact' state comparison doesn't need to be truly exact.
  regsafe() should ignore precision and liveness marks, but range_within
  logic is safe to use while evaluating open coded iterators.

Alexei Starovoitov (4):
  bpf: Introduce may_goto instruction
  bpf: Recognize that two registers are safe when their ranges match
  bpf: Add cond_break macro
  selftests/bpf: Test may_goto

 include/linux/bpf_verifier.h                  |   2 +
 include/uapi/linux/bpf.h                      |   5 +
 kernel/bpf/core.c                             |   1 +
 kernel/bpf/disasm.c                           |   4 +
 kernel/bpf/verifier.c                         | 212 +++++++++++++-----
 tools/include/uapi/linux/bpf.h                |   5 +
 tools/testing/selftests/bpf/DENYLIST.s390x    |   1 +
 .../testing/selftests/bpf/bpf_experimental.h  |  12 +
 .../bpf/progs/verifier_iterating_callbacks.c  | 103 ++++++++-
 9 files changed, 292 insertions(+), 53 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2024-03-06 19:15 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-06  3:19 [PATCH v6 bpf-next 0/4] bpf: Introduce may_goto and cond_break Alexei Starovoitov
2024-03-06  3:19 ` [PATCH v6 bpf-next 1/4] bpf: Introduce may_goto instruction Alexei Starovoitov
2024-03-06 13:12   ` Eduard Zingerman
2024-03-06 16:40     ` Alexei Starovoitov
2024-03-06 18:33   ` Andrii Nakryiko
2024-03-06 18:38     ` Alexei Starovoitov
2024-03-06  3:19 ` [PATCH v6 bpf-next 2/4] bpf: Recognize that two registers are safe when their ranges match Alexei Starovoitov
2024-03-06 13:07   ` Eduard Zingerman
2024-03-06  3:19 ` [PATCH v6 bpf-next 3/4] bpf: Add cond_break macro Alexei Starovoitov
2024-03-06 13:26   ` Eduard Zingerman
2024-03-06 16:51     ` Alexei Starovoitov
2024-03-06  3:19 ` [PATCH v6 bpf-next 4/4] selftests/bpf: Test may_goto Alexei Starovoitov
2024-03-06 18:50 ` [PATCH v6 bpf-next 0/4] bpf: Introduce may_goto and cond_break patchwork-bot+netdevbpf
2024-03-06 19:15   ` John Fastabend

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox