On Tue, Dec 19, 2023 at 7:09 PM Dragos Tatulea <dtatulea@xxxxxxxxxx> wrote: > > Virtqueue address change during DRIVE_OK is not supported by the virtio > standard. Allow this op in DRIVER_OK only for devices that support > changing the address during DRIVER_OK if the device is suspended. > > Signed-off-by: Dragos Tatulea <dtatulea@xxxxxxxxxx> > Suggested-by: Eugenio Pérez <eperezma@xxxxxxxxxx> Acked-by: Eugenio Pérez <eperezma@xxxxxxxxxx> > --- > drivers/vhost/vdpa.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c > index 00b4fa8e89f2..6bfa3391935a 100644 > --- a/drivers/vhost/vdpa.c > +++ b/drivers/vhost/vdpa.c > @@ -625,6 +625,29 @@ static long vhost_vdpa_resume(struct vhost_vdpa *v) > return ret; > } > > +static bool vhost_vdpa_vq_config_allowed(struct vhost_vdpa *v, unsigned int cmd) > +{ > + struct vdpa_device *vdpa = v->vdpa; > + const struct vdpa_config_ops *ops = vdpa->config; > + int feature; > + > + if (!(ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK)) > + return true; > + > + if (!v->suspended) > + return false; > + > + switch (cmd) { > + case VHOST_SET_VRING_ADDR: > + feature = VHOST_BACKEND_F_CHANGEABLE_VQ_ADDR_IN_SUSPEND; > + break; > + default: > + return false; > + } > + > + return v->vdev.vqs && vhost_backend_has_feature(v->vdev.vqs[0], feature); > +} > + > static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, > void __user *argp) > { > @@ -703,6 +726,9 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd, > > switch (cmd) { > case VHOST_SET_VRING_ADDR: > + if (!vhost_vdpa_vq_config_allowed(v, cmd)) > + return -EOPNOTSUPP; > + > if (ops->set_vq_address(vdpa, idx, > (u64)(uintptr_t)vq->desc, > (u64)(uintptr_t)vq->avail, > -- > 2.43.0 >