On 16.09.2019 22:44, Laine Stump wrote:
> On 9/16/19 10:44 AM, Nikolay Shirokovskiy wrote:
>> Hi, all
>>
>> I recently discovered that <target dev=''/> input is allowed[*]
> 
> 
> So you're saying this previously failed? Catastrophically (SEGV)? Or did it 
> log an error and refuse to start the domain?

Without [*] domain start fails with internal error, something like "value too 
long" caused by empty string behaviour of virStrncpy.

> 
> 
>> by qemu driver's defineXML for <interface> element. On start it will
>> turn into 'tap<N>'. At the same time empty value is not allowed by
>> schema. This name is generated by kernel on linux.
> 
> 
> Hmm, yeah I hadn't ever thought about it, but I guess that makes sense, since 
> that's the way the tunctl utility works by default (opens /dev/net/tun, then 
> does a TUNSETIFF ioctl with an empty string as the name of the device), and 
> it get devices name tap<N>.
> 
> 
>>
>> I wonder how to deal with this.
>>
>> 1. Fix schema to allow empty value for dev attribute. Additionally fix
>> migrating to clear out this autogenerated name. This way we have 2
>> options to autogenerate dev name. First as described above. Second
>> is by ommiting target element. The naming will be 'vnet<N>' in the
>> latter case. Having these 2 options looks redundant.
> 
> 
> Yeah, this option is bad/undesirable.
> 
> 
>>
>> 2. Don't allow to start domains with such configuration. We can not
>> fail definition because disappearing VMs on libvirt update looks
>> too unpleasant.
> 
> 
> 1) (Nevermind - you answered below) How long has this worked? If it's *very* 
> new, and defining a domain with <target dev=''/> used to fail, then it's 
> actually a *good* thing to fail immediately.
> 
> 
> 2) If you put the check for present-but-empty target dev in 
> virDomainNetDefValidate(), then the validation will be done any time a new 
> device is parsed, but specifically *won't* be done during the domain parse 
> when libvirtd starts up. This avoids the "disappearing domains" problem you 
> mention (and is specifically why the separate validation functions were added 
> - there is one hypervisor-agnostic function for each type of device, and a 
> separate function for the entire domain (all in conf/domain_conf.c), as well 
> as similar hypervisor-specific validation functions in qemu/qemu_domain.c 
> (look for the functions below qemuDomainDeviceDefValidate(), e.g. the 
> function for network interfaces is qemuDomainDeviceDefValidateNetwork(); no, 
> don't ask me why the name uses a different pattern than the 
> hypervisor-agnostic functions!).
> 
> 
> (You'll want to add this validation in the hypervisor-agnostic function, BTW.)
> 
> 
>> This way we don't have two different set of
>> autogenerated names. This can even go unnoticed given we fail
>> such starts anyway after [1] (which is fixed by [*]).
> 
> 
> So you're saying that <target dev=''/> has worked since "forever" (as far as 
> you know), until it stopped working in 4.6.0, and the patch you posted this 
> morning fixes it, right?

Exactly.

Nikolay

> 
> 
> I vote for putting a check in virDomainNetDefValidate() that errors out if it 
> finds target dev present but empty. There may be some who would say "it's 
> existing behavior and has been like this for a long time, so we have to 
> preserve it", but since the schema doesn't allow it and we've never 
> documented it, I think it's reasonable to disallow it (except for, as you 
> say, existing domain definitions at reboot time; NB: there will still be an 
> error if a domain containing this now-illegal setting is ever edited).
> 
> 
>>   [1] is
>> commited on 2018 Jul 23 and released in 4.6.0. However Centos 7
>> is based on 4.5.0 and virNetDevTapCreate has logic to copy
>> generated tap name from kernel like since the beginning (I managed
>> to follow the history to 2011).
> 
> 
> Yes, we rely on it to fill in the numbers of the vnet<N> devices. That way we 
> let the kernel prevent duplicate device names rather than needing to (attempt 
> to) prevent races between threads, as we have to do with macvtap devices 
> (since macvtap doesn't have this capability).
> 
> 
>>
>> Nikolay
>>
>> [*] at least with recent "virStrncpy: fix to successfully copy empty string" 
>> applied
>> [1] 7d70a63b util: Improve virStrncpy() implementation
>>

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to