Skip to content
  • Eduardo Habkost's avatar
    Expose CPUID leaf 7 only for -cpu host · 13526728
    Eduardo Habkost authored
    
    
    Changes v2 -> v3;
      - Check for kvm_enabled() before setting cpuid_7_0_ebx_features
    
    Changes v1 -> v2:
      - Use kvm_arch_get_supported_cpuid() instead of host_cpuid() on
        cpu_x86_fill_host().
    
      We should use GET_SUPPORTED_CPUID for all bits on "-cpu host"
      eventually, but I am not changing all the other CPUID leaves because
      we may not be able to test such an intrusive change in time for 1.1.
    
    Description of the bug:
    
    Since QEMU 0.15, the CPUID information on CPUID[EAX=7,ECX=0] is being
    returned unfiltered to the guest, directly from the GET_SUPPORTED_CPUID
    return value.
    
    The problem is that this makes the resulting CPU feature flags
    unpredictable and dependent on the host CPU and kernel version. This
    breaks live-migration badly if migrating from a host CPU that supports
    some features on that CPUID leaf (running a recent kernel) to a kernel
    or host CPU that doesn't support it.
    
    Migration also is incorrect (the virtual CPU changes under the guest's
    feet) if you migrate in the opposite direction (from an old CPU/kernel
    to a new CPU/kernel), but with less serious consequences (guests
    normally query CPUID information only once on boot).
    
    Fortunately, the bug affects only users using cpudefs with level >= 7.
    
    The right behavior should be to explicitly enable those features on
    [cpudef] config sections or on the "-cpu" command-line arguments. Right
    now there is no predefined CPU model on QEMU that has those features:
    the latest Intel model we have is Sandy Bridge.
    
    I would like to get this fixed on 1.1, so I am submitting this patch,
    that enables those features only if "-cpu host" is being used (as we
    don't have any pre-defined CPU model that actually have those features).
    After 1.1 is released, we can make those features properly configurable
    on [cpudef] and -cpu configuration.
    
    One problem is: with this patch, users with the following setup:
    - Running QEMU 1.0;
    - Using a cpudef having level >= 7;
    - Running a kernel that supports the features on CPUID leaf 7; and
    - Running on a CPU that supports some features on CPUID leaf 7
    won't be able to live-migrate to QEMU 1.1. But for these users
    live-migration is already broken (they can't live-migrate to hosts with
    older CPUs or older kernels, already), I don't see how to avoid this
    problem.
    
    Signed-off-by: default avatarEduardo Habkost <ehabkost@redhat.com>
    Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
    13526728