Author: mav
Date: Wed May 13 10:18:44 2015
New Revision: 282839
URL: https://svnweb.freebsd.org/changeset/base/282839

Log:
  MFC r281764, r282563: Disable RX/TX queues notifications when not needed.
  
  This reduces CPU load and doubles iperf throughput, reaching 2-3Gbit/s.
  
  Sponsored by: iXsystems, Inc.

Modified:
  stable/10/usr.sbin/bhyve/pci_virtio_net.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/bhyve/pci_virtio_net.c
==============================================================================
--- stable/10/usr.sbin/bhyve/pci_virtio_net.c   Wed May 13 10:17:34 2015        
(r282838)
+++ stable/10/usr.sbin/bhyve/pci_virtio_net.c   Wed May 13 10:18:44 2015        
(r282839)
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/select.h>
 #include <sys/uio.h>
 #include <sys/ioctl.h>
+#include <machine/atomic.h>
 #include <net/ethernet.h>
 
 #include <errno.h>
@@ -393,6 +394,7 @@ pci_vtnet_ping_rxq(void *vsc, struct vqu
         */
        if (sc->vsc_rx_ready == 0) {
                sc->vsc_rx_ready = 1;
+               vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
        }
 }
 
@@ -438,6 +440,7 @@ pci_vtnet_ping_txq(void *vsc, struct vqu
 
        /* Signal the tx thread for processing */
        pthread_mutex_lock(&sc->tx_mtx);
+       vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
        if (sc->tx_in_progress == 0)
                pthread_cond_signal(&sc->tx_cond);
        pthread_mutex_unlock(&sc->tx_mtx);
@@ -451,7 +454,7 @@ pci_vtnet_tx_thread(void *param)
 {
        struct pci_vtnet_softc *sc = param;
        struct vqueue_info *vq;
-       int have_work, error;
+       int error;
 
        vq = &sc->vsc_queues[VTNET_TXQ];
 
@@ -465,19 +468,17 @@ pci_vtnet_tx_thread(void *param)
 
        for (;;) {
                /* note - tx mutex is locked here */
-               do {
-                       if (sc->resetting)
-                               have_work = 0;
-                       else
-                               have_work = vq_has_descs(vq);
-
-                       if (!have_work) {
-                               sc->tx_in_progress = 0;
-                               error = pthread_cond_wait(&sc->tx_cond,
-                                                         &sc->tx_mtx);
-                               assert(error == 0);
-                       }
-               } while (!have_work);
+               while (sc->resetting || !vq_has_descs(vq)) {
+                       vq->vq_used->vu_flags &= ~VRING_USED_F_NO_NOTIFY;
+                       mb();
+                       if (!sc->resetting && vq_has_descs(vq))
+                               break;
+
+                       sc->tx_in_progress = 0;
+                       error = pthread_cond_wait(&sc->tx_cond, &sc->tx_mtx);
+                       assert(error == 0);
+               }
+               vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
                sc->tx_in_progress = 1;
                pthread_mutex_unlock(&sc->tx_mtx);
 
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to