On 03/14/2016 02:42 PM, John Ferlan wrote:
On 03/08/2016 11:36 AM, Cole Robinson wrote:
> In order to make this work, we need to short circuit the normal
> virDomainDefPostParse ordering, and manually add stock devices
> ourselves, since we need them in the XML before assigning addresses.
>
> The motivation for this is that upcoming patches will want to perform
> generic PostParse checks that need to run _after_ the driver has
> assigned all its addresses.
>
Do you mean you need to perform the generic DevicePostParse checks after
the driver has assigned all its addresses or the generic (domain)
PostParse checks. Based on reading patch 6 of this series, it seems the
latter, but the ImplicitDevices check is involved.
After patch #6 I want the control flow to be
virDomainDefPostParse->
qemuDomainPostParse
AddImplicitDevices
qemuDomainAssignAddresses
virDomainCheckUnallocatedDeviceAddrs
AddImplicitDevices needs to come before qemuDomainAssignAddresses, so the
implicit controllers get addresses allocated by the qemu driver
virDomainCheckUnallocatedDeviceAddrs needs to come after
qemuDomainAssignAddresses.
I want virDomainCheckUnallocatedDeviceAddrs in generic code, so we don't need
to cram it in every HVs PostParse callback.
<snip>
> Peter objected to this here:
>
https://www.redhat.com/archives/libvir-list/2016-January/msg00200.html
>
> Suggesting adding an extra PostParse callback instead. I argued
> that change isn't necessarily sufficient either, and that this
> method should be safe since all these functions already need to be
> idemptotent.
The preceding hunk seems to have been more relevant for something after
the '---' so as to not be included in git history.
</snip>
Even without the upcoming patches - it seems to me this patch is
designed to ensure that once the qemuDomainDefPostParse code adds
DefaultDevices that we make sure that those devices and the existing
ones for the domain go through the device post parse processing before
adding implicit devices and assigning addresses for any devices without one.
The key of course being the assign addresses which needs to be called
after each device has been addressed.
So the problems are:
1. We don't add the ImplicitDevices early enough
2. We don't assign the DeviceAddress early enough
where "early enough" is defined as before virDomainDefPostParseInternal
during virDomainDefPostParse. The chicken/egg problem being that the
PostParseInternal function calls virDomainDefAddImplicitControllers.
Another "option" it seems would be to add a 3rd callback mechanism to
assign addresses for all domains (if supported/necessary). This would be
called in virDomainDefPostParse before the *DefPostParseInternal. Going
this way I don't think you need current patch 2...
So starting with the implicit devices - it doesn't seem there is
anything in the *PostParseInternal that's adding a device, so instead of
the current patch 2, can we move that call to virDomainDefPostParse?
Then patch 3 could add a call to a device address assignment callback,
such as the following:
virDomainDefPostParse
.domainDefPostCallback (qemuDomainDefPostParse)
...
qemuDomainAddDefaultDevices
...
virDomainDeviceInfoIterateInternal
for each device
.devicesPostParseCallback
virDomainDefAddImplicitControllers
.deviceAssignAddrsPostParseCallback (qemuDomainAssignAddresses)
virDomainDefPostParseInternal
As compared to how I read this patch:
virDomainDefPostParse
.domainDefPostCallback (qemuDomainDefPostParse)
...
qemuDomainAddDefaultDevices
virDomainDefPostParseDevices
for each device
.devicesPostParseCallback
virDomainDefAddImplicitDevices
qemuDomainAssignAddresses
...
virDomainDefPostParseDevices NOTE: Duplicated for qemu...
for each device and shouldn't do anything
.devicesPostParseCallback
virDomainDefPostParseInternal
FWIW: The rest of this was written first, then I started trying to
figure out what problem was being solved... I'll leave the comments as
is since they point out my thinking while reviewing.
Thank you for your comments. I think the idea of adding a new post parse
callback specifically for assigning addresses is a good one; giving it an
explicit purpose makes it more clear when hv drivers should actually implement
it. And it's probably the lowest effort way to implement all this :)
I'm not going to respond in detail to every point, since if your above
suggestion will eliminate some of the code you responded to.
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index d29073d..aaec9de 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -277,6 +277,11 @@ static int testCompareXMLToArgvFiles(const char *xml,
> if (virBitmapParse("0-3", '\0', &nodeset, 4) < 0)
> goto out;
>
> + virQEMUCapsSetList(extraFlags,
> + QEMU_CAPS_NO_ACPI,
> + QEMU_CAPS_DEVICE,
> + QEMU_CAPS_LAST);
> +
Why is this moved unless perhaps the goal was to use the flags in the
following call... The 'extraFlags' is only used later anyway in the
virQEMUCapsFilterByMachineType. Since qemuDomainAssignAddresses was
removed and the series involves erroring during parse, I started to
wonder... especially since the removed call used the extraFlags.
The code now does
virDomainDefParseFile->...->qemuDomainAssignAddresses
and the latter bit depends heavily on QEMU_CAPS flags. extraFlags in this
context is already indirectly wedged into the fake qemu driver state, so its
implicitly sent to qemuDomainAssignAddresses
- Cole