On Tue, Jul 17, 2018 at 2:16 AM Paolo Abeni <pab...@redhat.com> wrote: > > Hi, > > On Mon, 2018-07-16 at 16:39 -0700, Cong Wang wrote: > > On Fri, Jul 13, 2018 at 2:55 AM Paolo Abeni <pab...@redhat.com> wrote: > > > > > > When mirred is invoked from the ingress path, and it wants to redirect > > > the processed packet, it can now use the ACT_REDIRECT action, > > > filling the tcf_result accordingly. > > > > > > This avoids a skb_clone() in the TC S/W data path giving a ~10% > > > improvement in forwarding performances. Overall TC S/W performances > > > are now comparable to the kernel openswitch datapath. > > Thank you for the feedback. > > > Avoiding skb_clone() for redirection is cool, but why need to use > > skb_do_redirect() here? > > Well, it's not needed. I tried to reduce code duplication, and I tried > to avoid adding another TC_ACT_* value.
If you consider dev_forward_skb(), it is not a duplication. > > > There is a subtle difference here: > > > > skb_do_redirect() calls __bpf_rx_skb() which calls > > dev_forward_skb(). > > > > while the current mirred action doesn't scrub packets when > > redirecting to ingress (from egress). Although I forget if it is > > intentionally. > > Understood. > > A possible option out of this issues would be adding another action > value - TC_ACT_MIRRED ? - and handle it in sch_handle_egress()[1] with > the appropriate semantic. That should address also Daniel and Eyal > concerns. > > Would you consider the above acceptable? If you goal is to get rid of skb_clone(), why not just do the following? if (tcf_mirred_is_act_redirect(m_eaction)) { skb2 = skb; } else { skb2 = skb_clone(skb, GFP_ATOMIC); if (!skb2) goto out; } For redirect, we return TC_ACT_SHOT, so upper layer should not touch the skb after that. What am I missing here?