Author: mav
Date: Wed May  6 18:04:31 2015
New Revision: 282563
URL: https://svnweb.freebsd.org/changeset/base/282563

Log:
  Add memory barrier to r281764.
  
  While race at this point may cause only a single packet delay and so was
  not really reproduced, it is better to not have it at all.
  
  MFC after:    1 week

Modified:
  head/usr.sbin/bhyve/pci_virtio_net.c

Modified: head/usr.sbin/bhyve/pci_virtio_net.c
==============================================================================
--- head/usr.sbin/bhyve/pci_virtio_net.c        Wed May  6 17:44:42 2015        
(r282562)
+++ head/usr.sbin/bhyve/pci_virtio_net.c        Wed May  6 18:04:31 2015        
(r282563)
@@ -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>
@@ -453,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];
 
@@ -467,20 +468,16 @@ pci_vtnet_tx_thread(void *param)
 
        for (;;) {
                /* note - tx mutex is locked here */
-               do {
+               while (sc->resetting || !vq_has_descs(vq)) {
                        vq->vq_used->vu_flags &= ~VRING_USED_F_NO_NOTIFY;
-                       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);
+                       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);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to