To restore the device at the destination of a live migration we send the
commands through control virtqueue. For a device to read CVQ it must
have received the DRIVER_OK status bit.
However this opens a window where the device could start receiving
packets in rx queue 0 before it receives the RSS configuration. To
avoid that, we will not send vring_enable until all configuration is
used by the device.
Add vhost-vdpa net vhost_vdpa_should_enable. Do not change the behavior
in this commit, only introduce the op.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
net/vhost-vdpa.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
index 9795306742..3d7dc3e5c0 100644
--- a/net/vhost-vdpa.c
+++ b/net/vhost-vdpa.c
@@ -1255,6 +1255,15 @@ static const VhostShadowVirtqueueOps vhost_vdpa_net_svq_ops = {
.avail_handler = vhost_vdpa_net_handle_ctrl_avail,
};
+static bool vhost_vdpa_should_enable(const struct vhost_vdpa *v)
+{
+ return true;
+}
+
+static const VhostVDPAVirtIOOps vhost_vdpa_virtio_net_ops = {
+ .should_enable = vhost_vdpa_should_enable,
+};
+
/**
* Probe if CVQ is isolated
*
@@ -1378,6 +1387,7 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
s->vhost_vdpa.shadow_vqs_enabled = svq;
s->vhost_vdpa.iova_range = iova_range;
s->vhost_vdpa.shadow_data = svq;
+ s->vhost_vdpa.virtio_ops = &vhost_vdpa_virtio_net_ops;
if (queue_pair_index == 0) {
vhost_vdpa_net_valid_svq_features(features,
&s->vhost_vdpa.migration_blocker);
--
2.39.3