On Tue, Jan 22, 2019 at 10:52:25AM -0500, Cole Robinson wrote:
On 01/22/2019 06:55 AM, Daniel P. Berrangé wrote:
> On Fri, Jan 18, 2019 at 06:05:18PM -0500, Cole Robinson wrote:
>> This series is base on my virtio-transitional work, since it touches
>> a lot of the same code:
>>
https://www.redhat.com/archives/libvir-list/2019-January/msg00593.html
>>
>> This series partially converts the net->model value from a string
>> to an enum. We wrap the existing ->model string in accessor functions,
>> rename it to ->modelstr, add a ->model enum, and convert internal
>> driver usage bit by bit. At the end, all driver code that is acting
>> on specific network model values is comparing against an enum, not
>> a string.
>>
>> This is only partial because of xen/libxl/xm and qemu drivers, which
>> if they don't know anything particular about the model string will
>> just place it on the qemu command line/xen config and see what happens.
>> So basically if I were to pass in
>
> Xen is probably quite easy to deal with as it supports far fewer
> arches than the qemu driver. On x86 we need to handle the usual
> rtl8139, e100, ne2k, etc for Xen fully virt. I think for other
> Xen non-x86 arches, it might be reasonable to only care about
> net-front even for fully-virt given that people using Xen with
> hardware acceleration won't want a slow NIC.
>
Okay sounds good. I'll save that for a follow up series after doing some
research/
> QEMU is the really hard one as it has a huge set of arches and
> people using QEMU in TCG mode conceivably care about all the
> random NIC models no matter how slow & awful they are, because
> TCG is already slow & awful.
>
This is probably not as bad as you suggest. I believe most tcg qemu
variants can't even handle -device <netmodel> syntax, but require old
style -net nic magic to enable platform devices. Internally in libvirt
we have a config whitelist for using that old style syntax, and it only
covers a small number, basically arm32/arm64 with non-virtio nic:
bool
qemuDomainSupportsNicdev(virDomainDefPtr def,
virDomainNetDefPtr net)
{
/* 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 we determine a tcg config requires -net nic, and it doesn't meet
the above rules, it doesn't work with libvirt anyways.
Oh that's a very good point - so we really just need to look at
'qemu-system-XXXX -device help' output for each XXXX target and
look for which devices are NICs.
>> * vmx and virtualbox drivers previously would do a case
insensitive
>> compare on the model value passed in via the user XML. Current
>> patches don't preserve that. I don't know how much it matters
>> for these drivers for reading fresh XML vs roundtrip XML from
>> converted native formats (which _will_ correct the case issue).
>> If we want to fix this we will need to tolower() the modelstr
>> value in the XML parser. I think there's a gnulib function for
>> it but I haven't explored it deeply
>
> I guess if we're going to be serious about maintaining compat, we
> should accept the insensitive strings, at the very least for a
> transitional period.
>
> Normally all our enums would be 100% lowercase, but in the vbox
> driver you're adding model names which are mixed-case, because
> that's what vbox would previously output. I think you are right
> to preserve that mixed case despite it not being our normal
> practice, because round-tripped XML is important.
>
> I fear there there could well be people feeding in vbox XML that
> uses all-lowercase for these vbox models based on normal libvirt
> precedent though. This re-inforces the idea that we should allow
> a case-insensitive match when parsing, and perhaps log a warning
> if people use the non-preferred case. Perhaps after a year or
> two we could drop the case-insensitive match, but it would not
> be a huge burden to just carry it forever.
>
Okay I'll explore the tolower() option. I guess then that will imply
that all enum strings are lowercase which means generated vbox XML will
be different now, but that seems like a minor issue if XML input compat
is maintained.
We shouldn't need to change output. I was just thinking that you
could do something like this when parsing to an enum:
model = virDomainNetModelFromString(modelstr)
if model < 0
lowermodelstr = tolower(modelstr)
model = virDomainNetModelFromString(lowermodelstr)
if model < 0
return -1;
VIR_WARN("Model string '%s' uses unexpected case, pleae use
'%s",
lowermodelstr, virDomainNetModelToString(model));
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|