diff options
| author | David S. Miller <davem@davemloft.net> | 2019-10-12 14:21:56 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-10-12 14:21:56 -0400 |
| commit | 8caf8a91f34d55e8e3b1355ee8d658cb472146e2 (patch) | |
| tree | 3d3d88878d6c966c854e857dbd8cec701cd3a347 /net | |
| parent | f0308fb0708078d6c1d8a4d533941a7a191af634 (diff) | |
| parent | 106c35dda32f8b63f88cad7433f1b8bb0056958a (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.c | 42 |
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 | } |
| 306 | EXPORT_SYMBOL(xsk_umem_consume_tx); | 306 | EXPORT_SYMBOL(xsk_umem_consume_tx); |
| 307 | 307 | ||
| 308 | static int xsk_zc_xmit(struct sock *sk) | 308 | static 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 | ||
| 330 | static int xsk_generic_xmit(struct sock *sk, struct msghdr *m, | 329 | static 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 | ||
| 395 | static 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 | |||
| 397 | static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len) | 407 | static 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 | ||
| 415 | static unsigned int xsk_poll(struct file *file, struct socket *sock, | 421 | static 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; |
