[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH v8 12/21] vdpa: delay set_vring_ready after DRIVER_OK
From: |
Eugenio Perez Martin |
Subject: |
Re: [RFC PATCH v8 12/21] vdpa: delay set_vring_ready after DRIVER_OK |
Date: |
Wed, 8 Jun 2022 21:06:19 +0200 |
On Wed, Jun 8, 2022 at 6:21 AM Jason Wang <jasowang@redhat.com> wrote:
>
>
> 在 2022/5/20 03:12, Eugenio Pérez 写道:
> > To restore the device in the destination of a live migration we send the
> > commands through control virtqueue. For a device to read CVQ it must
> > have received DRIVER_OK status bit.
> >
> > However this open a window where the device could start receiving
> > packets in rx queue 0 before it receive the RSS configuration. To avoid
> > that, we will not send vring_enable until all configuration is used by
> > the device.
> >
> > As a first step, reverse the DRIVER_OK and SET_VRING_ENABLE steps.
> >
> > Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
>
>
> I may miss something, but it looks to me this should be an independent
> patch or it should depend on live migration series.
>
With x-svq it's possible to migrate a VM, because we don't need to
stop the device: VMM always knows the vq state to program in the
destination (assuming no need for inflight etc).
But it will have better context in the next series for sure.
Thanks!
> Thanks
>
>
> > ---
> > hw/virtio/vhost-vdpa.c | 20 +++++++++++++++-----
> > 1 file changed, 15 insertions(+), 5 deletions(-)
> >
> > diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
> > index 31b3d4d013..13e5e2a061 100644
> > --- a/hw/virtio/vhost-vdpa.c
> > +++ b/hw/virtio/vhost-vdpa.c
> > @@ -748,13 +748,18 @@ static int vhost_vdpa_get_vq_index(struct vhost_dev
> > *dev, int idx)
> > return idx;
> > }
> >
> > +/**
> > + * Set ready all vring of the device
> > + *
> > + * @dev: Vhost device
> > + */
> > static int vhost_vdpa_set_vring_ready(struct vhost_dev *dev)
> > {
> > int i;
> > trace_vhost_vdpa_set_vring_ready(dev);
> > - for (i = 0; i < dev->nvqs; ++i) {
> > + for (i = 0; i < dev->vq_index_end; ++i) {
> > struct vhost_vring_state state = {
> > - .index = dev->vq_index + i,
> > + .index = i,
> > .num = 1,
> > };
> > vhost_vdpa_call(dev, VHOST_VDPA_SET_VRING_ENABLE, &state);
> > @@ -1117,7 +1122,6 @@ static int vhost_vdpa_dev_start(struct vhost_dev
> > *dev, bool started)
> > if (unlikely(!ok)) {
> > return -1;
> > }
> > - vhost_vdpa_set_vring_ready(dev);
> > } else {
> > ok = vhost_vdpa_svqs_stop(dev);
> > if (unlikely(!ok)) {
> > @@ -1131,16 +1135,22 @@ static int vhost_vdpa_dev_start(struct vhost_dev
> > *dev, bool started)
> > }
> >
> > if (started) {
> > + int r;
> > memory_listener_register(&v->listener, &address_space_memory);
> > - return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
> > + r = vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
> > + if (unlikely(r)) {
> > + return r;
> > + }
> > + vhost_vdpa_set_vring_ready(dev);
> > } else {
> > vhost_vdpa_reset_device(dev);
> > vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
> > VIRTIO_CONFIG_S_DRIVER);
> > memory_listener_unregister(&v->listener);
> >
> > - return 0;
> > }
> > +
> > + return 0;
> > }
> >
> > static int vhost_vdpa_set_log_base(struct vhost_dev *dev, uint64_t base,
>