Resurrecting an old thread:
I didn't see any clear conclusion in this thread (this is why I am
resurrecting it), except that many were arguing that libvirt should
simply copy and/or generate the CPU model definitions from Qemu. I
really don't think it's reasonable to expect that.
On Thu, Dec 15, 2011 at 03:54:15PM +0100, Jiri Denemark wrote:
> Recently I realized that all modern CPU models defined in
> /etc/qemu/target-x86_64.conf are useless when qemu is used through libvirt.
> That's because we start qemu with -nodefconfig which results in qemu ignoring
> that file with CPU model definitions. We have a very good reason for using
> -nodefconfig because we need to control the ABI presented to a guest OS and we
> don't want any configuration file that can contain lots of things including
> device definitions to be read by qemu. However, we would really like the new
> CPU models to be understood by qemu even if used through libvirt. What would
> be the best way to solve this?
> I suspect this could have been already discussed in the past but obviously a
> workable solution was either not found or just not implemented.
So, our problem today is basically:
A) libvirt uses -nodefconfig;
B) -nodefconfig makes Qemu not load the config file containing the CPU
model definitions; and
C) libvirt expects the full CPU model list from Qemu to be available.
Those three expectations can't be fulfilled at the same time. So, we
have to break one of the expectations above. That means:
- Breaking (A), that would mean libvirt wouldn't use -nodefconfig. I
think -nodefconfig _has_ a point, even if it doesn't do much today, so
I think we can drop this possibility.
- Breaking (B), that means loading the CPU model definitions anyway
when using -nodefconfig.
I am inclined for this option: the list of CPU model defs are a list
of CPU "templates", not actual virtual machine configuration. The fact
that the CPU templates are stored in an external file instead of
hardcoded inside the Qemu source code is just an implementation
detail. A more detailed explanation is below.
- Breaking (C), that means libvirt would simply not have the existing
CPU model definitions available for its use. This is what happens
The problem with this solution is: if we are spending lots of efforts
defining properly all those CPU definition templates, we should allow
the upper layers to reuse them, instead of forcing them to duplicate
work and maintain their own copies and deal with exactly the same
problems we had to deal inside Qemu.
This is related to the argument that "CPU definitions are part of
machine-types". Machine-types are a mechanism to allow new guest-visible
features to be added to a virtual machine without waiting until libvirt
can handle the details of that feature. You just choose a newer
machine-type, and the new features are going to be enabled, even if
libvirt doesn't know anything about it.
When libvirt starts to model some details of some feature, we can let it
probe for them, so it knows what's exactly being exposed to a guest.
But while these details are not modelled by libvirt, the only way we can
let the user enjoy new features as they are available is using
machine-types. And to make this work, machine-types details can't be
disabled using -nodefconfig.
Complementing what Gleb said at that time:
On Sun, Dec 18, 2011 at 11:58:16AM +0200, Gleb Natapov wrote:
> > Ideally libvirt would just write out a config file with the CPU
> > that was configured in libvirt and pass -readconfig
> > /var/lib/libvirt/qemu/guestcpu.conf
> > That way libvirt can configure CPU models without regard for
> > what the particular QEMU version might have in its config.
> And how libvirt would know that particular QEMU/kvm version can create
> this CPU. Managing cpuid shouldn't be libvirt busyness.
Even if managing CPUID bits is libvirt business on some specific cases,
this is not true for _all_ CPU details.
I don't think that the libvirt internal model of CPU features will be
ever complete (and maybe it even shouldn't be). There will be always
some feature that libvirt don't know anything about, and _that_ is what
we have to model inside the Qemu CPU definitions and/or inside
machine-type definitions--I don't think we even have a choice.
We can make it easier to change and probe for the existing CPU
definitions and features, in case libvirt wants to deal with some
details, but we can't expect libvirt to be able to configure every
single detail about the CPU.