All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@web.de>
To: Vadim Rozenfeld <vrozenfe@redhat.com>
Cc: Avi Kivity <avi@redhat.com>, kvm@vger.kernel.org, qemu-devel@nongnu.org
Subject: Re: [PATCH RFC v3 1/2] hyper-v: introduce Hyper-V support infrastructure.
Date: Wed, 18 Jan 2012 21:43:47 +0100	[thread overview]
Message-ID: <4F172F03.7020505@web.de> (raw)
In-Reply-To: <4F1725F6.90501@web.de>

[-- Attachment #1: Type: text/plain, Size: 6635 bytes --]

On 2012-01-18 21:05, Jan Kiszka wrote:
> On 2011-12-18 21:48, Vadim Rozenfeld wrote:
>> ---
>>  Makefile.target      |    2 +
>>  target-i386/cpuid.c  |   14 ++++++++++
>>  target-i386/hyperv.c |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++
>>  target-i386/hyperv.h |   37 ++++++++++++++++++++++++++++
>>  4 files changed, 118 insertions(+), 0 deletions(-)
>>  create mode 100644 target-i386/hyperv.c
>>  create mode 100644 target-i386/hyperv.h
>>
>> diff --git a/Makefile.target b/Makefile.target
>> index 6e742c2..6245796 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -209,6 +209,8 @@ obj-$(CONFIG_NO_KVM) += kvm-stub.o
>>  obj-y += memory.o
>>  LIBS+=-lz
>>  
>> +obj-i386-y +=hyperv.o
>> +
>>  QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
>>  QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
>>  QEMU_CFLAGS += $(VNC_JPEG_CFLAGS)
>> diff --git a/target-i386/cpuid.c b/target-i386/cpuid.c
>> index 1e8bcff..4193df1 100644
>> --- a/target-i386/cpuid.c
>> +++ b/target-i386/cpuid.c
>> @@ -27,6 +27,8 @@
>>  #include "qemu-option.h"
>>  #include "qemu-config.h"
>>  
>> +#include "hyperv.h"
>> +
>>  /* feature flags taken from "Intel Processor Identification and the CPUID
>>   * Instruction" and AMD's "CPUID Specification".  In cases of disagreement
>>   * between feature naming conventions, aliases may be added.
>> @@ -716,6 +718,14 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
>>                      goto error;
>>                  }
>>                  x86_cpu_def->tsc_khz = tsc_freq / 1000;
>> +            } else if (!strcmp(featurestr, "hv_spinlocks")) {
>> +                char *err;
>> +                numvalue = strtoul(val, &err, 0);
>> +                if (!*val || *err) {
>> +                    fprintf(stderr, "bad numerical value %s\n", val);
>> +                    goto error;
>> +                }
>> +                hyperv_set_spinlock_retries(numvalue);
>>              } else {
>>                  fprintf(stderr, "unrecognized feature %s\n", featurestr);
>>                  goto error;
>> @@ -724,6 +734,10 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
>>              check_cpuid = 1;
>>          } else if (!strcmp(featurestr, "enforce")) {
>>              check_cpuid = enforce_cpuid = 1;
>> +        } else if (!strcmp(featurestr, "hv_relaxed")) {
>> +            hyperv_enable_relaxed_timing(true);
>> +        } else if (!strcmp(featurestr, "hv_vapic")) {
>> +            hyperv_enable_vapic_recommended(true);
>>          } else {
>>              fprintf(stderr, "feature string `%s' not in format (+feature|-feature|feature=xyz)\n", featurestr);
>>              goto error;
>> diff --git a/target-i386/hyperv.c b/target-i386/hyperv.c
>> new file mode 100644
>> index 0000000..b2e57ad
>> --- /dev/null
>> +++ b/target-i386/hyperv.c
>> @@ -0,0 +1,65 @@
>> +/*
>> + * QEMU Hyper-V support
>> + *
>> + * Copyright Red Hat, Inc. 2011
>> + *
>> + * Author: Vadim Rozenfeld     <vrozenfe@redhat.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
>> + * See the COPYING file in the top-level directory.
>> + *
>> + */
>> +
>> +#include "hyperv.h"
>> +
>> +static bool hyperv_vapic;
>> +static bool hyperv_relaxed_timing;
>> +static int hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
>> +
>> +void hyperv_enable_vapic_recommended(bool val)
>> +{
>> +    hyperv_vapic = val;
>> +}
>> +
>> +void hyperv_enable_relaxed_timing(bool val)
>> +{
>> +    hyperv_relaxed_timing = val;
>> +}
>> +
>> +void hyperv_set_spinlock_retries(int val)
>> +{
>> +    hyperv_spinlock_attempts = val;
>> +    if (hyperv_spinlock_attempts < 0xFFF) {
>> +        hyperv_spinlock_attempts = 0xFFF;
>> +    }
>> +}
>> +
>> +bool hyperv_enabled(void)
>> +{
>> +    return hyperv_hypercall_available() || hyperv_relaxed_timing_enabled();
>> +}
>> +
>> +bool hyperv_hypercall_available(void)
>> +{
>> +    if (hyperv_vapic ||
>> +        (hyperv_spinlock_attempts != HYPERV_SPINLOCK_NEVER_RETRY)) {
>> +      return true;
>> +    }
>> +    return false;
>> +}
>> +
>> +bool hyperv_vapic_recommended(void)
>> +{
>> +    return hyperv_vapic;
>> +}
>> +
>> +bool hyperv_relaxed_timing_enabled(void)
>> +{
>> +    return hyperv_relaxed_timing;
>> +}
>> +
>> +int hyperv_get_spinlock_retries(void)
>> +{
>> +    return hyperv_spinlock_attempts;
>> +}
>> +
>> diff --git a/target-i386/hyperv.h b/target-i386/hyperv.h
>> new file mode 100644
>> index 0000000..0d742f8
>> --- /dev/null
>> +++ b/target-i386/hyperv.h
>> @@ -0,0 +1,37 @@
>> +/*
>> + * QEMU Hyper-V support
>> + *
>> + * Copyright Red Hat, Inc. 2011
>> + *
>> + * Author: Vadim Rozenfeld     <vrozenfe@redhat.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
>> + * See the COPYING file in the top-level directory.
>> + *
>> + */
>> +
>> +#ifndef QEMU_HW_HYPERV_H
>> +#define QEMU_HW_HYPERV_H 1
>> +
>> +#include "qemu-common.h"
>> +#include <asm/hyperv.h>
>> +
>> +#ifndef HYPERV_SPINLOCK_NEVER_RETRY
>> +#define HYPERV_SPINLOCK_NEVER_RETRY             0xFFFFFFFF
>> +#endif
>> +
>> +#ifndef KVM_CPUID_SIGNATURE_NEXT
>> +#define KVM_CPUID_SIGNATURE_NEXT                0x40000100
>> +#endif
>> +
>> +void hyperv_enable_vapic_recommended(bool val);
>> +void hyperv_enable_relaxed_timing(bool val);
>> +void hyperv_set_spinlock_retries(int val);
>> +
>> +bool hyperv_enabled(void);
>> +bool hyperv_hypercall_available(void);
>> +bool hyperv_vapic_recommended(void);
>> +bool hyperv_relaxed_timing_enabled(void);
>> +int hyperv_get_spinlock_retries(void);
>> +
>> +#endif /* QEMU_HW_HYPERV_H */
> 
> This doesn't build for user mode as references in cpu_x86_find_by_name
> aren't available then.

Just fold this into the patch:

diff --git a/target-i386/hyperv.h b/target-i386/hyperv.h
index 0d742f8..15467bf 100644
--- a/target-i386/hyperv.h
+++ b/target-i386/hyperv.h
@@ -24,9 +24,15 @@
 #define KVM_CPUID_SIGNATURE_NEXT                0x40000100
 #endif

+#ifndef CONFIG_USER_ONLY
 void hyperv_enable_vapic_recommended(bool val);
 void hyperv_enable_relaxed_timing(bool val);
 void hyperv_set_spinlock_retries(int val);
+#else
+static inline void hyperv_enable_vapic_recommended(bool val) { }
+static inline void hyperv_enable_relaxed_timing(bool val) { }
+static inline void hyperv_set_spinlock_retries(int val) { }
+#endif

 bool hyperv_enabled(void);
 bool hyperv_hypercall_available(void);

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: Jan Kiszka <jan.kiszka@web.de>
To: Vadim Rozenfeld <vrozenfe@redhat.com>
Cc: Avi Kivity <avi@redhat.com>, kvm@vger.kernel.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH RFC v3 1/2] hyper-v: introduce Hyper-V support infrastructure.
Date: Wed, 18 Jan 2012 21:43:47 +0100	[thread overview]
Message-ID: <4F172F03.7020505@web.de> (raw)
In-Reply-To: <4F1725F6.90501@web.de>

[-- Attachment #1: Type: text/plain, Size: 6635 bytes --]

On 2012-01-18 21:05, Jan Kiszka wrote:
> On 2011-12-18 21:48, Vadim Rozenfeld wrote:
>> ---
>>  Makefile.target      |    2 +
>>  target-i386/cpuid.c  |   14 ++++++++++
>>  target-i386/hyperv.c |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++
>>  target-i386/hyperv.h |   37 ++++++++++++++++++++++++++++
>>  4 files changed, 118 insertions(+), 0 deletions(-)
>>  create mode 100644 target-i386/hyperv.c
>>  create mode 100644 target-i386/hyperv.h
>>
>> diff --git a/Makefile.target b/Makefile.target
>> index 6e742c2..6245796 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -209,6 +209,8 @@ obj-$(CONFIG_NO_KVM) += kvm-stub.o
>>  obj-y += memory.o
>>  LIBS+=-lz
>>  
>> +obj-i386-y +=hyperv.o
>> +
>>  QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
>>  QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
>>  QEMU_CFLAGS += $(VNC_JPEG_CFLAGS)
>> diff --git a/target-i386/cpuid.c b/target-i386/cpuid.c
>> index 1e8bcff..4193df1 100644
>> --- a/target-i386/cpuid.c
>> +++ b/target-i386/cpuid.c
>> @@ -27,6 +27,8 @@
>>  #include "qemu-option.h"
>>  #include "qemu-config.h"
>>  
>> +#include "hyperv.h"
>> +
>>  /* feature flags taken from "Intel Processor Identification and the CPUID
>>   * Instruction" and AMD's "CPUID Specification".  In cases of disagreement
>>   * between feature naming conventions, aliases may be added.
>> @@ -716,6 +718,14 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
>>                      goto error;
>>                  }
>>                  x86_cpu_def->tsc_khz = tsc_freq / 1000;
>> +            } else if (!strcmp(featurestr, "hv_spinlocks")) {
>> +                char *err;
>> +                numvalue = strtoul(val, &err, 0);
>> +                if (!*val || *err) {
>> +                    fprintf(stderr, "bad numerical value %s\n", val);
>> +                    goto error;
>> +                }
>> +                hyperv_set_spinlock_retries(numvalue);
>>              } else {
>>                  fprintf(stderr, "unrecognized feature %s\n", featurestr);
>>                  goto error;
>> @@ -724,6 +734,10 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
>>              check_cpuid = 1;
>>          } else if (!strcmp(featurestr, "enforce")) {
>>              check_cpuid = enforce_cpuid = 1;
>> +        } else if (!strcmp(featurestr, "hv_relaxed")) {
>> +            hyperv_enable_relaxed_timing(true);
>> +        } else if (!strcmp(featurestr, "hv_vapic")) {
>> +            hyperv_enable_vapic_recommended(true);
>>          } else {
>>              fprintf(stderr, "feature string `%s' not in format (+feature|-feature|feature=xyz)\n", featurestr);
>>              goto error;
>> diff --git a/target-i386/hyperv.c b/target-i386/hyperv.c
>> new file mode 100644
>> index 0000000..b2e57ad
>> --- /dev/null
>> +++ b/target-i386/hyperv.c
>> @@ -0,0 +1,65 @@
>> +/*
>> + * QEMU Hyper-V support
>> + *
>> + * Copyright Red Hat, Inc. 2011
>> + *
>> + * Author: Vadim Rozenfeld     <vrozenfe@redhat.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
>> + * See the COPYING file in the top-level directory.
>> + *
>> + */
>> +
>> +#include "hyperv.h"
>> +
>> +static bool hyperv_vapic;
>> +static bool hyperv_relaxed_timing;
>> +static int hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
>> +
>> +void hyperv_enable_vapic_recommended(bool val)
>> +{
>> +    hyperv_vapic = val;
>> +}
>> +
>> +void hyperv_enable_relaxed_timing(bool val)
>> +{
>> +    hyperv_relaxed_timing = val;
>> +}
>> +
>> +void hyperv_set_spinlock_retries(int val)
>> +{
>> +    hyperv_spinlock_attempts = val;
>> +    if (hyperv_spinlock_attempts < 0xFFF) {
>> +        hyperv_spinlock_attempts = 0xFFF;
>> +    }
>> +}
>> +
>> +bool hyperv_enabled(void)
>> +{
>> +    return hyperv_hypercall_available() || hyperv_relaxed_timing_enabled();
>> +}
>> +
>> +bool hyperv_hypercall_available(void)
>> +{
>> +    if (hyperv_vapic ||
>> +        (hyperv_spinlock_attempts != HYPERV_SPINLOCK_NEVER_RETRY)) {
>> +      return true;
>> +    }
>> +    return false;
>> +}
>> +
>> +bool hyperv_vapic_recommended(void)
>> +{
>> +    return hyperv_vapic;
>> +}
>> +
>> +bool hyperv_relaxed_timing_enabled(void)
>> +{
>> +    return hyperv_relaxed_timing;
>> +}
>> +
>> +int hyperv_get_spinlock_retries(void)
>> +{
>> +    return hyperv_spinlock_attempts;
>> +}
>> +
>> diff --git a/target-i386/hyperv.h b/target-i386/hyperv.h
>> new file mode 100644
>> index 0000000..0d742f8
>> --- /dev/null
>> +++ b/target-i386/hyperv.h
>> @@ -0,0 +1,37 @@
>> +/*
>> + * QEMU Hyper-V support
>> + *
>> + * Copyright Red Hat, Inc. 2011
>> + *
>> + * Author: Vadim Rozenfeld     <vrozenfe@redhat.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
>> + * See the COPYING file in the top-level directory.
>> + *
>> + */
>> +
>> +#ifndef QEMU_HW_HYPERV_H
>> +#define QEMU_HW_HYPERV_H 1
>> +
>> +#include "qemu-common.h"
>> +#include <asm/hyperv.h>
>> +
>> +#ifndef HYPERV_SPINLOCK_NEVER_RETRY
>> +#define HYPERV_SPINLOCK_NEVER_RETRY             0xFFFFFFFF
>> +#endif
>> +
>> +#ifndef KVM_CPUID_SIGNATURE_NEXT
>> +#define KVM_CPUID_SIGNATURE_NEXT                0x40000100
>> +#endif
>> +
>> +void hyperv_enable_vapic_recommended(bool val);
>> +void hyperv_enable_relaxed_timing(bool val);
>> +void hyperv_set_spinlock_retries(int val);
>> +
>> +bool hyperv_enabled(void);
>> +bool hyperv_hypercall_available(void);
>> +bool hyperv_vapic_recommended(void);
>> +bool hyperv_relaxed_timing_enabled(void);
>> +int hyperv_get_spinlock_retries(void);
>> +
>> +#endif /* QEMU_HW_HYPERV_H */
> 
> This doesn't build for user mode as references in cpu_x86_find_by_name
> aren't available then.

Just fold this into the patch:

diff --git a/target-i386/hyperv.h b/target-i386/hyperv.h
index 0d742f8..15467bf 100644
--- a/target-i386/hyperv.h
+++ b/target-i386/hyperv.h
@@ -24,9 +24,15 @@
 #define KVM_CPUID_SIGNATURE_NEXT                0x40000100
 #endif

+#ifndef CONFIG_USER_ONLY
 void hyperv_enable_vapic_recommended(bool val);
 void hyperv_enable_relaxed_timing(bool val);
 void hyperv_set_spinlock_retries(int val);
+#else
+static inline void hyperv_enable_vapic_recommended(bool val) { }
+static inline void hyperv_enable_relaxed_timing(bool val) { }
+static inline void hyperv_set_spinlock_retries(int val) { }
+#endif

 bool hyperv_enabled(void);
 bool hyperv_hypercall_available(void);

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]

  reply	other threads:[~2012-01-18 20:43 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-18 20:48 [PATCH RFC v3 0/2] Initial support for Microsoft Hyper-V Vadim Rozenfeld
2011-12-18 20:48 ` [Qemu-devel] " Vadim Rozenfeld
2011-12-18 20:48 ` [PATCH RFC v3 1/2] hyper-v: introduce Hyper-V support infrastructure Vadim Rozenfeld
2011-12-18 20:48   ` [Qemu-devel] " Vadim Rozenfeld
2012-01-18 20:05   ` Jan Kiszka
2012-01-18 20:05     ` [Qemu-devel] " Jan Kiszka
2012-01-18 20:43     ` Jan Kiszka [this message]
2012-01-18 20:43       ` Jan Kiszka
2011-12-18 20:48 ` [PATCH RFC v3 2/2] hyper-v: initialize Hyper-V CPUID leaves Vadim Rozenfeld
2011-12-18 20:48   ` [Qemu-devel] " Vadim Rozenfeld
2011-12-23 10:19 ` [PATCH RFC v3 0/2] Initial support for Microsoft Hyper-V Marcelo Tosatti
2011-12-23 10:19   ` [Qemu-devel] " Marcelo Tosatti
2012-01-09 12:08 ` Marcelo Tosatti
2012-01-09 12:08   ` [Qemu-devel] " Marcelo Tosatti

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F172F03.7020505@web.de \
    --to=jan.kiszka@web.de \
    --cc=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vrozenfe@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.