23
23
#include <linux/netdevice.h>
24
24
#include <linux/rculist.h>
25
25
#include <net/xdp_sock_drv.h>
26
+ #include <net/busy_poll.h>
26
27
#include <net/xdp.h>
27
28
28
29
#include "xsk_queue.h"
@@ -517,6 +518,17 @@ static int __xsk_sendmsg(struct sock *sk)
517
518
return xs -> zc ? xsk_zc_xmit (xs ) : xsk_generic_xmit (sk );
518
519
}
519
520
521
+ static bool xsk_no_wakeup (struct sock * sk )
522
+ {
523
+ #ifdef CONFIG_NET_RX_BUSY_POLL
524
+ /* Prefer busy-polling, skip the wakeup. */
525
+ return READ_ONCE (sk -> sk_prefer_busy_poll ) && READ_ONCE (sk -> sk_ll_usec ) &&
526
+ READ_ONCE (sk -> sk_napi_id ) >= MIN_NAPI_ID ;
527
+ #else
528
+ return false;
529
+ #endif
530
+ }
531
+
520
532
static int xsk_sendmsg (struct socket * sock , struct msghdr * m , size_t total_len )
521
533
{
522
534
bool need_wait = !(m -> msg_flags & MSG_DONTWAIT );
@@ -529,6 +541,12 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len)
529
541
if (unlikely (need_wait ))
530
542
return - EOPNOTSUPP ;
531
543
544
+ if (sk_can_busy_loop (sk ))
545
+ sk_busy_loop (sk , 1 ); /* only support non-blocking sockets */
546
+
547
+ if (xsk_no_wakeup (sk ))
548
+ return 0 ;
549
+
532
550
pool = xs -> pool ;
533
551
if (pool -> cached_need_wakeup & XDP_WAKEUP_TX )
534
552
return __xsk_sendmsg (sk );
@@ -550,6 +568,12 @@ static int xsk_recvmsg(struct socket *sock, struct msghdr *m, size_t len, int fl
550
568
if (unlikely (need_wait ))
551
569
return - EOPNOTSUPP ;
552
570
571
+ if (sk_can_busy_loop (sk ))
572
+ sk_busy_loop (sk , 1 ); /* only support non-blocking sockets */
573
+
574
+ if (xsk_no_wakeup (sk ))
575
+ return 0 ;
576
+
553
577
if (xs -> pool -> cached_need_wakeup & XDP_WAKEUP_RX && xs -> zc )
554
578
return xsk_wakeup (xs , XDP_WAKEUP_RX );
555
579
return 0 ;
0 commit comments