Patchwork [v3,05/17] target-i386: Add x86_set_hyperv.

login
register
mail settings
Submitter Don Slutz
Date Sept. 17, 2012, 2 p.m.
Message ID <1347890467-9728-6-git-send-email-Don@CloudSwitch.com>
Download mbox | patch
Permalink /patch/184421/
State New
Headers show

Comments

Don Slutz - Sept. 17, 2012, 2 p.m.
This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.

Signed-off-by: Don Slutz <Don@CloudSwitch.com>
---
 target-i386/cpu.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
Eduardo Habkost - Sept. 19, 2012, 7:32 p.m.
On Mon, Sep 17, 2012 at 10:00:55AM -0400, Don Slutz wrote:
> This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.
> 
> Signed-off-by: Don Slutz <Don@CloudSwitch.com>
> ---
>  target-i386/cpu.c |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 0e4a18d..4120393 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -1192,6 +1192,13 @@ static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
>  }
>  
>  #if !defined(CONFIG_USER_ONLY)
> +static void x86_set_hyperv(Object *obj, Error **errp)
> +{
> +    X86CPU *cpu = X86_CPU(obj);
> +
> +    cpu->env.cpuid_hv_level = HYPERV_CPUID_MIN;

HYPERV_CPUID_MIN is defined on linux-headers/asm-x86/hyperv.h, that is
included only if build host is linux-x86 and CONFIG_KVM is set.


> +}
> +
>  static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
>                                   const char *name, Error **errp)
>  {
> @@ -1214,6 +1221,7 @@ static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
>          return;
>      }
>      hyperv_set_spinlock_retries(value);
> +    x86_set_hyperv(obj, errp);
>  }
>  
>  static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
> @@ -1234,6 +1242,7 @@ static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
>          return;
>      }
>      hyperv_enable_relaxed_timing(value);
> +    x86_set_hyperv(obj, errp);
>  }
>  
>  static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
> @@ -1254,6 +1263,7 @@ static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
>          return;
>      }
>      hyperv_enable_vapic_recommended(value);
> +    x86_set_hyperv(obj, errp);
>  }
>  #endif
>  
> -- 
> 1.7.1
> 
>
Don Slutz - Sept. 19, 2012, 9:26 p.m.
On 09/19/12 15:32, Eduardo Habkost wrote:
> On Mon, Sep 17, 2012 at 10:00:55AM -0400, Don Slutz wrote:
>> This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.
>>
>> Signed-off-by: Don Slutz <Don@CloudSwitch.com>
>> ---
>>   target-i386/cpu.c |   10 ++++++++++
>>   1 files changed, 10 insertions(+), 0 deletions(-)
>>
>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>> index 0e4a18d..4120393 100644
>> --- a/target-i386/cpu.c
>> +++ b/target-i386/cpu.c
>> @@ -1192,6 +1192,13 @@ static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
>>   }
>>
>>   #if !defined(CONFIG_USER_ONLY)
>> +static void x86_set_hyperv(Object *obj, Error **errp)
>> +{
>> +    X86CPU *cpu = X86_CPU(obj);
>> +
>> +    cpu->env.cpuid_hv_level = HYPERV_CPUID_MIN;
> HYPERV_CPUID_MIN is defined on linux-headers/asm-x86/hyperv.h, that is
> included only if build host is linux-x86 and CONFIG_KVM is set.
>
Will fix.  I see 3 options:

1) Use the numbers like 0x40000005

2) Use QEMU defines like:
      #define CPUID_HV_LEVEL_HYPERV  0x40000005

3) Use condtional define:
      #ifndef HYPERV_CPUID_MIN
      #define CPUID_HV_LEVEL_HYPERV  0x40000005
      #else
      #define CPUID_HV_LEVEL_HYPERV  HYPERV_CPUID_MIN
      #endif

I lean to #2 of #3 and both over #1.  This is because if in the future 
if HYPERV_CPUID_MIN ever changes then a patch to QEMU needs to be done 
and considered before that change can be seen by a guest.  Note: since 
hypervisor-level=0x40000006 can be specified, this might be enough to do 
some testing.

Please advise.

>> +}
>> +
>>   static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
>>                                    const char *name, Error **errp)
>>   {
>> @@ -1214,6 +1221,7 @@ static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
>>           return;
>>       }
>>       hyperv_set_spinlock_retries(value);
>> +    x86_set_hyperv(obj, errp);
>>   }
>>
>>   static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
>> @@ -1234,6 +1242,7 @@ static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
>>           return;
>>       }
>>       hyperv_enable_relaxed_timing(value);
>> +    x86_set_hyperv(obj, errp);
>>   }
>>
>>   static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
>> @@ -1254,6 +1263,7 @@ static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
>>           return;
>>       }
>>       hyperv_enable_vapic_recommended(value);
>> +    x86_set_hyperv(obj, errp);
>>   }
>>   #endif
>>
>> --
>> 1.7.1
>>
>>
    -Don Slutz
Eduardo Habkost - Sept. 20, 2012, 4:20 p.m.
On Wed, Sep 19, 2012 at 05:26:01PM -0400, Don Slutz wrote:
> On 09/19/12 15:32, Eduardo Habkost wrote:
> >On Mon, Sep 17, 2012 at 10:00:55AM -0400, Don Slutz wrote:
> >>This is used to set the cpu object's hypervisor level to the default for Microsoft's Hypervisor.
> >>
> >>Signed-off-by: Don Slutz <Don@CloudSwitch.com>
> >>---
> >>  target-i386/cpu.c |   10 ++++++++++
> >>  1 files changed, 10 insertions(+), 0 deletions(-)
> >>
> >>diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> >>index 0e4a18d..4120393 100644
> >>--- a/target-i386/cpu.c
> >>+++ b/target-i386/cpu.c
> >>@@ -1192,6 +1192,13 @@ static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
> >>  }
> >>
> >>  #if !defined(CONFIG_USER_ONLY)
> >>+static void x86_set_hyperv(Object *obj, Error **errp)
> >>+{
> >>+    X86CPU *cpu = X86_CPU(obj);
> >>+
> >>+    cpu->env.cpuid_hv_level = HYPERV_CPUID_MIN;
> >HYPERV_CPUID_MIN is defined on linux-headers/asm-x86/hyperv.h, that is
> >included only if build host is linux-x86 and CONFIG_KVM is set.
> >
> Will fix.  I see 3 options:
> 
> 1) Use the numbers like 0x40000005

If we're going to use the number directly, it's better to have a define
for it (so #2 is better).

> 
> 2) Use QEMU defines like:
>      #define CPUID_HV_LEVEL_HYPERV  0x40000005
> 
> 3) Use condtional define:
>      #ifndef HYPERV_CPUID_MIN
>      #define CPUID_HV_LEVEL_HYPERV  0x40000005
>      #else
>      #define CPUID_HV_LEVEL_HYPERV  HYPERV_CPUID_MIN
>      #endif
> 

If QEMU is going to contain a "#define CPUID_HV_LEVEL_HYPERV 0x40000005"
in the code, I don't see a reason to try to use the definition from
asm-x86/hyperv.h if available.

So, #2 looks like the best option.

> I lean to #2 of #3 and both over #1.  This is because if in the
> future if HYPERV_CPUID_MIN ever changes then a patch to QEMU needs to
> be done and considered before that change can be seen by a guest.
> Note: since hypervisor-level=0x40000006 can be specified, this might
> be enough to do some testing.

I don't think HYPERV_CPUID_MIN will ever change, but the meaning of the
constant is not clear to me. Anyway, if it ever changes, that's another
reason for QEMU to have its own constant. The resulting CPUID bits
exposed to the guest should be a function of the machine-type and
command-line/config parameters, and nothing else (otherwise the CPUID
bits would change under the guest's feet when live-migrating).

Patch

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 0e4a18d..4120393 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1192,6 +1192,13 @@  static void x86_cpuid_set_hv_level(Object *obj, Visitor *v, void *opaque,
 }
 
 #if !defined(CONFIG_USER_ONLY)
+static void x86_set_hyperv(Object *obj, Error **errp)
+{
+    X86CPU *cpu = X86_CPU(obj);
+
+    cpu->env.cpuid_hv_level = HYPERV_CPUID_MIN;
+}
+
 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
                                  const char *name, Error **errp)
 {
@@ -1214,6 +1221,7 @@  static void x86_set_hv_spinlocks(Object *obj, Visitor *v, void *opaque,
         return;
     }
     hyperv_set_spinlock_retries(value);
+    x86_set_hyperv(obj, errp);
 }
 
 static void x86_get_hv_relaxed(Object *obj, Visitor *v, void *opaque,
@@ -1234,6 +1242,7 @@  static void x86_set_hv_relaxed(Object *obj, Visitor *v, void *opaque,
         return;
     }
     hyperv_enable_relaxed_timing(value);
+    x86_set_hyperv(obj, errp);
 }
 
 static void x86_get_hv_vapic(Object *obj, Visitor *v, void *opaque,
@@ -1254,6 +1263,7 @@  static void x86_set_hv_vapic(Object *obj, Visitor *v, void *opaque,
         return;
     }
     hyperv_enable_vapic_recommended(value);
+    x86_set_hyperv(obj, errp);
 }
 #endif