Message ID | 985e7facb121059d06631a9688e93d11e453795c.1662949366.git.kangjie.xu@linux.alibaba.com |
---|---|
State | New |
Headers | show |
Series | Support VIRTIO_F_RING_RESET for vhost-user in virtio pci-modern | expand |
在 2022/9/12 11:10, Kangjie Xu 写道: > There is only vhost_set_dev_enable op in VhostOps. Thus, we introduce > the interface vhost_set_vring_enable to set the enable status for a > single vring. > > Resetting a single vq will rely on this interface. > > Signed-off-by: Kangjie Xu <kangjie.xu@linux.alibaba.com> > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> > --- > hw/virtio/vhost-user.c | 25 ++++++++++++++++++------- > include/hw/virtio/vhost-backend.h | 3 +++ > 2 files changed, 21 insertions(+), 7 deletions(-) > > diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c > index 794519359b..3f140d5085 100644 > --- a/hw/virtio/vhost-user.c > +++ b/hw/virtio/vhost-user.c > @@ -1198,6 +1198,22 @@ static int vhost_user_set_vring_base(struct vhost_dev *dev, > return vhost_set_vring(dev, VHOST_USER_SET_VRING_BASE, ring); > } > > +static int vhost_user_set_vring_enable(struct vhost_dev *dev, > + int index, > + int enable) > +{ > + if (index < dev->vq_index || index >= dev->vq_index + dev->nvqs) { > + return -EINVAL; > + } > + > + struct vhost_vring_state state = { > + .index = index, > + .num = enable, > + }; > + > + return vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state); > +} > + > static int vhost_user_set_dev_enable(struct vhost_dev *dev, int enable) > { > int i; > @@ -1207,13 +1223,7 @@ static int vhost_user_set_dev_enable(struct vhost_dev *dev, int enable) > } > > for (i = 0; i < dev->nvqs; ++i) { > - int ret; > - struct vhost_vring_state state = { > - .index = dev->vq_index + i, > - .num = enable, > - }; > - > - ret = vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state); > + int ret = vhost_user_set_vring_enable(dev, dev->vq_index + i, enable); > if (ret < 0) { > /* > * Restoring the previous state is likely infeasible, as well as > @@ -2627,6 +2637,7 @@ const VhostOps user_ops = { > .vhost_set_owner = vhost_user_set_owner, > .vhost_reset_device = vhost_user_reset_device, > .vhost_get_vq_index = vhost_user_get_vq_index, > + .vhost_set_vring_enable = vhost_user_set_vring_enable, > .vhost_set_dev_enable = vhost_user_set_dev_enable, > .vhost_requires_shm_log = vhost_user_requires_shm_log, > .vhost_migration_done = vhost_user_migration_done, > diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-backend.h > index b49432045f..dad7191bac 100644 > --- a/include/hw/virtio/vhost-backend.h > +++ b/include/hw/virtio/vhost-backend.h > @@ -81,6 +81,8 @@ typedef int (*vhost_set_backend_cap_op)(struct vhost_dev *dev); > typedef int (*vhost_set_owner_op)(struct vhost_dev *dev); > typedef int (*vhost_reset_device_op)(struct vhost_dev *dev); > typedef int (*vhost_get_vq_index_op)(struct vhost_dev *dev, int idx); > +typedef int (*vhost_set_vring_enable_op)(struct vhost_dev *dev, > + int index, int enable); > typedef int (*vhost_set_dev_enable_op)(struct vhost_dev *dev, > int enable); > typedef bool (*vhost_requires_shm_log_op)(struct vhost_dev *dev); > @@ -155,6 +157,7 @@ typedef struct VhostOps { > vhost_set_owner_op vhost_set_owner; > vhost_reset_device_op vhost_reset_device; > vhost_get_vq_index_op vhost_get_vq_index; > + vhost_set_vring_enable_op vhost_set_vring_enable; > vhost_set_dev_enable_op vhost_set_dev_enable; > vhost_requires_shm_log_op vhost_requires_shm_log; > vhost_migration_done_op vhost_migration_done;
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 794519359b..3f140d5085 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -1198,6 +1198,22 @@ static int vhost_user_set_vring_base(struct vhost_dev *dev, return vhost_set_vring(dev, VHOST_USER_SET_VRING_BASE, ring); } +static int vhost_user_set_vring_enable(struct vhost_dev *dev, + int index, + int enable) +{ + if (index < dev->vq_index || index >= dev->vq_index + dev->nvqs) { + return -EINVAL; + } + + struct vhost_vring_state state = { + .index = index, + .num = enable, + }; + + return vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state); +} + static int vhost_user_set_dev_enable(struct vhost_dev *dev, int enable) { int i; @@ -1207,13 +1223,7 @@ static int vhost_user_set_dev_enable(struct vhost_dev *dev, int enable) } for (i = 0; i < dev->nvqs; ++i) { - int ret; - struct vhost_vring_state state = { - .index = dev->vq_index + i, - .num = enable, - }; - - ret = vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state); + int ret = vhost_user_set_vring_enable(dev, dev->vq_index + i, enable); if (ret < 0) { /* * Restoring the previous state is likely infeasible, as well as @@ -2627,6 +2637,7 @@ const VhostOps user_ops = { .vhost_set_owner = vhost_user_set_owner, .vhost_reset_device = vhost_user_reset_device, .vhost_get_vq_index = vhost_user_get_vq_index, + .vhost_set_vring_enable = vhost_user_set_vring_enable, .vhost_set_dev_enable = vhost_user_set_dev_enable, .vhost_requires_shm_log = vhost_user_requires_shm_log, .vhost_migration_done = vhost_user_migration_done, diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-backend.h index b49432045f..dad7191bac 100644 --- a/include/hw/virtio/vhost-backend.h +++ b/include/hw/virtio/vhost-backend.h @@ -81,6 +81,8 @@ typedef int (*vhost_set_backend_cap_op)(struct vhost_dev *dev); typedef int (*vhost_set_owner_op)(struct vhost_dev *dev); typedef int (*vhost_reset_device_op)(struct vhost_dev *dev); typedef int (*vhost_get_vq_index_op)(struct vhost_dev *dev, int idx); +typedef int (*vhost_set_vring_enable_op)(struct vhost_dev *dev, + int index, int enable); typedef int (*vhost_set_dev_enable_op)(struct vhost_dev *dev, int enable); typedef bool (*vhost_requires_shm_log_op)(struct vhost_dev *dev); @@ -155,6 +157,7 @@ typedef struct VhostOps { vhost_set_owner_op vhost_set_owner; vhost_reset_device_op vhost_reset_device; vhost_get_vq_index_op vhost_get_vq_index; + vhost_set_vring_enable_op vhost_set_vring_enable; vhost_set_dev_enable_op vhost_set_dev_enable; vhost_requires_shm_log_op vhost_requires_shm_log; vhost_migration_done_op vhost_migration_done;