diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 66 | 
1 files changed, 14 insertions, 52 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index b6b8505cfb3e..140858d4a048 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1,11 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0-or-later  /*   *      NET3    Protocol independent device support routines.   * - *		This program is free software; you can redistribute it and/or - *		modify it under the terms of the GNU General Public License - *		as published by the Free Software Foundation; either version - *		2 of the License, or (at your option) any later version. - *   *	Derived from the non IP parts of dev.c 1.0.19   *              Authors:	Ross Biro   *				Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> @@ -4502,23 +4498,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; @@ -4858,6 +4837,18 @@ another_round:  	__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); @@ -5178,19 +5169,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)) { @@ -5211,7 +5189,6 @@ static int netif_receive_skb_internal(struct sk_buff *skb)  static void netif_receive_skb_list_internal(struct list_head *head)  { -	struct bpf_prog *xdp_prog = NULL;  	struct sk_buff *skb, *next;  	struct list_head sublist; @@ -5224,21 +5201,6 @@ static void netif_receive_skb_list_internal(struct list_head *head)  	}  	list_splice_init(&sublist, head); -	if (static_branch_unlikely(&generic_xdp_needed_key)) { -		preempt_disable(); -		rcu_read_lock(); -		list_for_each_entry_safe(skb, next, head, list) { -			xdp_prog = rcu_dereference(skb->dev->xdp_prog); -			skb_list_del_init(skb); -			if (do_xdp_generic(xdp_prog, skb) == XDP_PASS) -				list_add_tail(&skb->list, &sublist); -		} -		rcu_read_unlock(); -		preempt_enable(); -		/* Put passed packets back on main list */ -		list_splice_init(&sublist, head); -	} -  	rcu_read_lock();  #ifdef CONFIG_RPS  	if (static_branch_unlikely(&rps_needed)) { @@ -5809,7 +5771,6 @@ static struct sk_buff *napi_frags_skb(struct napi_struct *napi)  	skb_reset_mac_header(skb);  	skb_gro_reset_offset(skb); -	eth = skb_gro_header_fast(skb, 0);  	if (unlikely(skb_gro_header_hard(skb, hlen))) {  		eth = skb_gro_header_slow(skb, hlen, 0);  		if (unlikely(!eth)) { @@ -5819,6 +5780,7 @@ static struct sk_buff *napi_frags_skb(struct napi_struct *napi)  			return NULL;  		}  	} else { +		eth = (const struct ethhdr *)skb->data;  		gro_pull_from_frag0(skb, hlen);  		NAPI_GRO_CB(skb)->frag0 += hlen;  		NAPI_GRO_CB(skb)->frag0_len -= hlen;  | 
