From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: "Marcel Apfelbaum" <marcel.a@redhat.com>,
"Alexander Graf" <agraf@suse.de>,
"Don Slutz" <dslutz@verizon.com>,
qemu-devel@nongnu.org, "Igor Mammedov" <imammedo@redhat.com>,
"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH v4 31/33] pc: Add default KVM features fields to PCMachineClass
Date: Thu, 14 Aug 2014 23:09:59 +0200 [thread overview]
Message-ID: <20140814210959.GB12649@redhat.com> (raw)
In-Reply-To: <1408044362-11621-32-git-send-email-ehabkost@redhat.com>
On Thu, Aug 14, 2014 at 04:26:00PM -0300, Eduardo Habkost wrote:
> With the new fields, the x86_cpu_compat_disable_kvm_features() calls on
> pc_compat_*() functions can be replace
be replaced
> by simple field initialization on
> class_init functions. This gets us one step closer to eliminating all
> pc_compat_*() functions.
>
> Those new fields may eventually become simple compat_props properties,
> if we QOMify the accelerator code, and move the KVM-specific CPUID code
> to a x86-kvm-accel class.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> hw/i386/pc.c | 15 +++++++++++++++
> hw/i386/pc_piix.c | 7 ++++---
> hw/i386/pc_q35.c | 2 +-
> include/hw/i386/pc.h | 3 +++
> target-i386/cpu.c | 25 ++++++++++++-------------
> target-i386/cpu.h | 2 +-
> 6 files changed, 36 insertions(+), 18 deletions(-)
>
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index dba7f62..a0eaaf6 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -24,6 +24,7 @@
> #include "hw/hw.h"
> #include "hw/i386/pc.h"
> #include "hw/char/serial.h"
> +#include "hw/i386/cpu.h"
> #include "hw/i386/apic.h"
> #include "hw/block/fdc.h"
> #include "hw/ide.h"
> @@ -1020,6 +1021,10 @@ void pc_cpus_init(PCMachineState *pcms, DeviceState *icc_bridge)
> Error *error = NULL;
> unsigned long apic_id_limit;
> MachineState *machine = MACHINE(pcms);
> + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
> +
> + x86_cpu_set_kvm_defaults(pcmc->kvm_default_features,
> + pcmc->kvm_default_unset_features);
>
> /* init CPUs */
> current_cpu_model = machine->cpu_model;
> @@ -1687,6 +1692,16 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
> pcmc->gigabyte_align = true;
> pcmc->has_reserved_memory = true;
> pcmc->kvmclock_enabled = true;
> + pcmc->kvm_default_features[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),
> + pcmc->kvm_default_features[FEAT_1_ECX] = CPUID_EXT_X2APIC,
> + pcmc->kvm_default_unset_features[FEAT_1_ECX] = CPUID_EXT_MONITOR,
>
> mc->get_hotplug_handler = pc_get_hotpug_handler;
> mc->default_boot_order = "cad";
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 988583c..9ec63d5 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -298,7 +298,6 @@ static void pc_compat_2_0(MachineState *machine)
> static void pc_compat_1_7(MachineState *machine)
> {
> pc_compat_2_0(machine);
> - x86_cpu_compat_disable_kvm_features(FEAT_1_ECX, CPUID_EXT_X2APIC);
> }
>
> static void pc_compat_1_6(MachineState *machine)
> @@ -325,7 +324,6 @@ static void pc_compat_1_3(MachineState *machine)
> static void pc_compat_1_2(MachineState *machine)
> {
> pc_compat_1_3(machine);
> - x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI);
> }
>
> /* PC compat function for pc-0.10 to pc-0.13 */
> @@ -386,7 +384,6 @@ static void pc_init_pci_no_kvmclock(MachineState *machine)
>
> static void pc_init_isa(MachineState *machine)
> {
> - x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI);
> pc_init1(machine);
> }
>
> @@ -494,6 +491,7 @@ static void pc_i440fx_machine_v1_7_class_init(ObjectClass *oc, void *data)
> pcmc->smbios_defaults = false;
> pcmc->gigabyte_align = false;
> pcmc->legacy_acpi_table_size = 6414;
> + pcmc->kvm_default_features[FEAT_1_ECX] &= ~CPUID_EXT_X2APIC;
> }
>
> static const TypeInfo pc_i440fx_machine_v1_7_type_info = {
> @@ -633,6 +631,7 @@ static const TypeInfo pc_machine_v1_3_type_info = {
> static void pc_machine_v1_2_class_init(ObjectClass *oc, void *data)
> {
> MachineClass *mc = MACHINE_CLASS(oc);
> + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc);
> static GlobalProperty compat_props[] = {
> PC_COMPAT_1_2,
> { /* end of list */ }
> @@ -641,6 +640,7 @@ static void pc_machine_v1_2_class_init(ObjectClass *oc, void *data)
> mc->init = pc_init_pci_1_2;
> mc->name = "pc-1.2";
> machine_class_add_compat_props(mc, compat_props);
> + pcmc->kvm_default_features[FEAT_KVM] &= ~KVM_FEATURE_PV_EOI;
> }
>
> static const TypeInfo pc_machine_v1_2_type_info = {
> @@ -984,6 +984,7 @@ static void isapc_machine_class_init(ObjectClass *oc, void *data)
> pcmc->smbios_legacy_mode = true;
> pcmc->has_reserved_memory = false;
> pcmc->compat_apic_id_mode = true;
> + pcmc->kvm_default_features[FEAT_KVM] &= ~KVM_FEATURE_PV_EOI;
> }
>
> static const TypeInfo isapc_machine_type_info = {
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 2ebd598..5878964 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -271,7 +271,6 @@ static void pc_compat_2_0(MachineState *machine)
> static void pc_compat_1_7(MachineState *machine)
> {
> pc_compat_2_0(machine);
> - x86_cpu_compat_disable_kvm_features(FEAT_1_ECX, CPUID_EXT_X2APIC);
> }
>
> static void pc_compat_1_6(MachineState *machine)
> @@ -389,6 +388,7 @@ static void pc_q35_machine_v1_7_class_init(ObjectClass *oc, void *data)
> mc->name = "pc-q35-1.7";
> pcmc->smbios_defaults = false;
> pcmc->gigabyte_align = false;
> + pcmc->kvm_default_features[FEAT_1_ECX] &= ~CPUID_EXT_X2APIC;
> }
>
> static TypeInfo pc_q35_machine_v1_7_type_info = {
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 460ff21..b7f36d6 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -8,6 +8,7 @@
> #include "hw/block/fdc.h"
> #include "net/net.h"
> #include "hw/i386/ioapic.h"
> +#include "hw/i386/cpu.h"
> #include "hw/boards.h"
>
> #include "qemu/range.h"
> @@ -66,6 +67,8 @@ struct PCMachineClass {
> bool has_reserved_memory;
> bool kvmclock_enabled;
> bool compat_apic_id_mode;
> + uint32_t kvm_default_features[FEATURE_WORDS];
> + uint32_t kvm_default_unset_features[FEATURE_WORDS];
> };
>
> typedef struct PCMachineState PCMachineState;
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index e86f99e..e02b0d9 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -446,27 +446,26 @@ typedef struct model_features_t {
>
> /* KVM-specific features that are automatically added to all CPU models
> * when KVM is enabled.
> + *
> + * The default is to enable all KVM features, but machine-types may override it
> + * to keep a stable ABI. See x86_cpu_set_kvm_defaults().
> */
> 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,
> + [FEAT_KVM] = ~0,
> };
>
> /* 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_ECX] = CPUID_EXT_MONITOR,
> -};
> +static uint32_t kvm_default_unset_features[FEATURE_WORDS];
>
> -void x86_cpu_compat_disable_kvm_features(FeatureWord w, uint32_t features)
> +/* Override default-enabled and default-disabled KVM features. Used by
> + * machine-type code to ensure a stable ABI.
> + */
> +void x86_cpu_set_kvm_defaults(uint32_t *default_set, uint32_t *default_unset)
> {
> - kvm_default_features[w] &= ~features;
> + memcpy(kvm_default_features, default_set, sizeof(kvm_default_features));
> + memcpy(kvm_default_unset_features, default_unset,
> + sizeof(kvm_default_unset_features));
> }
>
> /*
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 3f299d7..2138996 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -741,7 +741,7 @@ void do_smm_enter(X86CPU *cpu);
>
> void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
>
> -void x86_cpu_compat_disable_kvm_features(FeatureWord w, uint32_t features);
> +void x86_cpu_set_kvm_defaults(uint32_t *default_set, uint32_t *default_unset);
>
>
> /* Return name of 32-bit register, from a R_* constant */
> --
> 1.9.3
next prev parent reply other threads:[~2014-08-14 21:09 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-14 19:25 [Qemu-devel] [PATCH v4 00/33] Convert PC machine-types to QOM classes Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 01/33] pc: Replace tabs with spaces on pc.h Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 02/33] vl.c: Use qdev_prop_register_global() for single globals Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 03/33] pc: Eliminate has_pci_info global variable Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 04/33] piix: Add kvmclock_enabled, pci_enabled globals Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 05/33] piix: Eliminate pc_init_pci() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 06/33] piix: Move pc-0.14 qxl compat properties to PC_COMPAT_0_14 Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 07/33] piix: Move pc-0.13 virtio-9p-pci compat to PC_COMPAT_0_13 Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 08/33] piix: Move pc-0.1[23] rombar compat props " Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 09/33] piix: Move pc-0.11 drive version compat props to PC_COMPAT_0_11 Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 10/33] machine: Make compat_props a linked list Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 11/33] pc: Register machine classes directly instead of using QEMUMachine Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 12/33] pc: Eliminate pc_common_machine_options() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 13/33] pc: Eliminate pc_default_machine_options() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 14/33] piix: Eliminate pc_i440fx_machine_options() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 15/33] q35: Eliminate pc_q35_machine_options() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 16/33] q35: Eliminate pc_q35_1_4_machine_options() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 17/33] pc: Eliminate all *_machine_options() functions Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 18/33] machine: Eliminate QEMUMachine.compat_props Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 19/33] pc: Rename pc_machine variable to pcms Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 20/33] pc: Pass PCMachineState argument to pc_cpus_init() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 21/33] machine: Add MachineClass.default_cpu_model field Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 22/33] pc: Move globals to PCMachineClass Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 23/33] pc: Move option_rom_has_mr/rom_file_has_mr to MachineClass Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 24/33] pc: Add PCMachineClass.compat_apic_id_mode field Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 25/33] target-i386: Move error handling to end of x86_cpu_parse_featurestr() Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 26/33] target-i386: Renove underscores from feature names Eduardo Habkost
2014-08-14 19:31 ` Michael S. Tsirkin
2014-08-14 19:32 ` Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 27/33] target-i386: Register X86CPU "feat-kvmclock" feature Eduardo Habkost
2014-08-14 21:08 ` Michael S. Tsirkin
2014-08-14 23:59 ` Eduardo Habkost
2014-08-16 21:03 ` Michael S. Tsirkin
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 28/33] target-i386: set [+-]feature using QOM properties Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 29/33] pc: Use compat_props for CPUID compat bits Eduardo Habkost
2014-08-14 19:25 ` [Qemu-devel] [PATCH v4 30/33] target-i386: Move some declarations to hw/i386/cpu.h Eduardo Habkost
2014-08-14 19:26 ` [Qemu-devel] [PATCH v4 31/33] pc: Add default KVM features fields to PCMachineClass Eduardo Habkost
2014-08-14 21:09 ` Michael S. Tsirkin [this message]
2014-08-15 0:04 ` Eduardo Habkost
2014-08-14 19:26 ` [Qemu-devel] [PATCH v4 32/33] pc: Eliminate pc_compat_*() functions Eduardo Habkost
2014-08-14 19:26 ` [Qemu-devel] [PATCH v4 33/33] piix: Move pc_xen_hvm_init() closer to xenfv_machine_class_init() Eduardo Habkost
2014-08-14 20:03 ` Michael S. Tsirkin
2014-08-15 0:03 ` Eduardo Habkost
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=20140814210959.GB12649@redhat.com \
--to=mst@redhat.com \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=dslutz@verizon.com \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=marcel.a@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.