Re: [libvirt PATCH v2 10/15] xen: explicitly set hostdev driver.type at runtime, not in postparse

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Dec 18, 2023 at 01:14:55 -0500, Laine Stump wrote:
> On 11/27/23 10:12 AM, Peter Krempa wrote:
> > On Mon, Nov 06, 2023 at 02:38:55 -0500, Laine Stump wrote:
> > > Xen only supports a single type of PCI hostdev assignment, so it is
> > > superfluous to have <driver name='xen'/> peppered throughout the
> > > config. It *is* necessary to have the driver type explicitly set in
> > > the hosdev object before calling into the hypervisor-agnostic "hostdev
> > > manager" though (otherwise the hostdev manager doesn't know whether it
> > > should do Xen-specific setup, or VFIO-specific setup).
> > > 
> > > Historically, the Xen driver has checked for "default" driver type
> > > (i.e. not set in the XML), and set it to "xen', during the XML
> > > postparse, thus guaranteeing that it will be set by the time the
> > > object is sent to the hostdev manager at runtime, but also setting it
> > > so early that a simple round-trip of parse-format results in the XML
> > > always containing an explicit <driver name='xen'/>, even if that
> > > wasn't specified in the original XML.
> > 
> > Generally stuff that is written to the definition at parse time is done
> > so that it doesn't change in the future, thus preserving ABI of machines
> > created with a config where the default was not entered yet.
> 
> I don't think there was any intentional "lock in the default setting in the
> config to preserve ABI" in this case - it all seems to just be
> convenience/serendipity. From what I can see in the original code adding
> "PCI passthrough" to the libxl driver, they were just filling in the driver
> name in the xml because 1) it was there, and 2) they had just split out some
> of the code from qemu into "common code" to be used by both libxl and QEMU,
> needed a way to specify which driver was calling into this common code, saw
> the driver name as a convenient way to do it, and noticed that lots of other
> values that weren't set by the user were being set in the postparse, so
> that's where they set it in their code.
> 
> (BTW, there was code in the original commit adding PCI passthrough to libxl
> (commit 6225cb3df5a5732868719462f0a602ef11f7fa03) that logged an error if
> the driver name was anything other than empty (in which case it was set to
> "xen") or "xen". That code is still there today (see
> libxlNodeDeviceDetachFlags), so the Xen driver definiteoy only supports the
> one type of PCI device assignment.)
> 
> > 
> > This commit message doesn't make an argument why the change is needed,
> > so I'm a bit reluctant...
> 
> Well... the less use of the old usage of <driver name> there is, the better,
> and preventing it from being written into every single new config file with
> a <hostdev> means less use. Also this change makes the libxl driver more
> consistent with the behavior of the qemu driver (which has never set an
> explicit default in the postparse - it waits until the devices are being
> initialized for domain startup/hotplug before it sets the driver type (and
> it also always sets it to the same value).
> 
> I suppose I could omit this patch, but I think it's just perpetuating
> unintentional code that is inconsistent with the other driver (qemu) which
> serves to make it more difficult for a newcomer to understand what's going
> on with the <driver name/type> and what is the proper way to handle it in
> the case of some new hypervisor driver that decides to support <hostdev>.
> 
> > 
> > 
> > > The QEMU driver *doesn't* set driver.type during postparse though;
> > > instead, it waits until domain startup time (or device attach time for
> > > hotplug), and sets the driver.type then. The result is that a
> > > parse-format round trip of the XML in the QEMU driver *doesn't* add in
> > > the <driver name='vfio'/>.
> > > 
> > > This patch modifies the Xen code to behave similarly to the QEMU code
> > > - the PostParse just checks for a driver.type that isn't supported by
> > > the Xen driver, and any explicit setting to "xen" is deferred until domain
> > > runtime rather than during the postparse.
> > > 
> > > This delayed setting of driver.type of course results in slightly
> > > different xml2xml parse-format results, so the unit test data is
> > > modified accordingly.
> > > 
> > > Signed-off-by: Laine Stump <laine@xxxxxxxxxx>
> > > ---
> > >   src/libxl/libxl_domain.c                      | 65 +++++++++++++++----
> > >   src/libxl/libxl_driver.c                      | 25 ++++---
> > >   tests/libxlxml2domconfigdata/moredevs-hvm.xml |  1 -
> > >   tests/xlconfigdata/test-fullvirt-pci.xml      |  2 -
> > >   tests/xmconfigdata/test-pci-dev-syntax.xml    |  2 -
> > >   tests/xmconfigdata/test-pci-devs.xml          |  2 -
> > >   6 files changed, 69 insertions(+), 28 deletions(-)
> > > 
> > > diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
> > > index 22482adfa6..ecdf57e655 100644
> > > --- a/src/libxl/libxl_domain.c
> > > +++ b/src/libxl/libxl_domain.c
> > > @@ -160,8 +160,15 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDef *dev,
> > >           if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
> > >               hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
> > > -            pcisrc->driver.type == VIR_DEVICE_HOSTDEV_PCI_DRIVER_TYPE_DEFAULT)
> > > -            pcisrc->driver.type = VIR_DEVICE_HOSTDEV_PCI_DRIVER_TYPE_XEN;
> > > +            pcisrc->driver.type != VIR_DEVICE_HOSTDEV_PCI_DRIVER_TYPE_DEFAULT &&
> > > +            pcisrc->driver.type != VIR_DEVICE_HOSTDEV_PCI_DRIVER_TYPE_XEN) {
> > > +
> > > +            /* Xen only supports "Xen" style of hostdev, of course! */
> > > +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > > +                           _("XEN does not support device assignment mode '%1$s'"),
> > > +                           virDeviceHostdevPCIDriverTypeToString(pcisrc->driver.type));
> > > +            return -1;
> > > +        }
> > >       }
> > >       if (dev->type == VIR_DOMAIN_DEVICE_VIDEO) {
> > > @@ -986,18 +993,9 @@ libxlNetworkPrepareDevices(virDomainDef *def)
> > >           if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV &&
> > >               net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> > >               /* Each type='hostdev' network device must also have a
> > > -             * corresponding entry in the hostdevs array. For netdevs
> > > -             * that are hardcoded as type='hostdev', this is already
> > > -             * done by the parser, but for those allocated from a
> > > -             * network / determined at runtime, we need to do it
> > > -             * separately.
> > > +             * corresponding entry in the hostdevs array.
> > >                */
> > >               virDomainHostdevDef *hostdev = virDomainNetGetActualHostdev(net);
> > > -            virDomainHostdevSubsysPCI *pcisrc = &hostdev->source.subsys.u.pci;
> > > -
> > > -            if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
> > > -                hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
> > > -                pcisrc->driver.type = VIR_DEVICE_HOSTDEV_PCI_DRIVER_TYPE_XEN;
> > >               if (virDomainHostdevInsert(def, hostdev) < 0)
> > >                   return -1;
> > > @@ -1007,6 +1005,46 @@ libxlNetworkPrepareDevices(virDomainDef *def)
> > >       return 0;
> > >   }
> > > +
> > > +static int
> > > +libxlHostdevPrepareDevices(virDomainDef *def)
> > > +{
> > > +    size_t i;
> > > +
> > > +    for (i = 0; i < def->nhostdevs; i++) {
> > > +        virDomainHostdevDef *hostdev = def->hostdevs[i];
> > > +        virDomainHostdevSubsysPCI *pcisrc = &hostdev->source.subsys.u.pci;
> > > +
> > > +        if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
> > > +            hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
> > > +            pcisrc->driver.type == VIR_DEVICE_HOSTDEV_PCI_DRIVER_TYPE_DEFAULT) {
> > > +
> > 
> > ... and here I don't think it's obvious enough that the default must
> > never change.
> 
> But is that the case? (that the default must never change, I mean) It's only
> going to make a difference if libxl adds support for some other type of PCI
> device assignment *and* there is something in that new type of device
> assignment that changes the guest ABI in an incompatible way. (I'm not
> certain, but I'm guessing that Xen doesn't live migration of domains with an
> assigned PCI device, so likely any guest would need to be fully shut down to
> move from the existing type of device assignment to some hypothetical new
> type that may exist at some time in the future.
> 
> At the time that VFIO device assignment first became available, there was no
> <driver name='kvm'/> in any existing config, and no existing management app
> had a setting for the type of device assignment. This turned out to be a
> very *good* thing, because it meant that everyone began using VFIO device
> assignment by default immediately even on existing configs (and the
> newly-introduced <driver name='kvm|vfio'/> was only used if someone found a
> problem in VFIO and needed to temporarily switch back to KVM; fortunately I
> don't think anyone ever did).
> 
> If we had instead required an explicit change to config for anyone to switch
> to using VFIO device assignment instead of legacy KVM device assignment (in
> addition to also requiring the management applications to add a knob to turn
> it on) it surely would have taken *years* longer for VFIO to be fully
> accepted/adopted, and it would have been a correspondingly longer time
> before the legacy KVM device assignment code could be deprecated and then
> finally removed from the kernel and qemu.
> 
> Anyway, I don't see an advantage to explicitly writing into the config the
> value of a knob that only has one valid setting. If, at some point in the
> future, it turns out that libxl adds some new type of device assignment, and
> that new type of device assignement is incompatible with the current device
> assignment in such a way that they don't want users to automatically begin
> using it, then at that time it can just be explicitly stated that "not
> having the driver type set in the config means that the type is "legacy
> xen". But maybe that *won't* be needed, and it will be totally okay for
> everyone to just automatically start using this hypothetical "new type of
> device assignment for libxl"; why make the decision now that we shouldn't
> allow that?
> 
> 
> So have I convinced you, or should I drop it?

The explanation makes sense. You can mention in the commit message that
this is mostly a backend thing so it's likely that it can be upgraded in
the future in a compatible way.

Ideally add a comment to the xen function stating that it can change if
it's ABI compatible.
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux