Re: [PATCH RFC v6 12/20] virtio: disallow late feature changes for virtio-1
From: Cornelia Huck <hidden>
Date: 2014-12-12 11:18:49
Also in:
qemu-devel
On Fri, 12 Dec 2014 11:55:38 +0100 Thomas Huth [off-list ref] wrote:
On Thu, 11 Dec 2014 14:25:14 +0100 Cornelia Huck [off-list ref] wrote:quoted
For virtio-1 devices, the driver must not attempt to set feature bits after it set FEATURES_OK in the device status. Simply reject it in that case. Signed-off-by: Cornelia Huck <redacted> --- hw/virtio/virtio.c | 16 ++++++++++++++-- include/hw/virtio/virtio.h | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-)diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 57190ba..a3dd67b 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c@@ -978,7 +978,7 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f) vmstate_save_state(f, &vmstate_virtio, vdev); } -int virtio_set_features(VirtIODevice *vdev, uint64_t val) +static int __virtio_set_features(VirtIODevice *vdev, uint64_t val)Maybe avoid the double underscores here? But unfortunately, I also fail to come up with a better suggestion for a name here ...
virtio_set_features_nocheck()? This function is only called within virtio.c anyway...
quoted
{ BusState *qbus = qdev_get_parent_bus(DEVICE(vdev)); VirtioBusClass *vbusk = VIRTIO_BUS_GET_CLASS(qbus);@@ -994,6 +994,18 @@ int virtio_set_features(VirtIODevice *vdev, uint64_t val) return bad ? -1 : 0; } +int virtio_set_features(VirtIODevice *vdev, uint64_t val) +{ + /* + * The driver must not attempt to set features after feature negotiation + * has finished. + */ + if (vdev->status & VIRTIO_CONFIG_S_FEATURES_OK) { + return -EINVAL; + }Hmm, according to your patch description, the FEATURES_OK check only applies to virtio-1.0 devices ... so shouldn't there be a check for virtio-1 here? Or did I miss something?
A device in legacy mode will never have FEATURES_OK set. But it is a bit non-obvious - maybe adding a check for VERSION_1 does not hurt.
quoted
+ return __virtio_set_features(vdev, val); +}Thomas