@@ -98,10 +98,32 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8_t status)
}
}
+#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
+static void virtio_net_dataplane_status(VirtIONet *n, uint8_t status)
+{
+ if (!!n->dp_start == virtio_net_started(n, status) &&
+ !n->nic->nc.peer->link_down) {
+ return;
+ }
+
+ if (!n->dp_start) {
+ virtnet_dataplane_start(n);
+ n->dp_start = true;
+ } else {
+ virtnet_dataplane_stop(n);
+ n->dp_start = false;
+ }
+}
+#endif
+
static void virtio_net_set_status(struct VirtIODevice *vdev, uint8_t status)
{
VirtIONet *n = to_virtio_net(vdev);
+#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
+ virtio_net_dataplane_status(n, status);
+#endif
+
virtio_net_vhost_status(n, status);
if (!n->tx_waiting) {
@@ -422,6 +444,11 @@ static void virtio_net_handle_rx(VirtIODevice *vdev, VirtQueue *vq)
{
VirtIONet *n = to_virtio_net(vdev);
+#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
+ if (n->dp_start) {
+ return;
+ }
+#endif
qemu_flush_queued_packets(&n->nic->nc);
}
@@ -762,6 +789,11 @@ static void virtio_net_handle_tx_bh(VirtIODevice *vdev, VirtQueue *vq)
{
VirtIONet *n = to_virtio_net(vdev);
+#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
+ if (n->dp_start) {
+ return;
+ }
+#endif
if (unlikely(n->tx_waiting)) {
return;
}
@@ -1034,6 +1066,9 @@ VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf,
add_boot_device_path(conf->bootindex, dev, "/ethernet-phy@0");
+#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
+ virtnet_dataplane_create(n);
+#endif
return &n->vdev;
}
@@ -1060,4 +1095,7 @@ void virtio_net_exit(VirtIODevice *vdev)
qemu_del_net_client(&n->nic->nc);
virtio_cleanup(&n->vdev);
+#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
+ virtnet_dataplane_destroy(n);
+#endif
}
@@ -218,6 +218,9 @@ void virtio_net_cleanup(NetClientState *nc);
#ifdef CONFIG_VIRTIO_NET_DATA_PLANE
void virtnet_dataplane_create(VirtIONet *n);
+void virtnet_dataplane_start(VirtIONet *n);
+void virtnet_dataplane_stop(VirtIONet *n);
+void virtnet_dataplane_destroy(VirtIONet *n);
#endif
#endif
@@ -969,7 +969,7 @@ static TypeInfo virtio_blk_info = {
};
static Property virtio_net_properties[] = {
- DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, false),
+ DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3),
DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features),
DEFINE_NIC_PROPERTIES(VirtIOPCIProxy, nic),