[libvirt] [PATCH] qemu: avoid double reservation of PCI address when hotplugging interface type='hostdev'

Laine Stump laine at redhat.com
Tue Oct 22 18:25:13 UTC 2019


On 10/21/19 9:02 AM, Andrea Bolognani wrote:
> On Sat, 2019-10-19 at 02:18 -0400, Laine Stump wrote:
>> Commit 01ca4010d86 (libvirt v5.1.0) moved address reservation for
>> hotplugged interface devices up to an earlier point in
>> qemuDomainAttachNetDevice() because some function called when
>> hotplugging on aarch64 needed to know the address type, and failed
>> when it was "none".
> I don't see anything in the original commit suggesting the change
> was connected to aarch64? In fact, for the most part I would expect
> aarch64/virt guests to go down the very same code paths as x86/q35
> guests.


The secret info is in the emails surrounding the V1 patch that turned 
into the V2 patch that was eventually pushed:

https://www.redhat.com/archives/libvir-list/2018-December/msg00439.html

https://www.redhat.com/archives/libvir-list/2018-December/msg00460.html


I think the issue is that in the VIR_DOMAIN_NET_TYPE_VHOSTUSER case of 
the switch statement in qemuDomainAttachNetDevice(), it is calling 
qemuDomainSupportsNicdev(), and qemuDomainSupportsNicdev has this code:

/* non-virtio ARM nics require legacy -net nic */

if (((def->os.arch == VIR_ARCH_ARMV6L) ||

     (def->os.arch == VIR_ARCH_ARMV7L) ||

     (def->os.arch == VIR_ARCH_AARCH64)) &&

     net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO &&

     net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)

         return false;

return true;


So if you were attempting to hotplug a vhostuser device on aarch64 with 
no address specified in the XML, it would return false, which would 
cause qemuDomainAttachNetDevice() to fail and log an error.



>
>> This unfortunately caused a regression, because it also made PCI
>> address reservation happen before we noticed that the device was a
>> *hostdev* interface. Those interfaces are hotplugged by just calling
>> out to qemuDomainAttachHostdevDevice() - that function would then also
>> attempt to reserve the *same PCI address* that had just been reserved
>> in qemuDomainAttachNetDevice().
> And of course at the time we didn't have, and after this patch still
> don't have, test suite coverage for that O:-)


I'll choose to pretend I didn't see that.


>
>> The solution is to move the bit of code that short-circuits out to
>> virDomainHostdevAttach() up *even earlier* so that no PCI address has
>> been allocated by the time it's called.
>>
>> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1744523
>> Signed-off-by: Laine Stump <laine at redhat.com>
> The prevailing style seems to be
>
>    ...
>    been allocated by the time it's called.
>
>    https://bugzilla.redhat.com/show_bug.cgi?id=1744523
>
>    Signed-off-by: Laine Stump <laine at redhat.com>
>
> Feel free to change it or leave it as-is, I personally don't feel
> very strongly either way.


Remember when BZes weren't listed *at all* in commit messages? 
Stumperidge Farms remembers. I guess the debate about this happened on 
one of the many patch threads that I didn't get around to reading (I 
remember seeing some private messages, but I thought those were only wrt 
downstream distro patches, not upstream). I can see the point with 
patches that are *in support* of some patch that fixes a bug (and 
therefore shouldn't claim "resolves"), but I think it's nice to have an 
explicit indicator in a patch that means "immediately prior to this 
patch, the bug still existed. After this patch, the bug no longer 
exists". Yeah yeah, I know it's more complicated than that.


Anyway, if the winds are currently blowing in the direction of "don't 
say "Resolves:" then fine, I won't says "Resolves:".


>
>> +++ b/src/qemu/qemu_hotplug.c
>> +    case VIR_DOMAIN_NET_TYPE_HOSTDEV:
>> +        /* this switch is skipped by hostdev interfaces */
> Maybe something like
>
>    /* hostdev interfaces have been dealt with earlier */
>
> instead?


Sure.


>
>
> With at least the reference to aarch64 removed (unless of course I
> have misunderstood the situation and the original commit was really
> aarch64-related),


Still want me to remove that, or add extra comments describing the 
original problem more thoroughly? (seems kind of the wrong place for 
that - that documentation train already sailed)

>
>    Reviewed-by: Andrea Bolognani <abologna at redhat.com>
>




More information about the libvir-list mailing list