Messages in this thread Patch in this message | | | From | Dragos Tatulea <> | Subject | [PATCH vhost v4 07/15] vdpa: Block vq address change in DRIVER_OK unless device supports it | Date | Tue, 19 Dec 2023 20:08:50 +0200 |
| |
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@nvidia.com> Suggested-by: Eugenio Pérez <eperezma@redhat.com> --- 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
| |