[PATCH 6/5] lxc: skip the netdev autogenerated name counter past existing devices

Michal Privoznik mprivozn at redhat.com
Thu Dec 17 08:38:52 UTC 2020


On 12/17/20 1:28 AM, Laine Stump wrote:
> On 12/16/20 4:27 PM, Michal Privoznik wrote:
>> On 12/16/20 9:13 PM, Laine Stump wrote:
>>> the lxc driver uses virNetDevGenerateName() for its veth device names
>>> since patch 2dd0fb492, so it should be using virNetDevReserveName()
>>> during daemon restart/reconnect to skip over the device names that are
>>> in use.
>>>
>>> Signed-off-by: Laine Stump <laine at redhat.com>
>>> ---
>>>
>>> I meant to mention this during review of the abovementioned patch, 
>>> but forgot.
>>>
>>> (NB: a couple days ago I *removed* similar code from this same spot,
>>> but it was trying to reserve the name of macvlan devices; a macvlan
>>> device is moved into the container's namespace at startup, so it is
>>> not visible to the host anyway. This new case is for the 1/2 of a veth
>>> pair that does remain in the host's namespace
>>> (type='bridge|network|ethernet' use a veth pair)
>>>
>>>
>>>   src/lxc/lxc_process.c | 24 ++++++++++++++++++++++++
>>>   1 file changed, 24 insertions(+)
>>>
>>> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
>>> index 0f7c929535..a842ac91c5 100644
>>> --- a/src/lxc/lxc_process.c
>>> +++ b/src/lxc/lxc_process.c
>>> @@ -1640,6 +1640,30 @@ 
>>> virLXCProcessReconnectNotifyNets(virDomainDefPtr def)
>>>       for (i = 0; i < def->nnets; i++) {
>>>           virDomainNetDefPtr net = def->nets[i];
>>> +        /* type='bridge|network|ethernet' interfaces may be using an
>>> +         * autogenerated netdev name, so we should update the counter
>>> +         * for autogenerated names to skip past this one.
>>> +         */
>>> +        switch (virDomainNetGetActualType(net)) {
>>> +        case VIR_DOMAIN_NET_TYPE_BRIDGE:
>>> +        case VIR_DOMAIN_NET_TYPE_NETWORK:
>>> +        case VIR_DOMAIN_NET_TYPE_ETHERNET:
>>> +            virNetDevReserveName(net->ifname);
>>> +            break;
>>> +        case VIR_DOMAIN_NET_TYPE_DIRECT:
>>> +        case VIR_DOMAIN_NET_TYPE_USER:
>>> +        case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
>>> +        case VIR_DOMAIN_NET_TYPE_SERVER:
>>> +        case VIR_DOMAIN_NET_TYPE_CLIENT:
>>> +        case VIR_DOMAIN_NET_TYPE_MCAST:
>>> +        case VIR_DOMAIN_NET_TYPE_INTERNAL:
>>> +        case VIR_DOMAIN_NET_TYPE_HOSTDEV:
>>> +        case VIR_DOMAIN_NET_TYPE_UDP:
>>> +        case VIR_DOMAIN_NET_TYPE_VDPA:
>>> +        case VIR_DOMAIN_NET_TYPE_LAST:
>>> +            break;
>>> +        }
>>> +
>>
>> I remember Peter being picky about switch()-es and (almost) always he 
>> wanted me to add the default case with virReportEnumRangeError() 
>> despite the variable passed to switch() being verified earlier. IIUC 
>> his reasoning was that if we had a memory being overwritten somewhere 
>> it's better to error out (I say it's better to crash), but since I 
>> don't care that much, this could have:
>>
>>          default:
>>              virReportEnumRangeError(virDomainNetType, 
>> virDomainNetGetActualType(net));
>>              return;
> 
> But if we add a default case to the switch, we won't get all the nice 
> compile-time errors when we add a new value to the enum and forget to 
> add it to every switch, will we?

We will. I worried about the same, but as it turned out we will get 
errors if a new item is added into the enum.

Michal




More information about the libvir-list mailing list