From: Paolo Bonzini <pbonzini@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>, qemu-devel@nongnu.org
Cc: "Igor Mammedov" <imammedo@redhat.com>,
"Andreas Färber" <afaerber@suse.de>,
"Richard Henderson" <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH 2/4] target-i386: Convert kvm_default_*features to property/value pairs
Date: Mon, 14 Sep 2015 10:32:14 +0200 [thread overview]
Message-ID: <55F6860E.8080504@redhat.com> (raw)
In-Reply-To: <1441999509-26881-3-git-send-email-ehabkost@redhat.com>
On 11/09/2015 21:25, Eduardo Habkost wrote:
> Convert the kvm_default_features and kvm_default_unset_features arrays
> into a simple list of property/value pairs that will be applied to
> X86CPU objects when using KVM.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> hw/i386/pc_piix.c | 8 ++---
> hw/i386/pc_q35.c | 4 +--
> target-i386/cpu.c | 87 ++++++++++++++++++++++++++++++++-----------------------
> target-i386/cpu.h | 11 +++++--
> 4 files changed, 65 insertions(+), 45 deletions(-)
>
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 3f925b2..e79ef0d 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -325,7 +325,7 @@ static void pc_compat_2_1(MachineState *machine)
>
> pc_compat_2_2(machine);
> smbios_uuid_encoded = false;
> - x86_cpu_compat_kvm_no_autodisable(FEAT_8000_0001_ECX, CPUID_EXT3_SVM);
> + x86_cpu_change_kvm_default("svm", NULL);
> pcms->enforce_aligned_dimm = false;
> }
>
> @@ -361,7 +361,7 @@ static void pc_compat_1_7(MachineState *machine)
> gigabyte_align = false;
> option_rom_has_mr = true;
> legacy_acpi_table_size = 6414;
> - x86_cpu_compat_kvm_no_autoenable(FEAT_1_ECX, CPUID_EXT_X2APIC);
> + x86_cpu_change_kvm_default("x2apic", NULL);
> }
>
> static void pc_compat_1_6(MachineState *machine)
> @@ -391,7 +391,7 @@ static void pc_compat_1_3(MachineState *machine)
> static void pc_compat_1_2(MachineState *machine)
> {
> pc_compat_1_3(machine);
> - x86_cpu_compat_kvm_no_autoenable(FEAT_KVM, 1 << KVM_FEATURE_PV_EOI);
> + x86_cpu_change_kvm_default("kvm-pv-eoi", NULL);
> }
>
> /* PC compat function for pc-0.10 to pc-0.13 */
> @@ -414,7 +414,7 @@ static void pc_init_isa(MachineState *machine)
> if (!machine->cpu_model) {
> machine->cpu_model = "486";
> }
> - x86_cpu_compat_kvm_no_autoenable(FEAT_KVM, 1 << KVM_FEATURE_PV_EOI);
> + x86_cpu_change_kvm_default("kvm-pv-eoi", NULL);
> enable_compat_apic_id_mode();
> pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
> }
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 11601ab..c17d9df 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -309,7 +309,7 @@ static void pc_compat_2_1(MachineState *machine)
> pc_compat_2_2(machine);
> pcms->enforce_aligned_dimm = false;
> smbios_uuid_encoded = false;
> - x86_cpu_compat_kvm_no_autodisable(FEAT_8000_0001_ECX, CPUID_EXT3_SVM);
> + x86_cpu_change_kvm_default("svm", NULL);
> }
>
> static void pc_compat_2_0(MachineState *machine)
> @@ -326,7 +326,7 @@ static void pc_compat_1_7(MachineState *machine)
> smbios_defaults = false;
> gigabyte_align = false;
> option_rom_has_mr = true;
> - x86_cpu_compat_kvm_no_autoenable(FEAT_1_ECX, CPUID_EXT_X2APIC);
> + x86_cpu_change_kvm_default("x2apic", NULL);
> }
>
> static void pc_compat_1_6(MachineState *machine)
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index d505743..9a4bfa3 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -478,38 +478,6 @@ const char *get_register_name_32(unsigned int reg)
> return x86_reg_info_32[reg].name;
> }
>
> -/* KVM-specific features that are automatically added to all CPU models
> - * when KVM is enabled.
> - */
> -static uint32_t kvm_default_features[FEATURE_WORDS] = {
> - [FEAT_KVM] = (1 << KVM_FEATURE_CLOCKSOURCE) |
> - (1 << KVM_FEATURE_NOP_IO_DELAY) |
> - (1 << KVM_FEATURE_CLOCKSOURCE2) |
> - (1 << KVM_FEATURE_ASYNC_PF) |
> - (1 << KVM_FEATURE_STEAL_TIME) |
> - (1 << KVM_FEATURE_PV_EOI) |
> - (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT),
> - [FEAT_1_ECX] = CPUID_EXT_X2APIC,
> -};
> -
> -/* Features that are not added by default to any CPU model when KVM is enabled.
> - */
> -static uint32_t kvm_default_unset_features[FEATURE_WORDS] = {
> - [FEAT_1_EDX] = CPUID_ACPI,
> - [FEAT_1_ECX] = CPUID_EXT_MONITOR,
> - [FEAT_8000_0001_ECX] = CPUID_EXT3_SVM,
> -};
> -
> -void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features)
> -{
> - kvm_default_features[w] &= ~features;
> -}
> -
> -void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features)
> -{
> - kvm_default_unset_features[w] &= ~features;
> -}
> -
> /*
> * Returns the set of feature flags that are supported and migratable by
> * QEMU, for a given FeatureWord.
> @@ -1398,6 +1366,43 @@ static X86CPUDefinition builtin_x86_defs[] = {
> },
> };
>
> +typedef struct PropValue {
> + const char *prop, *value;
> +} PropValue;
> +
> +/* KVM-specific features that are automatically added/removed
> + * from all CPU models when KVM is enabled.
> + */
> +static PropValue kvm_default_props[] = {
> + { "kvmclock", "on" },
> + { "kvm-nopiodelay", "on" },
> + { "kvm-asyncpf", "on" },
> + { "kvm-steal-time", "on" },
> + { "kvm-pv-eoi", "on" },
> + { "kvmclock-stable-bit", "on" },
> + { "x2apic", "on" },
> + { "acpi", "off" },
> + { "monitor", "off" },
> + { "svm", "off" },
> + { NULL, NULL },
> +};
> +
> +void x86_cpu_change_kvm_default(const char *prop, const char *value)
> +{
> + PropValue *pv;
> + for (pv = kvm_default_props; pv->prop; pv++) {
> + if (!strcmp(pv->prop, prop)) {
> + pv->value = value;
> + break;
> + }
> + }
> +
> + /* It is valid to call this function only for properties that
> + * are already present in the kvm_default_props table.
> + */
> + assert(pv->prop);
> +}
> +
> static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
> bool migratable_only);
>
> @@ -2067,6 +2072,18 @@ static int x86_cpu_filter_features(X86CPU *cpu)
> return rv;
> }
>
> +static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
> +{
> + PropValue *pv;
> + for (pv = props; pv->prop; pv++) {
> + if (!pv->value) {
> + continue;
> + }
> + object_property_parse(OBJECT(cpu), pv->value, pv->prop,
> + &error_abort);
> + }
> +}
> +
> /* Load data from X86CPUDefinition
> */
> static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
> @@ -2090,11 +2107,7 @@ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
>
> /* Special cases not set in the X86CPUDefinition structs: */
> if (kvm_enabled()) {
> - FeatureWord w;
> - for (w = 0; w < FEATURE_WORDS; w++) {
> - env->features[w] |= kvm_default_features[w];
> - env->features[w] &= ~kvm_default_unset_features[w];
> - }
> + x86_cpu_apply_props(cpu, kvm_default_props);
> }
>
> env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 74b674d..f7c733b 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -1332,8 +1332,15 @@ void cpu_smm_update(X86CPU *cpu);
>
> void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
>
> -void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features);
> -void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features);
> +/* Change the value of a KVM-specific default
> + *
> + * If value is NULL, no default will be set and the original
> + * value from the CPU model table will be kept.
> + *
> + * It is valid to call this funciton only for properties that
> + * are already present in the kvm_default_props table.
> + */
> +void x86_cpu_change_kvm_default(const char *prop, const char *value);
>
>
> /* Return name of 32-bit register, from a R_* constant */
>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
next prev parent reply other threads:[~2015-09-14 8:32 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-11 19:25 [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default Eduardo Habkost
2015-09-11 19:25 ` [Qemu-devel] [PATCH 1/4] target-i386: Expand PPRO_FEATURES on qemu64/qemu32 definitions Eduardo Habkost
2015-09-11 19:25 ` [Qemu-devel] [PATCH 2/4] target-i386: Convert kvm_default_*features to property/value pairs Eduardo Habkost
2015-09-14 8:32 ` Paolo Bonzini [this message]
2015-09-18 18:06 ` Eduardo Habkost
2015-09-11 19:25 ` [Qemu-devel] [PATCH 3/4] target-i386: Add optional class name to kvm_default_props Eduardo Habkost
2015-09-11 19:25 ` [Qemu-devel] [PATCH 4/4] target-i386: Disable DE on qemu64 & qemu32 on TCG Eduardo Habkost
2015-09-11 19:32 ` [Qemu-devel] [PATCH 0/4] target-i386: Don't try to enable unsupported TCG features by default Richard Henderson
2015-09-11 19:58 ` Eduardo Habkost
2015-09-12 21:03 ` Paolo Bonzini
2015-09-14 14:56 ` Eduardo Habkost
2015-09-14 17:21 ` Richard Henderson
2015-09-14 17:23 ` Paolo Bonzini
2015-09-14 17:31 ` Richard Henderson
2015-09-14 20:18 ` Paolo Bonzini
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=55F6860E.8080504@redhat.com \
--to=pbonzini@redhat.com \
--cc=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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.