svn commit: r349704 - stable/11/usr.sbin/bhyve
Vincenzo Maffione
vmaffione at FreeBSD.org
Wed Jul 3 20:22:38 UTC 2019
Author: vmaffione
Date: Wed Jul 3 20:22:36 2019
New Revision: 349704
URL: https://svnweb.freebsd.org/changeset/base/349704
Log:
MFC r348929
bhyve: virtio: introduce vq_kick_enable() and vq_kick_disable()
The VirtIO standard supports two schemes for notification suppression:
a notification enable bit and a more sophisticated one (event_idx) that
also supports delayed notifications. Currently bhyve fully supports
only the first scheme. This patch hides the notification suppression
internals by means of two inline routines, vq_kick_enable() and
vq_kick_disable(), and makes the code more readable.
Moreover, further improve readability by replacing the call to mb()
with a call to atomic_thread_fence_seq_cst(), which is already used
in virtio.c
Reviewed by: pmooney_pfmooney.com, bryanv
Differential Revision: https://reviews.freebsd.org/D20581
Modified:
stable/11/usr.sbin/bhyve/pci_virtio_console.c
stable/11/usr.sbin/bhyve/pci_virtio_net.c
stable/11/usr.sbin/bhyve/virtio.c
stable/11/usr.sbin/bhyve/virtio.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/usr.sbin/bhyve/pci_virtio_console.c
==============================================================================
--- stable/11/usr.sbin/bhyve/pci_virtio_console.c Wed Jul 3 20:18:49 2019 (r349703)
+++ stable/11/usr.sbin/bhyve/pci_virtio_console.c Wed Jul 3 20:22:36 2019 (r349704)
@@ -581,7 +581,7 @@ pci_vtcon_notify_rx(void *vsc, struct vqueue_info *vq)
if (!port->vsp_rx_ready) {
port->vsp_rx_ready = 1;
- vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
+ vq_kick_disable(vq);
}
}
Modified: stable/11/usr.sbin/bhyve/pci_virtio_net.c
==============================================================================
--- stable/11/usr.sbin/bhyve/pci_virtio_net.c Wed Jul 3 20:18:49 2019 (r349703)
+++ stable/11/usr.sbin/bhyve/pci_virtio_net.c Wed Jul 3 20:22:36 2019 (r349704)
@@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
#include <sys/select.h>
#include <sys/uio.h>
#include <sys/ioctl.h>
-#include <machine/atomic.h>
#include <net/ethernet.h>
#ifndef NETMAP_WITH_LIBS
#define NETMAP_WITH_LIBS
@@ -582,7 +581,7 @@ pci_vtnet_ping_rxq(void *vsc, struct vqueue_info *vq)
*/
if (sc->vsc_rx_ready == 0) {
sc->vsc_rx_ready = 1;
- vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
+ vq_kick_disable(vq);
}
}
@@ -628,7 +627,7 @@ pci_vtnet_ping_txq(void *vsc, struct vqueue_info *vq)
/* Signal the tx thread for processing */
pthread_mutex_lock(&sc->tx_mtx);
- vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
+ vq_kick_disable(vq);
if (sc->tx_in_progress == 0)
pthread_cond_signal(&sc->tx_cond);
pthread_mutex_unlock(&sc->tx_mtx);
@@ -657,8 +656,7 @@ pci_vtnet_tx_thread(void *param)
for (;;) {
/* note - tx mutex is locked here */
while (sc->resetting || !vq_has_descs(vq)) {
- vq->vq_used->vu_flags &= ~VRING_USED_F_NO_NOTIFY;
- mb();
+ vq_kick_enable(vq);
if (!sc->resetting && vq_has_descs(vq))
break;
@@ -666,7 +664,7 @@ pci_vtnet_tx_thread(void *param)
error = pthread_cond_wait(&sc->tx_cond, &sc->tx_mtx);
assert(error == 0);
}
- vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
+ vq_kick_disable(vq);
sc->tx_in_progress = 1;
pthread_mutex_unlock(&sc->tx_mtx);
Modified: stable/11/usr.sbin/bhyve/virtio.c
==============================================================================
--- stable/11/usr.sbin/bhyve/virtio.c Wed Jul 3 20:18:49 2019 (r349703)
+++ stable/11/usr.sbin/bhyve/virtio.c Wed Jul 3 20:22:36 2019 (r349704)
@@ -428,7 +428,8 @@ vq_relchain(struct vqueue_info *vq, uint16_t idx, uint
/*
* Ensure the used descriptor is visible before updating the index.
- * This is necessary on ISAs with memory ordering less strict than x86.
+ * This is necessary on ISAs with memory ordering less strict than x86
+ * (and even on x86 to act as a compiler barrier).
*/
atomic_thread_fence_rel();
vuh->vu_idx = uidx;
Modified: stable/11/usr.sbin/bhyve/virtio.h
==============================================================================
--- stable/11/usr.sbin/bhyve/virtio.h Wed Jul 3 20:18:49 2019 (r349703)
+++ stable/11/usr.sbin/bhyve/virtio.h Wed Jul 3 20:22:36 2019 (r349704)
@@ -31,6 +31,8 @@
#ifndef _VIRTIO_H_
#define _VIRTIO_H_
+#include <machine/atomic.h>
+
/*
* These are derived from several virtio specifications.
*
@@ -444,6 +446,26 @@ vq_interrupt(struct virtio_softc *vs, struct vqueue_in
pci_lintr_assert(vs->vs_pi);
VS_UNLOCK(vs);
}
+}
+
+static inline void
+vq_kick_enable(struct vqueue_info *vq)
+{
+
+ vq->vq_used->vu_flags &= ~VRING_USED_F_NO_NOTIFY;
+ /*
+ * Full memory barrier to make sure the store to vu_flags
+ * happens before the load from va_idx, which results from
+ * a subsequent call to vq_has_descs().
+ */
+ atomic_thread_fence_seq_cst();
+}
+
+static inline void
+vq_kick_disable(struct vqueue_info *vq)
+{
+
+ vq->vq_used->vu_flags |= VRING_USED_F_NO_NOTIFY;
}
struct iovec;
More information about the svn-src-all
mailing list