[PATCH 10/16] virtio: add API to enable VQs early

Cornelia Huck
2014-10-06T14:08:16Z

On Sun, 5 Oct 2014 19:07:19 +0300
"Michael S. Tsirkin" <mst at redhat.com> wrote:

> virtio spec requires DRIVER_OK to be set before
> VQs are used, but some drivers use VQs before probe
> function returns.
> Since DRIVER_OK is set after probe, this violates the spec.

"Even though transitional devices support this behaviour, we want to
make it possible for those early callers to become spec compliant."

?

>
> Add API for drivers to call before using VQs.
>
> Sets DRIVER_OK internally.
>
> Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
> ---
>  include/linux/virtio_config.h | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index e8f8f71..6127fc8 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -109,6 +109,23 @@ struct virtqueue *virtio_find_single_vq(struct
virtio_device *vdev,
>  	return vq;
>  }
>
> +/**
> + * virtio_early_enable_vqs - enable vq use in probe function
> + * @vdev: the device
> + *
> + * Driver must call this to use vqs in the probe function.
> + *
> + * Note: vqs are enabled automatically after probe returns.
> + */
> +static inline
> +void virtio_early_enable_vqs(struct virtio_device *dev)
> +{
> +	unsigned status = dev->config->get_status(dev);
> +
> +	BUG_ON(status & VIRTIO_CONFIG_S_DRIVER_OK);
> +	dev->config->set_status(dev, status | VIRTIO_CONFIG_S_DRIVER_OK);
> +}
> +

Maybe virtio_enable_vqs_early() instead?

>  static inline
>  const char *virtio_bus_name(struct virtio_device *vdev)
>  {