
On 07/23/2015 10:21 AM, Laine Stump wrote:
On 07/23/2015 05:04 AM, Ján Tomko wrote:
On Wed, Jul 22, 2015 at 12:04:41PM -0400, Laine Stump wrote:
If a pci address had a function number out of range, the error message would be:
Insufficient specification for PCI address
This was due to an unnecessary call to virDevicePCIAddressIsValid() during parse of the pci address - we will anyway check for validity of the PCI address later on.
With that extra check removed, the error message is the much more useful:
Invalid PCI address 0000:02:06.8. function must be <= 7
That error is reported by virDomainPCIAddressValidate, called when we validate and assign guest PCI addresses.
Other code paths do not have that protection. After this patch, we happily parse: <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x02' slot='0x00' function='0x9'/> </source> </hostdev> That is bad. It means that qemuCollectPCIAddress() (which calls virDomainPCIAddressReserveAddr(), which in turn calls virDomainPCIAddressValidate()) isn't being called for that slot, so it's not being added to the set of in-use addresses.
I'll look into why that happens.
Derp. Of course it happens because it is the PCI adress on the *host* side and not the guest side. I guess a full 1L french press of high octane isn't enough to wake me up in the morning; I'd better go make another (and in the meantime see about putting in better validation for the source PCI address without messing it up for the target PCI address).
A vague error message (and refusing to continue with invalid data) is better than no error, I think we should keep the error here. I still think this error should be removed, since virDevicePCIAddressIsValid() isn't used to determine an error condition in any other of its uses, and only does an approximation as to whether or not the address is valid (it can't do any better with the information it has, because it doesn't know anything about the type of bus it is plugging into and that info is unknown at the time the individual device is parsed).
Instead, we should assure that the proper function (virDomainPCIAddressValidate()) is called at the appropriate time for *all* devices.
Sigh. Since this is the source PCI address, we *never* have the information about the bus it's plugged into, so the rudimentary validation like that in virDevicePCIAddressIsVali() is the best we can hope for (although we still can do a better job of reporting the error than just "this is bad").
This resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1004596 --- src/conf/device_conf.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c index e7b7957..09a7019 100644 --- a/src/conf/device_conf.c +++ b/src/conf/device_conf.c @@ -1,7 +1,7 @@ /* * device_conf.c: device XML handling * - * Copyright (C) 2006-2012 Red Hat, Inc. + * Copyright (C) 2006-2015 Red Hat, Inc. Oh no, this file was unprotected for almost three years.
Jan -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list