diff options
Diffstat (limited to 'kernel/bpf/devmap.c')
| -rw-r--r-- | kernel/bpf/devmap.c | 36 | 
1 files changed, 13 insertions, 23 deletions
| diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index f02d04540c0c..fe019dbdb3f0 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -348,7 +348,7 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog,  				frames[nframes++] = xdpf;  			break;  		default: -			bpf_warn_invalid_xdp_action(act); +			bpf_warn_invalid_xdp_action(NULL, xdp_prog, act);  			fallthrough;  		case XDP_ABORTED:  			trace_xdp_exception(dev, xdp_prog, act); @@ -467,24 +467,19 @@ static void bq_enqueue(struct net_device *dev, struct xdp_frame *xdpf,  	bq->q[bq->count++] = xdpf;  } -static inline int __xdp_enqueue(struct net_device *dev, struct xdp_buff *xdp, +static inline int __xdp_enqueue(struct net_device *dev, struct xdp_frame *xdpf,  				struct net_device *dev_rx,  				struct bpf_prog *xdp_prog)  { -	struct xdp_frame *xdpf;  	int err;  	if (!dev->netdev_ops->ndo_xdp_xmit)  		return -EOPNOTSUPP; -	err = xdp_ok_fwd_dev(dev, xdp->data_end - xdp->data); +	err = xdp_ok_fwd_dev(dev, xdpf->len);  	if (unlikely(err))  		return err; -	xdpf = xdp_convert_buff_to_frame(xdp); -	if (unlikely(!xdpf)) -		return -EOVERFLOW; -  	bq_enqueue(dev, xdpf, dev_rx, xdp_prog);  	return 0;  } @@ -507,7 +502,7 @@ static u32 dev_map_bpf_prog_run_skb(struct sk_buff *skb, struct bpf_dtab_netdev  		__skb_push(skb, skb->mac_len);  		break;  	default: -		bpf_warn_invalid_xdp_action(act); +		bpf_warn_invalid_xdp_action(NULL, dst->xdp_prog, act);  		fallthrough;  	case XDP_ABORTED:  		trace_xdp_exception(dst->dev, dst->xdp_prog, act); @@ -520,27 +515,27 @@ static u32 dev_map_bpf_prog_run_skb(struct sk_buff *skb, struct bpf_dtab_netdev  	return act;  } -int dev_xdp_enqueue(struct net_device *dev, struct xdp_buff *xdp, +int dev_xdp_enqueue(struct net_device *dev, struct xdp_frame *xdpf,  		    struct net_device *dev_rx)  { -	return __xdp_enqueue(dev, xdp, dev_rx, NULL); +	return __xdp_enqueue(dev, xdpf, dev_rx, NULL);  } -int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_buff *xdp, +int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_frame *xdpf,  		    struct net_device *dev_rx)  {  	struct net_device *dev = dst->dev; -	return __xdp_enqueue(dev, xdp, dev_rx, dst->xdp_prog); +	return __xdp_enqueue(dev, xdpf, dev_rx, dst->xdp_prog);  } -static bool is_valid_dst(struct bpf_dtab_netdev *obj, struct xdp_buff *xdp) +static bool is_valid_dst(struct bpf_dtab_netdev *obj, struct xdp_frame *xdpf)  {  	if (!obj ||  	    !obj->dev->netdev_ops->ndo_xdp_xmit)  		return false; -	if (xdp_ok_fwd_dev(obj->dev, xdp->data_end - xdp->data)) +	if (xdp_ok_fwd_dev(obj->dev, xdpf->len))  		return false;  	return true; @@ -586,14 +581,13 @@ static int get_upper_ifindexes(struct net_device *dev, int *indexes)  	return n;  } -int dev_map_enqueue_multi(struct xdp_buff *xdp, struct net_device *dev_rx, +int dev_map_enqueue_multi(struct xdp_frame *xdpf, struct net_device *dev_rx,  			  struct bpf_map *map, bool exclude_ingress)  {  	struct bpf_dtab *dtab = container_of(map, struct bpf_dtab, map);  	struct bpf_dtab_netdev *dst, *last_dst = NULL;  	int excluded_devices[1+MAX_NEST_DEV];  	struct hlist_head *head; -	struct xdp_frame *xdpf;  	int num_excluded = 0;  	unsigned int i;  	int err; @@ -603,15 +597,11 @@ int dev_map_enqueue_multi(struct xdp_buff *xdp, struct net_device *dev_rx,  		excluded_devices[num_excluded++] = dev_rx->ifindex;  	} -	xdpf = xdp_convert_buff_to_frame(xdp); -	if (unlikely(!xdpf)) -		return -EOVERFLOW; -  	if (map->map_type == BPF_MAP_TYPE_DEVMAP) {  		for (i = 0; i < map->max_entries; i++) {  			dst = rcu_dereference_check(dtab->netdev_map[i],  						    rcu_read_lock_bh_held()); -			if (!is_valid_dst(dst, xdp)) +			if (!is_valid_dst(dst, xdpf))  				continue;  			if (is_ifindex_excluded(excluded_devices, num_excluded, dst->dev->ifindex)) @@ -634,7 +624,7 @@ int dev_map_enqueue_multi(struct xdp_buff *xdp, struct net_device *dev_rx,  			head = dev_map_index_hash(dtab, i);  			hlist_for_each_entry_rcu(dst, head, index_hlist,  						 lockdep_is_held(&dtab->index_lock)) { -				if (!is_valid_dst(dst, xdp)) +				if (!is_valid_dst(dst, xdpf))  					continue;  				if (is_ifindex_excluded(excluded_devices, num_excluded, |