From: Cornelia Huck <cohuck@redhat.com>
To: Halil Pasic <pasic@linux.ibm.com>
Cc: Thomas Huth <thuth@redhat.com>,
Boris Fiuczynski <fiuczy@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Pierre Morel <pmorel@linux.ibm.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
David Hildenbrand <david@redhat.com>,
qemu-devel@nongnu.org,
Christian Borntraeger <borntraeger@de.ibm.com>,
qemu-s390x@nongnu.org, David Gibson <david@gibson.dropbear.id.au>,
Viktor Mihajlovski <mihajlov@linux.ibm.com>,
Richard Henderson <rth@twiddle.net>
Subject: Re: [PATCH v2 1/1] virtio-ccw: auto-manage VIRTIO_F_IOMMU_PLATFORM if PV
Date: Tue, 9 Jun 2020 08:44:02 +0200 [thread overview]
Message-ID: <20200609084402.35d317ec.cohuck@redhat.com> (raw)
In-Reply-To: <20200608190045.319dd68b.pasic@linux.ibm.com>
On Mon, 8 Jun 2020 19:00:45 +0200
Halil Pasic <pasic@linux.ibm.com> wrote:
> > I'm also not 100% sure about migration... would it make sense to
> > discuss all of this in the context of the cross-arch patchset? It seems
> > power has similar issues.
> >
>
> I'm going to definitely have a good look at that. What I think special
> about s390 is that F_ACCESS_PLATFORM is hurting us because all IO needs
> to go through ZONE_DMA (this is a problem of the implementation that
> stemming form a limitation of the DMA API, upstream didn't let me
> fix it).
My understanding is that power runs into similar issues, but I don't
know much about power, so I might be entirely wrong :)
>
> > >
> > > Further improvements are possible and probably necessary if we want
> > > to go down this path. But I would like to verify that first.
> > >
> > > ----------------------------8<---------------------------------
> > > From: Halil Pasic <pasic@linux.ibm.com>
> > > Date: Wed, 26 Feb 2020 16:48:21 +0100
> > > Subject: [PATCH v2.5 1/1] virtio-ccw: auto-manage VIRTIO_F_IOMMU_PLATFORM if PV
> > >
> > > The virtio specification tells that the device is to present
> > > VIRTIO_F_ACCESS_PLATFORM (a.k.a. VIRTIO_F_IOMMU_PLATFORM) when the
> > > device "can only access certain memory addresses with said access
> > > specified and/or granted by the platform". This is the case for a
> > > protected VMs, as the device can access only memory addresses that are
> > > in pages that are currently shared (only the guest can share/unsare its
> > > pages).
> > >
> > > No VM, however, starts out as a protected VM, but some VMs may be
> > > converted to protected VMs if the guest decides so.
> > >
> > > Making the end user explicitly manage the VIRTIO_F_ACCESS_PLATFORM via
> > > the property iommu_on is a minor disaster. Since the correctness of the
> > > paravirtualized virtio devices depends (and thus in a sense the
> > > correctness of the hypervisor) it, then the hypervisor should have the
> > > last word about whether VIRTIO_F_ACCESS_PLATFORM is to be presented or
> > > not.
> > >
> > > Currently presenting a PV guest with a (paravirtualized) virtio-ccw
> > > device has catastrophic consequences for the VM (after the hypervisors
> > > access to protected memory). This is especially grave in case of device
> > > hotplug (because in this case the guest is more likely to be in the
> > > middle of something important).
> >
> > You mean for virtio-ccw devices that don't have iommu_on, right?
> >
> >
>
> Right, I'm missing the most important words.
>
> > >
> > > Let us add the ability to manage the VIRTIO_F_ACCESS_PLATFORM virtio
> > > feature automatically. This is accomplished by turning the property
> > > into an 'on/off/auto' property, and for virtio-ccw devices if auto
> > > was specified forcing its value before we start the protected VM. If
> > > the VM should cease to be protected, the original value is restored.
> > >
> > > Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
> > > ---
> > > hw/s390x/s390-virtio-ccw.c | 2 ++
> > > hw/s390x/virtio-ccw.c | 14 ++++++++++++++
> > > hw/virtio/virtio.c | 19 +++++++++++++++++++
> > > include/hw/virtio/virtio.h | 4 ++--
> > > 4 files changed, 37 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> > > index f660070d22..705e6b153a 100644
> > > --- a/hw/s390x/s390-virtio-ccw.c
> > > +++ b/hw/s390x/s390-virtio-ccw.c
> > > @@ -330,6 +330,7 @@ static void s390_machine_unprotect(S390CcwMachineState *ms)
> > > migrate_del_blocker(pv_mig_blocker);
> > > error_free_or_abort(&pv_mig_blocker);
> > > qemu_balloon_inhibit(false);
> > > + subsystem_reset();
> > > }
> > >
> > > static int s390_machine_protect(S390CcwMachineState *ms)
> > > @@ -382,6 +383,7 @@ static int s390_machine_protect(S390CcwMachineState *ms)
> > > if (rc) {
> > > goto out_err;
> > > }
> > > + subsystem_reset();
> > > return rc;
> > >
> > > out_err:
> > > diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
> > > index 64f928fc7d..2bb29b57aa 100644
> > > --- a/hw/s390x/virtio-ccw.c
> > > +++ b/hw/s390x/virtio-ccw.c
> > > @@ -874,6 +874,20 @@ static void virtio_ccw_reset(DeviceState *d)
> > > VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
> > > VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
> > > VirtIOCCWDeviceClass *vdc = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
> > > + S390CcwMachineState *ms = S390_CCW_MACHINE(qdev_get_machine());
> > > +
> > > + /*
> > > + * An attempt to use a paravirt device without VIRTIO_F_IOMMU_PLATFORM
> > > + * in PV, has catastrophic consequences for the VM. Let's force
> > > + * VIRTIO_F_IOMMU_PLATFORM not already specified.
> > > + */
> > > + if (vdev->access_platform_auto && ms->pv) {
> > > + virtio_add_feature(&vdev->host_features, VIRTIO_F_IOMMU_PLATFORM);
> > > + vdev->access_platform = ON_OFF_AUTO_ON;
> > > + } else if (vdev->access_platform_auto) {
> > > + virtio_clear_feature(&vdev->host_features, VIRTIO_F_IOMMU_PLATFORM);
> > > + vdev->access_platform = ON_OFF_AUTO_OFF;
> > > + }
> >
> > If the consequences are so dire, we really should disallow adding a
> > device of IOMMU_PLATFORM off if pv is on.
>
> I totally agree. My previous patch didn't have the problem because there
> we just forced what we need.
>
> >
> > (Can we disallow transition to pv if it is off? Maybe with the machine
> > property approach from the cross-arch patchset?)
>
> No we can't disallow transition because for hotplug that already
> happened.
I mean, can a virtio devices without IOMMU_PLATFORM act as a transition
blocker (i.e. an attempt by a guest to move to pv would fail?)
>
> I can't say anything about the cross-arch patchset. Will come back to you
> once I'm smarter.
>
> >
> > >
> > > virtio_ccw_reset_virtio(dev, vdev);
> > > if (vdc->parent_reset) {
> > > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> > > index b6c8ef5bc0..f6bd271f14 100644
> > > --- a/hw/virtio/virtio.c
> > > +++ b/hw/virtio/virtio.c
> > > @@ -3232,7 +3232,11 @@ void virtio_instance_init_common(Object *proxy_obj, void *data,
> > >
> > > object_initialize_child(proxy_obj, "virtio-backend", vdev, vdev_size,
> > > vdev_name, &error_abort, NULL);
> > > + object_property_add_alias(OBJECT(vdev), "iommu_platform",
> > > + OBJECT(vdev), "access_platform", &error_abort);
> > > qdev_alias_all_properties(vdev, proxy_obj);
> > > + object_property_add_alias(proxy_obj, "iommu_platform",
> > > + OBJECT(vdev), "access_platform", &error_abort);
> > > }
> > >
> > > void virtio_init(VirtIODevice *vdev, const char *name,
> > > @@ -3626,6 +3630,19 @@ static void virtio_device_realize(DeviceState *dev, Error **errp)
> > > return;
> > > }
> > >
> > > + switch (vdev->access_platform) {
> > > + case ON_OFF_AUTO_ON:
> > > + virtio_add_feature(&vdev->host_features, VIRTIO_F_IOMMU_PLATFORM);
> > > + break;
> > > + case ON_OFF_AUTO_AUTO:
> > > + /* transport code can mange access_platform */
> > > + vdev->access_platform_auto = true;
> >
> > Can we really make that transport-specific? While ccw implies s390, pci
> > might be a variety of architectures.
> >
>
> Right, this is more about the machine than the transport. I was thinking
> of a machine hook, but decided to discuss the more basic stuff first
> (i.e. is it OK to change the property after stuff is realized).
>
> This would already fix the most pressing issue which is virtio-ccw. I
> didn't even bother checking if virtio-pci works with PV out of the box,
> or if something needs to be done there. My bet is that it does not work.
I agree, virtio-pci + pv is unlikely to work. But if at all possible,
I'd prefer a general solution anyway, as other architectures care about
virtio-pci.
next prev parent reply other threads:[~2020-06-09 6:45 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-14 22:11 [PATCH v2 1/1] virtio-ccw: auto-manage VIRTIO_F_IOMMU_PLATFORM if PV Halil Pasic
2020-05-20 12:16 ` Halil Pasic
2020-05-20 16:23 ` Michael S. Tsirkin
2020-05-22 21:04 ` Halil Pasic
2020-05-28 11:21 ` Cornelia Huck
2020-05-28 14:42 ` Janosch Frank
2020-05-28 18:49 ` Halil Pasic
2020-05-28 17:52 ` Halil Pasic
2020-06-05 23:32 ` Halil Pasic
2020-06-08 16:14 ` Cornelia Huck
2020-06-08 17:00 ` Halil Pasic
2020-06-09 6:44 ` Cornelia Huck [this message]
2020-06-09 9:41 ` Halil Pasic
2020-06-09 14:02 ` Pierre Morel
2020-06-09 15:47 ` Claudio Imbrenda
2020-06-09 16:05 ` Cornelia Huck
2020-06-09 16:41 ` Halil Pasic
2020-06-10 13:34 ` Halil Pasic
2020-06-09 16:28 ` Halil Pasic
2020-06-09 16:44 ` Michael S. Tsirkin
2020-06-10 4:31 ` David Gibson
2020-06-10 7:22 ` David Hildenbrand
2020-06-10 10:07 ` David Gibson
2020-06-10 10:24 ` David Hildenbrand
2020-06-10 13:00 ` Halil Pasic
2020-06-10 13:19 ` Viktor Mihajlovski
2020-06-10 14:00 ` David Hildenbrand
2020-06-19 0:36 ` David Gibson
2020-06-19 0:33 ` David Gibson
2020-06-10 13:15 ` Halil Pasic
2020-06-10 4:29 ` David Gibson
2020-06-10 13:57 ` Halil Pasic
2020-06-19 0:59 ` David Gibson
2020-06-09 16:41 ` Michael S. Tsirkin
2020-06-10 4:25 ` David Gibson
2020-06-10 21:37 ` Halil Pasic
2020-06-19 1:01 ` David Gibson
2020-06-08 16:53 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200609084402.35d317ec.cohuck@redhat.com \
--to=cohuck@redhat.com \
--cc=borntraeger@de.ibm.com \
--cc=david@gibson.dropbear.id.au \
--cc=david@redhat.com \
--cc=fiuczy@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=mihajlov@linux.ibm.com \
--cc=mst@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=pmorel@linux.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=rth@twiddle.net \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.