From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org,
"Andreas Färber" <afaerber@suse.de>
Subject: Re: [RFC 12/12] pc: Generate APIC IDs according to CPU topology
Date: Fri, 11 Jan 2013 00:36:35 +0100 [thread overview]
Message-ID: <20130111003635.3eeb6f62@thinkpad.mammed.net> (raw)
In-Reply-To: <1357757632-1950-13-git-send-email-ehabkost@redhat.com>
On Wed, 9 Jan 2013 16:53:52 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:
> This keeps compatibility on machine-types pc-1.2 and older, and prints a
> warning in case the requested configuration won't get the correct
> topology.
>
> I couldn't think of a better way to warn about broken topology when in
> compat mode other than using error_report(). The warning message will be
> probably be buried in a log file somewhere, but it's better than
> nothing.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> Changes v1 -> v2:
> - Move code to cpu.c
> - keep using cpu_index on *-user
> - Use SMP.contiguous_apic_ids global property
> - Prints warning in case the compatibility mode will expose incorrect
> topology
>
> Changes v2 -> v3:
> - Now all code is inside hw/pc.c
> - Use a real "PC" class and a "contiguous_apic_ids" property
>
> Changes v3 -> v4:
> - Instead of using a global property, use a separate machine init
> function and a PCInitArgs field, to implement compatibility mode
> - Use error_report() instead of fprintf(stderr) for the warning
> - Use a field on PCInitArgs instead of a static variable to check
> if warning was already printed
>
> Changes v4 -> v5:
> - Don't use PCInitArgs: simply add a enable_compat_apic_id_mode()
> function and a static compat_apic_id_mode variable, to enable the
> compatibility mode
> - Move APIC ID calculation code to cpu.c
> ---
> hw/pc_piix.c | 13 +++++++++++--
> target-i386/cpu.c | 28 ++++++++++++++++++++++++----
> target-i386/cpu.h | 1 +
> 3 files changed, 36 insertions(+), 6 deletions(-)
>
> diff --git a/hw/pc_piix.c b/hw/pc_piix.c
> index 13d7cc8..be4fea1 100644
> --- a/hw/pc_piix.c
> +++ b/hw/pc_piix.c
> @@ -233,11 +233,18 @@ static void pc_init_pci(QEMUMachineInitArgs *args)
> initrd_filename, cpu_model, 1, 1);
> }
>
> +
> +static void pc_init_pci_1_3(QEMUMachineInitArgs *args)
> +{
> + enable_compat_apic_id_mode();
> + pc_init_pci(args);
> +}
> +
> /* PC machine init function for pc-0.14 to pc-1.2 */
> static void pc_init_pci_1_2(QEMUMachineInitArgs *args)
> {
> disable_kvm_pv_eoi();
> - pc_init_pci(args);
> + pc_init_pci_1_3(args);
> }
>
> /* PC init function for pc-0.10 to pc-0.13, and reused by xenfv */
> @@ -250,6 +257,7 @@ static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args)
> const char *initrd_filename = args->initrd_filename;
> const char *boot_device = args->boot_device;
> disable_kvm_pv_eoi();
> + enable_compat_apic_id_mode();
> pc_init1(get_system_memory(),
> get_system_io(),
> ram_size, boot_device,
> @@ -268,6 +276,7 @@ static void pc_init_isa(QEMUMachineInitArgs *args)
> if (cpu_model == NULL)
> cpu_model = "486";
> disable_kvm_pv_eoi();
> + enable_compat_apic_id_mode();
> pc_init1(get_system_memory(),
> get_system_io(),
> ram_size, boot_device,
> @@ -305,7 +314,7 @@ static QEMUMachine pc_machine_v1_4 = {
> static QEMUMachine pc_machine_v1_3 = {
> .name = "pc-1.3",
> .desc = "Standard PC",
> - .init = pc_init_pci,
> + .init = pc_init_pci_1_3,
> .max_cpus = 255,
> .compat_props = (GlobalProperty[]) {
> PC_COMPAT_1_3,
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 33787dc..f34192c 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -23,6 +23,8 @@
>
> #include "cpu.h"
> #include "sysemu/kvm.h"
> +#include "sysemu/cpus.h"
> +#include "topology.h"
>
> #include "qemu/option.h"
> #include "qemu/config-file.h"
> @@ -2192,6 +2194,14 @@ void x86_cpu_realize(Object *obj, Error **errp)
> cpu_reset(CPU(cpu));
> }
>
> +/* Enables contiguous-apic-ID mode, for compatibility */
> +static bool compat_apic_id_mode;
> +
> +void enable_compat_apic_id_mode(void)
> +{
> + compat_apic_id_mode = true;
> +}
> +
> /* Calculates initial APIC ID for a specific CPU index
> *
> * Currently we need to be able to calculate the APIC ID from the CPU index
> @@ -2201,10 +2211,20 @@ void x86_cpu_realize(Object *obj, Error **errp)
> */
> uint32_t apic_id_for_cpu(unsigned int cpu_index)
if you move ^^^ to board, there won't be need in [8/12]
> {
> - /* right now APIC ID == CPU index. this will eventually change to use
> - * the CPU topology configuration properly
> - */
> - return cpu_index;
> + uint32_t correct_id;
> + static bool warned;
> +
> + correct_id = topo_apicid_for_cpu(smp_cores, smp_threads, cpu_index);
> + if (compat_apic_id_mode) {
> + if (cpu_index != correct_id && !warned) {
> + error_report("APIC IDs set in compatibility mode, "
> + "CPU topology won't match the configuration");
> + warned = true;
> + }
> + return cpu_index;
> + } else {
> + return correct_id;
> + }
> }
>
> static void x86_cpu_initfn(Object *obj)
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index dbd9899..d9a9e8f 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -1239,5 +1239,6 @@ void disable_kvm_pv_eoi(void);
> const char *get_register_name_32(unsigned int reg);
>
> uint32_t apic_id_for_cpu(unsigned int cpu_index);
> +void enable_compat_apic_id_mode(void);
>
> #endif /* CPU_I386_H */
> --
> 1.7.11.7
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Regards,
Igor
next prev parent reply other threads:[~2013-01-10 23:36 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-09 18:53 [RFC 00/12] target-i386: Fix APIC-ID-based topology (v4) Eduardo Habkost
2013-01-09 18:53 ` [RFC 01/12] kvm: add KVM_FEATURE_CLOCKSOURCE_STABLE_BIT fake #define Eduardo Habkost
2013-01-10 23:15 ` Igor Mammedov
2013-01-11 0:05 ` Eduardo Habkost
2013-01-09 18:53 ` [RFC 02/12] target-i386: Don't set any KVM flag by default if KVM is disabled Eduardo Habkost
2013-01-10 11:47 ` Michael S. Tsirkin
2013-01-10 23:07 ` Igor Mammedov
2013-01-11 0:03 ` Eduardo Habkost
2013-01-09 18:53 ` [RFC 03/12] pc: Reverse pc_init_pci() compatibility logic Eduardo Habkost
2013-01-09 18:53 ` [RFC 04/12] kvm: Create kvm_arch_vcpu_id() function Eduardo Habkost
2013-01-09 18:53 ` [RFC 05/12] target-i386: kvm: Set vcpu_id to APIC ID instead of CPU index Eduardo Habkost
2013-01-09 18:53 ` [RFC 06/12] fw_cfg: Remove FW_CFG_MAX_CPUS from fw_cfg_init() Eduardo Habkost
2013-01-09 18:53 ` [RFC 07/12] target-i386/cpu: Introduce apic_id_for_cpu() function Eduardo Habkost
2013-01-10 23:31 ` Igor Mammedov
2013-01-10 23:51 ` Eduardo Habkost
2013-01-10 23:57 ` Eduardo Habkost
2013-01-09 18:53 ` [RFC 08/12] cpus.h: Make constant smp_cores/smp_threads available on *-user Eduardo Habkost
2013-01-09 18:53 ` [RFC 09/12] pc: Set fw_cfg data based on APIC ID calculation Eduardo Habkost
2013-01-09 18:53 ` [RFC 10/12] tests: Support target-specific unit tests Eduardo Habkost
2013-01-09 18:53 ` [RFC 11/12] target-i386: Topology & APIC ID utility functions Eduardo Habkost
2013-01-09 18:53 ` [RFC 12/12] pc: Generate APIC IDs according to CPU topology Eduardo Habkost
2013-01-10 23:36 ` Igor Mammedov [this message]
2013-01-10 23:55 ` Eduardo Habkost
2013-01-17 18:29 ` [RFC 00/12] target-i386: Fix APIC-ID-based topology (v4) 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=20130111003635.3eeb6f62@thinkpad.mammed.net \
--to=imammedo@redhat.com \
--cc=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=kvm@vger.kernel.org \
--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.