Message ID | 20190613202401.1628-4-ioanna-maria.alifieraki@canonical.com |
---|---|
State | New |
Headers | show |
Series | azure XDP generic fixes - option 2 | expand |
On 6/13/19 1:24 PM, Ioanna Alifieraki wrote: > From: Stephen Hemminger <stephen@networkplumber.org> > > BugLink: https://bugs.launchpad.net/bugs/1831254 > > When a device is stacked like (team, bonding, failsafe or netvsc) the > XDP generic program for the parent device was not called. > > Move the call to XDP generic inside __netif_receive_skb_core where > it can be done multiple times for stacked case. > > Fixes: d445516966dc ("net: xdp: support xdp generic on virtual devices") > Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> > Signed-off-by: David S. Miller <davem@davemloft.net> > (backported from commit 458bf2f224f04a513b0be972f8708e78ee2c986e) > [Hunks 4 and 5 in oringinal commit modify netif_receive_skb_list_internal > function which is not present, so do not remove them.] Should this say "so remove them" instead of "so do not remove them"? > Signed-off-by: Ioanna Alifieraki <ioanna-maria.alifieraki@canonical.com> > --- > net/core/dev.c | 42 ++++++++++++------------------------------ > 1 file changed, 12 insertions(+), 30 deletions(-) > > diff --git a/net/core/dev.c b/net/core/dev.c > index 99f62b724d6e..901b558cce5c 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -4198,23 +4198,6 @@ static int netif_rx_internal(struct sk_buff *skb) > > trace_netif_rx(skb); > > - if (static_branch_unlikely(&generic_xdp_needed_key)) { > - int ret; > - > - preempt_disable(); > - rcu_read_lock(); > - ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); > - rcu_read_unlock(); > - preempt_enable(); > - > - /* Consider XDP consuming the packet a success from > - * the netdev point of view we do not want to count > - * this as an error. > - */ > - if (ret != XDP_PASS) > - return NET_RX_SUCCESS; > - } > - > #ifdef CONFIG_RPS > if (static_branch_unlikely(&rps_needed)) { > struct rps_dev_flow voidflow, *rflow = &voidflow; > @@ -4543,6 +4526,18 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) > > __this_cpu_inc(softnet_data.processed); > > + if (static_branch_unlikely(&generic_xdp_needed_key)) { > + int ret2; > + > + preempt_disable(); > + ret2 = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); > + preempt_enable(); > + > + if (ret2 != XDP_PASS) > + return NET_RX_DROP; > + skb_reset_mac_len(skb); > + } > + > if (skb->protocol == cpu_to_be16(ETH_P_8021Q) || > skb->protocol == cpu_to_be16(ETH_P_8021AD)) { > skb = skb_vlan_untag(skb); > @@ -4760,19 +4755,6 @@ static int netif_receive_skb_internal(struct sk_buff *skb) > if (skb_defer_rx_timestamp(skb)) > return NET_RX_SUCCESS; > > - if (static_branch_unlikely(&generic_xdp_needed_key)) { > - int ret; > - > - preempt_disable(); > - rcu_read_lock(); > - ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); > - rcu_read_unlock(); > - preempt_enable(); > - > - if (ret != XDP_PASS) > - return NET_RX_DROP; > - } > - > rcu_read_lock(); > #ifdef CONFIG_RPS > if (static_branch_unlikely(&rps_needed)) { >
diff --git a/net/core/dev.c b/net/core/dev.c index 99f62b724d6e..901b558cce5c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4198,23 +4198,6 @@ static int netif_rx_internal(struct sk_buff *skb) trace_netif_rx(skb); - if (static_branch_unlikely(&generic_xdp_needed_key)) { - int ret; - - preempt_disable(); - rcu_read_lock(); - ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); - rcu_read_unlock(); - preempt_enable(); - - /* Consider XDP consuming the packet a success from - * the netdev point of view we do not want to count - * this as an error. - */ - if (ret != XDP_PASS) - return NET_RX_SUCCESS; - } - #ifdef CONFIG_RPS if (static_branch_unlikely(&rps_needed)) { struct rps_dev_flow voidflow, *rflow = &voidflow; @@ -4543,6 +4526,18 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) __this_cpu_inc(softnet_data.processed); + if (static_branch_unlikely(&generic_xdp_needed_key)) { + int ret2; + + preempt_disable(); + ret2 = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); + preempt_enable(); + + if (ret2 != XDP_PASS) + return NET_RX_DROP; + skb_reset_mac_len(skb); + } + if (skb->protocol == cpu_to_be16(ETH_P_8021Q) || skb->protocol == cpu_to_be16(ETH_P_8021AD)) { skb = skb_vlan_untag(skb); @@ -4760,19 +4755,6 @@ static int netif_receive_skb_internal(struct sk_buff *skb) if (skb_defer_rx_timestamp(skb)) return NET_RX_SUCCESS; - if (static_branch_unlikely(&generic_xdp_needed_key)) { - int ret; - - preempt_disable(); - rcu_read_lock(); - ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); - rcu_read_unlock(); - preempt_enable(); - - if (ret != XDP_PASS) - return NET_RX_DROP; - } - rcu_read_lock(); #ifdef CONFIG_RPS if (static_branch_unlikely(&rps_needed)) {