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 <[email protected]> --- net/vhost-vdpa.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c index e19ab063fa..536bab8613 100644 --- a/net/vhost-vdpa.c +++ b/net/vhost-vdpa.c @@ -826,6 +826,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 * @@ -949,6 +958,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
