On Mon, Jul 31, 2023 at 5:11 PM Martin KaFai Lau <martin.lau@xxxxxxxxx> wrote: > > On 7/31/23 2:35 PM, Yan Zhai wrote: > > On Fri, Jul 28, 2023 at 5:02 PM Martin KaFai Lau <martin.lau@xxxxxxxxx> wrote: > >> > >> On 7/25/23 6:08 PM, Yan Zhai wrote: > >>> skb_do_redirect returns various of values: error code (negative), > >>> 0 (success), and some positive status code, e.g. NET_XMIT_CN, > >>> NET_RX_DROP. Commit 3a0af8fd61f9 ("bpf: BPF for lightweight tunnel > >>> infrastructure") didn't check the return code correctly, so positive > >>> values are propagated back along call chain: > >>> > >>> ip_finish_output2 > >>> -> bpf_xmit > >>> -> run_lwt_bpf > >>> -> skb_do_redirect > >> > >> From looking at skb_do_redirect, the skb_do_redirect should have consumed the > >> skb except for the -EAGAIN return value. afaik, -EAGAIN could only happen by > >> using the bpf_redirect_peer helper. lwt does not have the bpf_redirect_peer > >> helper available, so there is no -EAGAIN case in lwt. iow, skb_do_redirect > >> should have always consumed the skb in lwt. or did I miss something? > >> > >> If that is the case, it feels like the fix should be in run_lwt_bpf() and the > >> "if (ret == 0)" test in run_lwt_bpf() is unnecessary? > >> > >> ret = skb_do_redirect(skb); > >> if (ret == 0) > >> ret = BPF_REDIRECT; > >> > >> > > Just fixing skb redirect return code won't be sufficient. I realized > > there are other return paths that need to be treated, e.g. bpf reroute > > path also directly returns dev_queue_xmit status. I plan to check for > > LWTUNNEL_XMIT_CONTINUE (and change it to a value that does not > > conflict with NET_RX_DROP and NET_XMIT_DROP) in the next revision. On > > the other hand, the return value of NETDEV_TX_BUSY is another hassle. > > I suspect we are talking about different things or I am still missing something. > > I was thinking skb_do_redirect() should have always consumed the skb and > bpf_xmit should always return LWTUNNEL_XMIT_DONE also (instead of > LWTUNNEL_XMIT_CONTINUE described in the this patch commit message). It is what > sch_handle_egress() is doing also. Could you explain how is it different from > the skb_do_redirect usage in sch_handle_egress() or you are suggesting the > current sch_handle_egress() has the issue too also? > I think we were not on the same page. You are absolutely right that skb_do_redirect should consume the packet anyway. The difference between your proposal and this patch is that this patch returns errno or LWTUNNEL_XMIT_DONE, and yours does not even return errno. Both approaches fix the issue of "redirect to down device crashes the kernel". What I commented was an exact same issue at different location: BPF reroute may trigger the crash as well, since it also returns dev_queue_xmit status in bpf_xmit. Need to fix this, or instead fixing LWTUNNEL_XMIT_CONTINUE value and correct the behavior at lwtunnel_xmit rather than bpf_xmit. Yan > > > As Dan suggested, packets might not have been freed when this is > > returned from drivers. The caller of dev_queue_xmit might need to free > > skb when this happens. > > > > Yan >