diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/xdp/xsk.c | 22 | 
1 files changed, 14 insertions, 8 deletions
| diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 956793893c9d..328f661b83b2 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -334,12 +334,21 @@ out:  }  EXPORT_SYMBOL(xsk_umem_consume_tx); -static int xsk_zc_xmit(struct xdp_sock *xs) +static int xsk_wakeup(struct xdp_sock *xs, u8 flags)  {  	struct net_device *dev = xs->dev; +	int err; + +	rcu_read_lock(); +	err = dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, flags); +	rcu_read_unlock(); + +	return err; +} -	return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, -					       XDP_WAKEUP_TX); +static int xsk_zc_xmit(struct xdp_sock *xs) +{ +	return xsk_wakeup(xs, XDP_WAKEUP_TX);  }  static void xsk_destruct_skb(struct sk_buff *skb) @@ -453,19 +462,16 @@ static __poll_t xsk_poll(struct file *file, struct socket *sock,  	__poll_t mask = datagram_poll(file, sock, wait);  	struct sock *sk = sock->sk;  	struct xdp_sock *xs = xdp_sk(sk); -	struct net_device *dev;  	struct xdp_umem *umem;  	if (unlikely(!xsk_is_bound(xs)))  		return mask; -	dev = xs->dev;  	umem = xs->umem;  	if (umem->need_wakeup) { -		if (dev->netdev_ops->ndo_xsk_wakeup) -			dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, -							umem->need_wakeup); +		if (xs->zc) +			xsk_wakeup(xs, umem->need_wakeup);  		else  			/* Poll needs to drive Tx also in copy mode */  			__xsk_sendmsg(sk); | 
