On Fri, Jan 28, 2022 at 6:59 AM Jason Wang <jasow...@redhat.com> wrote:
>
>
> 在 2022/1/22 上午4:27, Eugenio Pérez 写道:
> > vhost_vdpa_set_features and vhost_vdpa_init need to use
> > vhost_vdpa_get_features in svq mode.
> >
> > vhost_vdpa_dev_start needs to use almost all _set_ functions:
> > vhost_vdpa_set_vring_dev_kick, vhost_vdpa_set_vring_dev_call,
> > vhost_vdpa_set_dev_vring_base and vhost_vdpa_set_dev_vring_num.
> >
> > No functional change intended.
>
>
> Is it related (a must) to the SVQ code?
>

Yes, SVQ needs to access the device variants to configure it, while
exposing the SVQ ones.

For example for set_features, SVQ needs to set device features in the
start code, but expose SVQ ones to the guest.

Another possibility is to forward-declare them but I feel it pollutes
the code more, doesn't it? Is there any reason to avoid the reordering
beyond reducing the number of changes/patches?

Thanks!


> Thanks
>
>
> >
> > Signed-off-by: Eugenio Pérez <epere...@redhat.com>
> > ---
> >   hw/virtio/vhost-vdpa.c | 164 ++++++++++++++++++++---------------------
> >   1 file changed, 82 insertions(+), 82 deletions(-)
> >
> > diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
> > index 04ea43704f..6c10a7f05f 100644
> > --- a/hw/virtio/vhost-vdpa.c
> > +++ b/hw/virtio/vhost-vdpa.c
> > @@ -342,41 +342,6 @@ static bool vhost_vdpa_one_time_request(struct 
> > vhost_dev *dev)
> >       return v->index != 0;
> >   }
> >
> > -static int vhost_vdpa_init(struct vhost_dev *dev, void *opaque, Error 
> > **errp)
> > -{
> > -    struct vhost_vdpa *v;
> > -    assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
> > -    trace_vhost_vdpa_init(dev, opaque);
> > -    int ret;
> > -
> > -    /*
> > -     * Similar to VFIO, we end up pinning all guest memory and have to
> > -     * disable discarding of RAM.
> > -     */
> > -    ret = ram_block_discard_disable(true);
> > -    if (ret) {
> > -        error_report("Cannot set discarding of RAM broken");
> > -        return ret;
> > -    }
> > -
> > -    v = opaque;
> > -    v->dev = dev;
> > -    dev->opaque =  opaque ;
> > -    v->listener = vhost_vdpa_memory_listener;
> > -    v->msg_type = VHOST_IOTLB_MSG_V2;
> > -
> > -    vhost_vdpa_get_iova_range(v);
> > -
> > -    if (vhost_vdpa_one_time_request(dev)) {
> > -        return 0;
> > -    }
> > -
> > -    vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
> > -                               VIRTIO_CONFIG_S_DRIVER);
> > -
> > -    return 0;
> > -}
> > -
> >   static void vhost_vdpa_host_notifier_uninit(struct vhost_dev *dev,
> >                                               int queue_index)
> >   {
> > @@ -506,24 +471,6 @@ static int vhost_vdpa_set_mem_table(struct vhost_dev 
> > *dev,
> >       return 0;
> >   }
> >
> > -static int vhost_vdpa_set_features(struct vhost_dev *dev,
> > -                                   uint64_t features)
> > -{
> > -    int ret;
> > -
> > -    if (vhost_vdpa_one_time_request(dev)) {
> > -        return 0;
> > -    }
> > -
> > -    trace_vhost_vdpa_set_features(dev, features);
> > -    ret = vhost_vdpa_call(dev, VHOST_SET_FEATURES, &features);
> > -    if (ret) {
> > -        return ret;
> > -    }
> > -
> > -    return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_FEATURES_OK);
> > -}
> > -
> >   static int vhost_vdpa_set_backend_cap(struct vhost_dev *dev)
> >   {
> >       uint64_t features;
> > @@ -646,35 +593,6 @@ static int vhost_vdpa_get_config(struct vhost_dev 
> > *dev, uint8_t *config,
> >       return ret;
> >    }
> >
> > -static int vhost_vdpa_dev_start(struct vhost_dev *dev, bool started)
> > -{
> > -    struct vhost_vdpa *v = dev->opaque;
> > -    trace_vhost_vdpa_dev_start(dev, started);
> > -
> > -    if (started) {
> > -        vhost_vdpa_host_notifiers_init(dev);
> > -        vhost_vdpa_set_vring_ready(dev);
> > -    } else {
> > -        vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs);
> > -    }
> > -
> > -    if (dev->vq_index + dev->nvqs != dev->vq_index_end) {
> > -        return 0;
> > -    }
> > -
> > -    if (started) {
> > -        memory_listener_register(&v->listener, &address_space_memory);
> > -        return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
> > -    } 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;
> > -    }
> > -}
> > -
> >   static int vhost_vdpa_set_log_base(struct vhost_dev *dev, uint64_t base,
> >                                        struct vhost_log *log)
> >   {
> > @@ -735,6 +653,35 @@ static int vhost_vdpa_set_vring_call(struct vhost_dev 
> > *dev,
> >       return vhost_vdpa_call(dev, VHOST_SET_VRING_CALL, file);
> >   }
> >
> > +static int vhost_vdpa_dev_start(struct vhost_dev *dev, bool started)
> > +{
> > +    struct vhost_vdpa *v = dev->opaque;
> > +    trace_vhost_vdpa_dev_start(dev, started);
> > +
> > +    if (started) {
> > +        vhost_vdpa_host_notifiers_init(dev);
> > +        vhost_vdpa_set_vring_ready(dev);
> > +    } else {
> > +        vhost_vdpa_host_notifiers_uninit(dev, dev->nvqs);
> > +    }
> > +
> > +    if (dev->vq_index + dev->nvqs != dev->vq_index_end) {
> > +        return 0;
> > +    }
> > +
> > +    if (started) {
> > +        memory_listener_register(&v->listener, &address_space_memory);
> > +        return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
> > +    } 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;
> > +    }
> > +}
> > +
> >   static int vhost_vdpa_get_features(struct vhost_dev *dev,
> >                                        uint64_t *features)
> >   {
> > @@ -745,6 +692,24 @@ static int vhost_vdpa_get_features(struct vhost_dev 
> > *dev,
> >       return ret;
> >   }
> >
> > +static int vhost_vdpa_set_features(struct vhost_dev *dev,
> > +                                   uint64_t features)
> > +{
> > +    int ret;
> > +
> > +    if (vhost_vdpa_one_time_request(dev)) {
> > +        return 0;
> > +    }
> > +
> > +    trace_vhost_vdpa_set_features(dev, features);
> > +    ret = vhost_vdpa_call(dev, VHOST_SET_FEATURES, &features);
> > +    if (ret) {
> > +        return ret;
> > +    }
> > +
> > +    return vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_FEATURES_OK);
> > +}
> > +
> >   static int vhost_vdpa_set_owner(struct vhost_dev *dev)
> >   {
> >       if (vhost_vdpa_one_time_request(dev)) {
> > @@ -772,6 +737,41 @@ static bool  vhost_vdpa_force_iommu(struct vhost_dev 
> > *dev)
> >       return true;
> >   }
> >
> > +static int vhost_vdpa_init(struct vhost_dev *dev, void *opaque, Error 
> > **errp)
> > +{
> > +    struct vhost_vdpa *v;
> > +    assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA);
> > +    trace_vhost_vdpa_init(dev, opaque);
> > +    int ret;
> > +
> > +    /*
> > +     * Similar to VFIO, we end up pinning all guest memory and have to
> > +     * disable discarding of RAM.
> > +     */
> > +    ret = ram_block_discard_disable(true);
> > +    if (ret) {
> > +        error_report("Cannot set discarding of RAM broken");
> > +        return ret;
> > +    }
> > +
> > +    v = opaque;
> > +    v->dev = dev;
> > +    dev->opaque =  opaque ;
> > +    v->listener = vhost_vdpa_memory_listener;
> > +    v->msg_type = VHOST_IOTLB_MSG_V2;
> > +
> > +    vhost_vdpa_get_iova_range(v);
> > +
> > +    if (vhost_vdpa_one_time_request(dev)) {
> > +        return 0;
> > +    }
> > +
> > +    vhost_vdpa_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE |
> > +                               VIRTIO_CONFIG_S_DRIVER);
> > +
> > +    return 0;
> > +}
> > +
> >   const VhostOps vdpa_ops = {
> >           .backend_type = VHOST_BACKEND_TYPE_VDPA,
> >           .vhost_backend_init = vhost_vdpa_init,
>


Reply via email to