On Thu, Sep 03, 2020 at 19:50:13 +0800, Zhenyu Zheng wrote:
Hi,
Thanks alot for the review and feedback. As for host-passthrough cases, I
have some other understandings,
if I understand correctly, what you mean is that if a vm uses
host-passthrough, it can migrate to any other
host, since it asks for host-passthrough. In my point of view, I think in
real cases, there are few different kinds
of ARM datacenter CPUs on the market, and there CPU capabilities are
different, so one might create a vm on
hostA with feature1 and feature2 because it uses host-passthrough and hostA
has these features. Now in your
definition(if I understand correctly) of host-passthrough and the current
code(returns identical directly), this vm
can be migrated to hostB with only feature1, since there are no
limitations. If one has some important application
that depends on feature2, the app will break as feature2 is not available
on hostB.
And that's why migrating a domain with host-passthrough CPU is generally
not supported. It should work if you have two identical hosts in terms
of CPU, microcode (if applicable to ARM), system settings (not sure
about ARM, but x86 let's you hide some CPU features), kernel and its
command line arguments, kvm modules and their options, and QEMU. If any
of this is different the guest CPU may change in an unexpected way
during migration and there's no way libvirt could know about it or
prevent it in general.
Even if we made the change and compared CPU features, the CPUs may have
other features which libvirt does not know about or the CPUs could even
differ in other aspects which libvirt does not cover in the CPU modeling
code.
But thinking about this and your patch, I guess I know what you are
trying to do. You're not trying to compare the CPU definition from a
domain XML (which was the primary use case for CPU comparison APIs), but
you want to compare the host CPU definition from one host to the host
CPU on the other host to see whether the two hosts might be compatible.
This sounds like a valid use case (not sure it is that useful), but we
need to be careful. But we should make sure implementing this does not
break anything. This means, we need to do different things depending on
the type of the CPU definition we are asked to compare. Guest CPU
definitions should keep the old behaviour (return IDENTICAL) and host
CPU definitions can be compared to the host CPU. But when doing so,
don't get too influenced by x86 code, which I believe is way too
complicated for ARM. Specifically you don't need to create armCompute
and mess with guestData and other stuff there as all you want to do is
compare the two CPU definitions. In x86 the same function is used for
several things, but that's not the case for ARM.
Considering this, I proposed to add basic checks to compare CPU to
limit the migration to only the same CPU models. And once the
capability of ARM driver is enhanced in QEMU or other related
projects, we can make the compare API better.
Sure, but that would be comparing guest CPU definition with the CPU we
get from QEMU rather than the one we detect ourselves.
Jirka