From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
qemu-devel@nongnu.org, "Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH 22/27] pc: set CPU APIC ID explicitly
Date: Thu, 1 Nov 2012 15:50:29 +0100 [thread overview]
Message-ID: <20121101155029.4dcbcc09@nial.usersys.redhat.com> (raw)
In-Reply-To: <20121101143039.GW3149@otherpad.lan.raisama.net>
On Thu, 1 Nov 2012 12:30:39 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:
> On Thu, Nov 01, 2012 at 03:04:05PM +0100, Igor Mammedov wrote:
> > On Wed, 24 Oct 2012 15:49:56 -0200
> > Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > > The PC code takes care of CPU topology, and CPU topology affect the CPU
> > > APIC ID. So the PC CPU initialization code needs to set the APIC ID
> > > explicitly.
> > >
> > > By now, keep the existing behavior but create a apic_id_for_cpu()
> > > function that will be changed later to implement appropriate
> > > topology-dependent behavior.
> > >
> > > The cpuid_apic_id field is used only at:
> > >
> > > - x86_cpu_apic_init(), called from x86_cpu_realize()
> > > - kvm_init_vcpu(), that is called from the VCPU thread
> > > created by qemu_init_vcpu(), called by x86_cpu_realize()
> > > - helper_cpuid(), called only when the VCPU is already running
> > > - kvm_arch_init_vcpu(), that's called by kvm_init_vcpu()
> > >
> > > So it's safe to change it before x86_cpu_realize() is called.
> > >
> > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> > > ---
> > > This is based on the patch that I have originally suybmitted as:
> > > Subject: pc: create apic_id_for_cpu() function (v3)
> > > ---
> > > hw/pc.c | 22 ++++++++++++++++++++++
> > > 1 file changed, 22 insertions(+)
> > >
> > > diff --git a/hw/pc.c b/hw/pc.c
> > > index 0e9a00f..eb68851 100644
> > > --- a/hw/pc.c
> > > +++ b/hw/pc.c
> > > @@ -553,6 +553,21 @@ static void bochs_bios_write(void *opaque, uint32_t
> > > addr, uint32_t val) }
> > > }
> > >
> > > +/* Calculates initial APIC ID for a specific CPU index
> > > + *
> > > + * Currently we need to be able to calculate the APIC ID from the CPU
> > > index
> > > + * alone (without requiring a CPU object), as the QEMU<->Seabios
> > > interfaces have
> > > + * no concept of "CPU index", and the NUMA tables on fw_cfg need the
> > > APIC ID of
> > > + * all CPUs up to max_cpus.
> > > + */
> > > +static uint32_t apic_id_for_cpu(PCInitArgs *args, int cpu_index)
> > > +{
> > > + /* right now APIC ID == CPU index. this will eventually change to
> > > use
> > > + * the CPU topology configuration properly
> > > + */
> > > + return cpu_index;
> > > +}
> > > +
> > > int e820_add_entry(uint64_t address, uint64_t length, uint32_t type)
> > > {
> > > int index = le32_to_cpu(e820_table.count);
> > > @@ -870,6 +885,13 @@ static void pc_cpu_init(PCInitArgs *args, int
> > > cpu_index) exit(1);
> > > }
> > >
> > > + /* Override the default APIC set by the X86CPU init function.
> > > + * We need to do that because:
> > > + * - The APIC ID depends on the CPU topology;
> > > + * - The exact APIC ID used may depend on the machine-type init
> > > arguments.
> > > + */
> > > + cpu->env.cpuid_apic_id = apic_id_for_cpu(args, cpu_index);
> > Could you create property setter for apic_id and use it here, please.
>
> I was considering doing that, but I thought it could be overkill. I will
> do it in the next version.
Reason for asking it is not to have any CPU internals dangling outside of CPU
object and have CPU created only with help of QOM/qdev calls.
Thanks!
> >
> > > +
> > > x86_cpu_realize(OBJECT(cpu), &err);
> > > if (err) {
> > > error_report("pc_cpu_init: %s\n", error_get_pretty(err));
> >
>
next prev parent reply other threads:[~2012-11-01 14:50 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-24 17:49 [Qemu-devel] Subject: [PATCH 00/27] Fix APIC-ID-based CPU topology, take 3 Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 01/27] move I/O-related definitions from qemu-common.h to a new header (qemu-stdio.h) Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 02/27] cpus.h: include qemu-stdio.h Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 03/27] hw/apic.c: rename bit functions to not conflict with bitops.h Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 04/27] target-i386: initialize APIC at CPU level Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 05/27] kvm: create kvm_arch_vcpu_id() function Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 06/27] target-i386: kvm: set vcpu_id to APIC ID instead of CPU index Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 07/27] pc: pc_init1(): always use rom_memory on pc_memory_init() call Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 08/27] pc: pc_init1(): remove MemoryRegion arguments Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 09/27] pc: pc_init1(): get QEMUMachineInitArgs argument Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 10/27] pc: create PCInitArgs struct Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 11/27] pc: add PC_DEFAULT_CPU_MODEL #define Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 12/27] pc: add PCInitArgs parameter to pc_cpus_init() Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 13/27] pc: pass PCInitArgs struct to pc_memory_init() Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 14/27] pc: use FWCfgState* instead of void* for fw_cfg data Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 15/27] pc: rename bochs_bios_init() to pc_bios_init() Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 16/27] pc: pass PCInitArgs struct " Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 17/27] xen_machine_pv: use cpu_init() instead of cpu_x86_init() Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 18/27] pc: isolate the code that create CPUs Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 19/27] cpu_x86_init: check for x86_cpu_realize() errors Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 20/27] target-i386: do not call x86_cpu_realize() on cpu_x86_init() Eduardo Habkost
2012-10-31 16:32 ` Igor Mammedov
2012-10-31 16:43 ` Andreas Färber
2012-10-31 17:10 ` Eduardo Habkost
2012-11-01 12:53 ` Igor Mammedov
2012-10-31 17:01 ` Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 21/27] fw_cfg: remove FW_CFG_MAX_CPUS from fw_cfg_init() Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 22/27] pc: set CPU APIC ID explicitly Eduardo Habkost
2012-11-01 14:04 ` Igor Mammedov
2012-11-01 14:30 ` Eduardo Habkost
2012-11-01 14:50 ` Igor Mammedov [this message]
2012-10-24 17:49 ` [Qemu-devel] [PATCH 23/27] pc: set fw_cfg data based on APIC ID calculation Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 24/27] tests: support target-specific unit tests Eduardo Habkost
2012-10-24 17:49 ` [Qemu-devel] [PATCH 25/27] target-i386: topology & APIC ID utility functions Eduardo Habkost
2012-10-24 17:50 ` [Qemu-devel] [PATCH 26/27] pc: create separate init function for pc-1.3 Eduardo Habkost
2012-10-24 18:12 ` Michael S. Tsirkin
2012-10-25 13:23 ` Eduardo Habkost
2012-10-24 17:50 ` [Qemu-devel] [PATCH 27/27] pc: generate APIC IDs according to CPU topology Eduardo Habkost
2012-11-01 14:46 ` Igor Mammedov
2012-11-01 15:16 ` 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=20121101155029.4dcbcc09@nial.usersys.redhat.com \
--to=imammedo@redhat.com \
--cc=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=pbonzini@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.