aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-10-12 14:21:56 -0400
committerDavid S. Miller <davem@davemloft.net>2019-10-12 14:21:56 -0400
commit8caf8a91f34d55e8e3b1355ee8d658cb472146e2 (patch)
tree3d3d88878d6c966c854e857dbd8cec701cd3a347 /net
parentf0308fb0708078d6c1d8a4d533941a7a191af634 (diff)
parent106c35dda32f8b63f88cad7433f1b8bb0056958a (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Alexei Starovoitov says: ==================== pull-request: bpf 2019-10-12 The following pull-request contains BPF updates for your *net* tree. The main changes are: 1) a bunch of small fixes. Nothing critical. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/xdp/xsk.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c
index fa8fbb8fa3c8..9044073fbf22 100644
--- a/net/xdp/xsk.c
+++ b/net/xdp/xsk.c
@@ -305,9 +305,8 @@ out:
305} 305}
306EXPORT_SYMBOL(xsk_umem_consume_tx); 306EXPORT_SYMBOL(xsk_umem_consume_tx);
307 307
308static int xsk_zc_xmit(struct sock *sk) 308static int xsk_zc_xmit(struct xdp_sock *xs)
309{ 309{
310 struct xdp_sock *xs = xdp_sk(sk);
311 struct net_device *dev = xs->dev; 310 struct net_device *dev = xs->dev;
312 311
313 return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, 312 return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id,
@@ -327,11 +326,10 @@ static void xsk_destruct_skb(struct sk_buff *skb)
327 sock_wfree(skb); 326 sock_wfree(skb);
328} 327}
329 328
330static int xsk_generic_xmit(struct sock *sk, struct msghdr *m, 329static int xsk_generic_xmit(struct sock *sk)
331 size_t total_len)
332{ 330{
333 u32 max_batch = TX_BATCH_SIZE;
334 struct xdp_sock *xs = xdp_sk(sk); 331 struct xdp_sock *xs = xdp_sk(sk);
332 u32 max_batch = TX_BATCH_SIZE;
335 bool sent_frame = false; 333 bool sent_frame = false;
336 struct xdp_desc desc; 334 struct xdp_desc desc;
337 struct sk_buff *skb; 335 struct sk_buff *skb;
@@ -394,6 +392,18 @@ out:
394 return err; 392 return err;
395} 393}
396 394
395static int __xsk_sendmsg(struct sock *sk)
396{
397 struct xdp_sock *xs = xdp_sk(sk);
398
399 if (unlikely(!(xs->dev->flags & IFF_UP)))
400 return -ENETDOWN;
401 if (unlikely(!xs->tx))
402 return -ENOBUFS;
403
404 return xs->zc ? xsk_zc_xmit(xs) : xsk_generic_xmit(sk);
405}
406
397static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len) 407static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len)
398{ 408{
399 bool need_wait = !(m->msg_flags & MSG_DONTWAIT); 409 bool need_wait = !(m->msg_flags & MSG_DONTWAIT);
@@ -402,21 +412,18 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len)
402 412
403 if (unlikely(!xsk_is_bound(xs))) 413 if (unlikely(!xsk_is_bound(xs)))
404 return -ENXIO; 414 return -ENXIO;
405 if (unlikely(!(xs->dev->flags & IFF_UP))) 415 if (unlikely(need_wait))
406 return -ENETDOWN;
407 if (unlikely(!xs->tx))
408 return -ENOBUFS;
409 if (need_wait)
410 return -EOPNOTSUPP; 416 return -EOPNOTSUPP;
411 417
412 return (xs->zc) ? xsk_zc_xmit(sk) : xsk_generic_xmit(sk, m, total_len); 418 return __xsk_sendmsg(sk);
413} 419}
414 420
415static unsigned int xsk_poll(struct file *file, struct socket *sock, 421static unsigned int xsk_poll(struct file *file, struct socket *sock,
416 struct poll_table_struct *wait) 422 struct poll_table_struct *wait)
417{ 423{
418 unsigned int mask = datagram_poll(file, sock, wait); 424 unsigned int mask = datagram_poll(file, sock, wait);
419 struct xdp_sock *xs = xdp_sk(sock->sk); 425 struct sock *sk = sock->sk;
426 struct xdp_sock *xs = xdp_sk(sk);
420 struct net_device *dev; 427 struct net_device *dev;
421 struct xdp_umem *umem; 428 struct xdp_umem *umem;
422 429
@@ -426,9 +433,14 @@ static unsigned int xsk_poll(struct file *file, struct socket *sock,
426 dev = xs->dev; 433 dev = xs->dev;
427 umem = xs->umem; 434 umem = xs->umem;
428 435
429 if (umem->need_wakeup) 436 if (umem->need_wakeup) {
430 dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, 437 if (dev->netdev_ops->ndo_xsk_wakeup)
431 umem->need_wakeup); 438 dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id,
439 umem->need_wakeup);
440 else
441 /* Poll needs to drive Tx also in copy mode */
442 __xsk_sendmsg(sk);
443 }
432 444
433 if (xs->rx && !xskq_empty_desc(xs->rx)) 445 if (xs->rx && !xskq_empty_desc(xs->rx))
434 mask |= POLLIN | POLLRDNORM; 446 mask |= POLLIN | POLLRDNORM;