On Thu, Apr 05, 2018 at 04:50:03PM +0100, Jiong Wang wrote: > On 03/04/2018 02:08, Alexei Starovoitov wrote: > > Combining subprog pass with do_check is going into opposite direction > > of this long term work. Divide and conquer. Combining more things into > > do_check is the opposite of this programming principle. > > Agree. And for the redundant insn traversal issue in check_subprogs that > Edward trying to fix, I am thinking we could do it by utilizing the > existing DFS traversal in check_cfg. > > The current DFS probably could be improved into an generic instruction > information collection pass. > > This won't make the existing DFS complexer as it only does information > collection as a side job during traversal. These collected information > then could be used to build any other information to be consumed later, > for example subprog, basic blocks etc. > > For the redundant insn traversal issue during subprog detection, the > Like how we mark STATE_LIST_MARK in DFS, we could just call add_subprog > for BPF_PSEUDO_CALL insn during DFS. > > i.e we change the code logic of check_cfg into: > > check_cfg > { > * DFS traversal: > - detect back-edge. > - collect STATE_LIST_MARK. > - collect subprog destination. > > * check all insns are reachable. > * check_subprogs (insn traversal removed). > }
I don't think that will work. Functions are independent from CFG. With bpf libraries we will have disjoint functions sitting in the kernel and check_cfg would need to be done separately from function boundaries.