On Mon, Jan 8, 2024 at 4:57 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > On Mon, 2024-01-08 at 16:45 -0800, Andrii Nakryiko wrote: > [...] > > > @@ -14713,6 +14714,13 @@ static bool try_match_pkt_pointers(const struct bpf_insn *insn, > > > find_good_pkt_pointers(other_branch, dst_reg, dst_reg->type, opcode == BPF_JLT); > > > mark_pkt_end(this_branch, dst_regno, opcode == BPF_JLE); > > > break; > > > + case BPF_JEQ: > > > + case BPF_JNE: > > > + /* pkt_data ==/!= pkt_end, pkt_meta ==/!= pkt_data */ > > > + eq_branch = opcode == BPF_JEQ ? other_branch : this_branch; > > > + find_good_pkt_pointers(eq_branch, dst_reg, dst_reg->type, true); > > > + mark_pkt_end(eq_branch, dst_regno, false); > > > > hm... if pkt_data != pkt_end in this_branch, can we really infer > > whether reg->range is BEYOND_PKT_END or AT_PKT_END? What if it's > > IN_FRONT_OF_PKT_END? > > pkt_data != pkt_end in this_branch means that there is an instruction: > > ... > if pkt_data == pkt_end goto <other_branch> > ... <this_branch> ... > > the 'eq_branch' would be set to 'other_branch' and AT_PKT_END would be set > for dst register in 'other_branch'. What's wrong with this? > Or did you mean something else? Well, first off, I'm very unfamiliar with all these pkt_xxx registers, so excuse me for stupid questions. I guess what got me confused was that find_good_pkt_pointer() and mark_pkt_end() previously (for GT/GE/LT/LE) were working on opposing branches. But here I see they work on the same "equal" branch. But now I'm wondering what's the point of even calling find_good_pkt_pointer()? Is there a scenario where it can derive new information from JEQ/JNE?