diff mbox

[RFC,v6,19/20] virtio-blk: revision specific feature bits

Message ID 1418304322-7546-20-git-send-email-cornelia.huck@de.ibm.com
State New
Headers show

Commit Message

Cornelia Huck Dec. 11, 2014, 1:25 p.m. UTC
Wire up virtio-blk to provide different feature bit sets depending
on whether legacy or v1.0 has been requested.

Note that VERSION_1 is still disabled due to missing ANY_LAYOUT support.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
 hw/block/virtio-blk.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Michael S. Tsirkin Dec. 28, 2014, 10:24 a.m. UTC | #1
On Thu, Dec 11, 2014 at 02:25:21PM +0100, Cornelia Huck wrote:
> Wire up virtio-blk to provide different feature bit sets depending
> on whether legacy or v1.0 has been requested.
> 
> Note that VERSION_1 is still disabled due to missing ANY_LAYOUT support.
> 
> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>

So we need some way for devices to tell transports
not to negotiate rev 1.
Does clearing VERSION_1 have this effect?


> ---
>  hw/block/virtio-blk.c |   19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
> index 9cfae66..fdc236a 100644
> --- a/hw/block/virtio-blk.c
> +++ b/hw/block/virtio-blk.c
> @@ -587,6 +587,24 @@ static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features)
>      return features;
>  }
>  
> +static uint64_t virtio_blk_get_features_rev(VirtIODevice *vdev,
> +                                            uint64_t features,
> +                                            unsigned int revision)
> +{
> +    if (revision == 0) {
> +        /* legacy */
> +        virtio_clear_feature(&features, VIRTIO_F_VERSION_1);
> +        return virtio_blk_get_features(vdev, features);
> +    }
> +    /* virtio 1.0 or later */
> +    virtio_clear_feature(&features, VIRTIO_BLK_F_SCSI);
> +    virtio_clear_feature(&features, VIRTIO_BLK_F_CONFIG_WCE);
> +    virtio_clear_feature(&features, VIRTIO_BLK_F_WCE);
> +    /* we're still missing ANY_LAYOUT */
> +    /* virtio_add_feature(&features, VIRTIO_F_VERSION_1); */
> +    return features;
> +}
> +
>  static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t status)
>  {
>      VirtIOBlock *s = VIRTIO_BLK(vdev);
> @@ -821,6 +839,7 @@ static void virtio_blk_class_init(ObjectClass *klass, void *data)
>      vdc->get_config = virtio_blk_update_config;
>      vdc->set_config = virtio_blk_set_config;
>      vdc->get_features = virtio_blk_get_features;
> +    vdc->get_features_rev = virtio_blk_get_features_rev;
>      vdc->set_status = virtio_blk_set_status;
>      vdc->reset = virtio_blk_reset;
>      vdc->save = virtio_blk_save_device;
> -- 
> 1.7.9.5
Cornelia Huck Jan. 7, 2015, 4:29 p.m. UTC | #2
On Sun, 28 Dec 2014 12:24:46 +0200
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Thu, Dec 11, 2014 at 02:25:21PM +0100, Cornelia Huck wrote:
> > Wire up virtio-blk to provide different feature bit sets depending
> > on whether legacy or v1.0 has been requested.
> > 
> > Note that VERSION_1 is still disabled due to missing ANY_LAYOUT support.
> > 
> > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> 
> So we need some way for devices to tell transports
> not to negotiate rev 1.
> Does clearing VERSION_1 have this effect?
> 
I just noticed that my patch is running in circles here.

What we need is probably the transport-dependent maximum revision
checker (which at least for ccw is acting on a device) pass in the
requested revision and check if the feature bits for the revision
include VERSION_1. Does that make sense?
Michael S. Tsirkin Jan. 7, 2015, 7:11 p.m. UTC | #3
On Wed, Jan 07, 2015 at 05:29:49PM +0100, Cornelia Huck wrote:
> On Sun, 28 Dec 2014 12:24:46 +0200
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > On Thu, Dec 11, 2014 at 02:25:21PM +0100, Cornelia Huck wrote:
> > > Wire up virtio-blk to provide different feature bit sets depending
> > > on whether legacy or v1.0 has been requested.
> > > 
> > > Note that VERSION_1 is still disabled due to missing ANY_LAYOUT support.
> > > 
> > > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> > 
> > So we need some way for devices to tell transports
> > not to negotiate rev 1.
> > Does clearing VERSION_1 have this effect?
> > 
> I just noticed that my patch is running in circles here.
> 
> What we need is probably the transport-dependent maximum revision
> checker (which at least for ccw is acting on a device) pass in the
> requested revision and check if the feature bits for the revision
> include VERSION_1. Does that make sense?

Just make devices set 'rev 1 supported' flag?
Cornelia Huck Jan. 30, 2015, 2:10 p.m. UTC | #4
On Wed, 7 Jan 2015 21:11:44 +0200
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Wed, Jan 07, 2015 at 05:29:49PM +0100, Cornelia Huck wrote:
> > On Sun, 28 Dec 2014 12:24:46 +0200
> > "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > 
> > > On Thu, Dec 11, 2014 at 02:25:21PM +0100, Cornelia Huck wrote:
> > > > Wire up virtio-blk to provide different feature bit sets depending
> > > > on whether legacy or v1.0 has been requested.
> > > > 
> > > > Note that VERSION_1 is still disabled due to missing ANY_LAYOUT support.
> > > > 
> > > > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> > > 
> > > So we need some way for devices to tell transports
> > > not to negotiate rev 1.
> > > Does clearing VERSION_1 have this effect?
> > > 
> > I just noticed that my patch is running in circles here.
> > 
> > What we need is probably the transport-dependent maximum revision
> > checker (which at least for ccw is acting on a device) pass in the
> > requested revision and check if the feature bits for the revision
> > include VERSION_1. Does that make sense?
> 
> Just make devices set 'rev 1 supported' flag?

I'm now using the ->get_features() callback to check for VERSION_1
(assuming every device that supports it adds the bit in its callback)
and only allow rev 1 if it is present. Will play with this a bit as
well.
diff mbox

Patch

diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 9cfae66..fdc236a 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -587,6 +587,24 @@  static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features)
     return features;
 }
 
+static uint64_t virtio_blk_get_features_rev(VirtIODevice *vdev,
+                                            uint64_t features,
+                                            unsigned int revision)
+{
+    if (revision == 0) {
+        /* legacy */
+        virtio_clear_feature(&features, VIRTIO_F_VERSION_1);
+        return virtio_blk_get_features(vdev, features);
+    }
+    /* virtio 1.0 or later */
+    virtio_clear_feature(&features, VIRTIO_BLK_F_SCSI);
+    virtio_clear_feature(&features, VIRTIO_BLK_F_CONFIG_WCE);
+    virtio_clear_feature(&features, VIRTIO_BLK_F_WCE);
+    /* we're still missing ANY_LAYOUT */
+    /* virtio_add_feature(&features, VIRTIO_F_VERSION_1); */
+    return features;
+}
+
 static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t status)
 {
     VirtIOBlock *s = VIRTIO_BLK(vdev);
@@ -821,6 +839,7 @@  static void virtio_blk_class_init(ObjectClass *klass, void *data)
     vdc->get_config = virtio_blk_update_config;
     vdc->set_config = virtio_blk_set_config;
     vdc->get_features = virtio_blk_get_features;
+    vdc->get_features_rev = virtio_blk_get_features_rev;
     vdc->set_status = virtio_blk_set_status;
     vdc->reset = virtio_blk_reset;
     vdc->save = virtio_blk_save_device;