All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Fastabend <john.fastabend@gmail.com>
To: Andrii Nakryiko <andrii@kernel.org>,
	bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net
Cc: andrii@kernel.org, kernel-team@fb.com
Subject: RE: [PATCH bpf-next 3/3] bpf: remove unnecessary prune and jump points
Date: Tue, 06 Dec 2022 14:19:14 -0800	[thread overview]
Message-ID: <638fbfe234d9b_8a91208f5@john.notmuch> (raw)
In-Reply-To: <20221202051030.3100390-4-andrii@kernel.org>

Andrii Nakryiko wrote:
> Don't mark some instructions as jump points when there are actually no
> jumps and instructions are just processed sequentially. Such case is
> handled naturally by precision backtracking logic without the need to
> update jump history.
> 

Sorry having trouble matching up commit message with code below.

> Also remove both jump and prune point marking for instruction right
> after unconditional jumps, as program flow can get to the instruction
> right after unconditional jump instruction only if there is a jump to
> that instruction from somewhere else in the program. In such case we'll
> mark such instruction as prune/jump point because it's a destination of
> a jump.
> 
> This change has no changes in terms of number of instructions or states
> processes across Cilium and selftests programs.
> 
> Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
> ---
>  kernel/bpf/verifier.c | 24 ++++--------------------
>  1 file changed, 4 insertions(+), 20 deletions(-)
> 
> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> index 75a56ded5aca..03c2cc116292 100644
> --- a/kernel/bpf/verifier.c
> +++ b/kernel/bpf/verifier.c
> @@ -12209,13 +12209,10 @@ static int visit_func_call_insn(int t, int insn_cnt,
>  	if (ret)
>  		return ret;
>  
> -	if (t + 1 < insn_cnt) {
> -		mark_prune_point(env, t + 1);
> -		mark_jmp_point(env, t + 1);
> -	}
> +	mark_prune_point(env, t + 1);
> +
>  	if (visit_callee) {
>  		mark_prune_point(env, t);
> -		mark_jmp_point(env, t);
>  		ret = push_insn(t, t + insns[t].imm + 1, BRANCH, env,
>  				/* It's ok to allow recursion from CFG point of
>  				 * view. __check_func_call() will do the actual
> @@ -12249,15 +12246,13 @@ static int visit_insn(int t, int insn_cnt, struct bpf_verifier_env *env)
>  		return DONE_EXPLORING;
>  
>  	case BPF_CALL:
> -		if (insns[t].imm == BPF_FUNC_timer_set_callback) {
> +		if (insns[t].imm == BPF_FUNC_timer_set_callback)
>  			/* Mark this call insn to trigger is_state_visited() check

maybe fix the comment here?

>  			 * before call itself is processed by __check_func_call().
>  			 * Otherwise new async state will be pushed for further
>  			 * exploration.
>  			 */
>  			mark_prune_point(env, t);
> -			mark_jmp_point(env, t);
> -		}
>  		return visit_func_call_insn(t, insn_cnt, insns, env,
>  					    insns[t].src_reg == BPF_PSEUDO_CALL);
>  
> @@ -12271,26 +12266,15 @@ static int visit_insn(int t, int insn_cnt, struct bpf_verifier_env *env)
>  		if (ret)
>  			return ret;
>  
> -		/* unconditional jmp is not a good pruning point,
> -		 * but it's marked, since backtracking needs
> -		 * to record jmp history in is_state_visited().
> -		 */
>  		mark_prune_point(env, t + insns[t].off + 1);
>  		mark_jmp_point(env, t + insns[t].off + 1);
> -		/* tell verifier to check for equivalent states
> -		 * after every call and jump
> -		 */
> -		if (t + 1 < insn_cnt) {
> -			mark_prune_point(env, t + 1);
> -			mark_jmp_point(env, t + 1);

This makes sense to me its unconditional jmp. So no need to
add jmp point.

> -		}
>  
>  		return ret;
>  
>  	default:
>  		/* conditional jump with two edges */
>  		mark_prune_point(env, t);
> -		mark_jmp_point(env, t);

                 ^^^^^^^^^^^^^^^^^^^^^^^

Specifically, try to see why we dropped this jmp_point?

> +
>  		ret = push_insn(t, t + 1, FALLTHROUGH, env, true);
>  		if (ret)
>  			return ret;
> -- 
> 2.30.2
> 



  reply	other threads:[~2022-12-06 22:19 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-02  5:10 [PATCH bpf-next 0/3] Refactor verifier prune and jump point handling Andrii Nakryiko
2022-12-02  5:10 ` [PATCH bpf-next 1/3] bpf: decouple prune and jump points Andrii Nakryiko
2022-12-06 21:42   ` John Fastabend
2022-12-06 23:05     ` Andrii Nakryiko
2022-12-02  5:10 ` [PATCH bpf-next 2/3] bpf: mostly decouple jump history management from is_state_visited() Andrii Nakryiko
2022-12-06 22:01   ` John Fastabend
2022-12-02  5:10 ` [PATCH bpf-next 3/3] bpf: remove unnecessary prune and jump points Andrii Nakryiko
2022-12-06 22:19   ` John Fastabend [this message]
2022-12-06 23:19     ` Andrii Nakryiko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=638fbfe234d9b_8a91208f5@john.notmuch \
    --to=john.fastabend@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=kernel-team@fb.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.