diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 29 | 
1 files changed, 16 insertions, 13 deletions
| diff --git a/net/core/dev.c b/net/core/dev.c index 7df6c9617321..4086d335978c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4690,10 +4690,10 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,  		break;  	default:  		bpf_warn_invalid_xdp_action(act); -		/* fall through */ +		fallthrough;  	case XDP_ABORTED:  		trace_xdp_exception(skb->dev, xdp_prog, act); -		/* fall through */ +		fallthrough;  	case XDP_DROP:  	do_drop:  		kfree_skb(skb); @@ -6612,12 +6612,13 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi,  		netdev_err_once(dev, "%s() called with weight %d\n", __func__,  				weight);  	napi->weight = weight; -	list_add(&napi->dev_list, &dev->napi_list);  	napi->dev = dev;  #ifdef CONFIG_NETPOLL  	napi->poll_owner = -1;  #endif  	set_bit(NAPI_STATE_SCHED, &napi->state); +	set_bit(NAPI_STATE_NPSVC, &napi->state); +	list_add_rcu(&napi->dev_list, &dev->napi_list);  	napi_hash_add(napi);  }  EXPORT_SYMBOL(netif_napi_add); @@ -8742,13 +8743,15 @@ struct bpf_xdp_link {  	int flags;  }; -static enum bpf_xdp_mode dev_xdp_mode(u32 flags) +static enum bpf_xdp_mode dev_xdp_mode(struct net_device *dev, u32 flags)  {  	if (flags & XDP_FLAGS_HW_MODE)  		return XDP_MODE_HW;  	if (flags & XDP_FLAGS_DRV_MODE)  		return XDP_MODE_DRV; -	return XDP_MODE_SKB; +	if (flags & XDP_FLAGS_SKB_MODE) +		return XDP_MODE_SKB; +	return dev->netdev_ops->ndo_bpf ? XDP_MODE_DRV : XDP_MODE_SKB;  }  static bpf_op_t dev_xdp_bpf_op(struct net_device *dev, enum bpf_xdp_mode mode) @@ -8896,7 +8899,7 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack  		return -EINVAL;  	} -	mode = dev_xdp_mode(flags); +	mode = dev_xdp_mode(dev, flags);  	/* can't replace attached link */  	if (dev_xdp_link(dev, mode)) {  		NL_SET_ERR_MSG(extack, "Can't replace active BPF XDP link"); @@ -8913,10 +8916,6 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack  		NL_SET_ERR_MSG(extack, "Active program does not match expected");  		return -EEXIST;  	} -	if ((flags & XDP_FLAGS_UPDATE_IF_NOEXIST) && cur_prog) { -		NL_SET_ERR_MSG(extack, "XDP program already attached"); -		return -EBUSY; -	}  	/* put effective new program into new_prog */  	if (link) @@ -8927,6 +8926,10 @@ static int dev_xdp_attach(struct net_device *dev, struct netlink_ext_ack *extack  		enum bpf_xdp_mode other_mode = mode == XDP_MODE_SKB  					       ? XDP_MODE_DRV : XDP_MODE_SKB; +		if ((flags & XDP_FLAGS_UPDATE_IF_NOEXIST) && cur_prog) { +			NL_SET_ERR_MSG(extack, "XDP program already attached"); +			return -EBUSY; +		}  		if (!offload && dev_xdp_prog(dev, other_mode)) {  			NL_SET_ERR_MSG(extack, "Native and generic XDP can't be active at the same time");  			return -EEXIST; @@ -8984,7 +8987,7 @@ static int dev_xdp_detach_link(struct net_device *dev,  	ASSERT_RTNL(); -	mode = dev_xdp_mode(link->flags); +	mode = dev_xdp_mode(dev, link->flags);  	if (dev_xdp_link(dev, mode) != link)  		return -EINVAL; @@ -9080,7 +9083,7 @@ static int bpf_xdp_link_update(struct bpf_link *link, struct bpf_prog *new_prog,  		goto out_unlock;  	} -	mode = dev_xdp_mode(xdp_link->flags); +	mode = dev_xdp_mode(xdp_link->dev, xdp_link->flags);  	bpf_op = dev_xdp_bpf_op(xdp_link->dev, mode);  	err = dev_xdp_install(xdp_link->dev, mode, bpf_op, NULL,  			      xdp_link->flags, new_prog); @@ -9164,7 +9167,7 @@ out_put_dev:  int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,  		      int fd, int expected_fd, u32 flags)  { -	enum bpf_xdp_mode mode = dev_xdp_mode(flags); +	enum bpf_xdp_mode mode = dev_xdp_mode(dev, flags);  	struct bpf_prog *new_prog = NULL, *old_prog = NULL;  	int err; |