From: "Andreas Färber" <afaerber@suse.de>
To: Igor Mammedov <imammedo@redhat.com>
Cc: zhugh.fnst@cn.fujitsu.com, Eduardo Habkost <ehabkost@redhat.com>,
qemu-devel@nongnu.org, tangchen@cn.fujitsu.com,
Gu Zheng <guz.fnst@cn.fujitsu.com>,
isimatu.yasuaki@jp.fujitsu.com, anshul.makkar@profitbricks.com,
chen.fan.fnst@cn.fujitsu.com, Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 6/6] target-i386: Call cpu_exec_init() on realize
Date: Thu, 05 Mar 2015 17:44:58 +0100 [thread overview]
Message-ID: <54F8880A.6050908@suse.de> (raw)
In-Reply-To: <20150305174253.41582208@nial.brq.redhat.com>
Am 05.03.2015 um 17:42 schrieb Igor Mammedov:
> On Thu, 5 Mar 2015 12:38:50 -0300
> Eduardo Habkost <ehabkost@redhat.com> wrote:
>
>> To allow new code to ask the CPU classes for CPU model information and
>> allow QOM properties to be queried by qmp_device_list_properties(), we
>> need to be able to safely instantiate a X86CPU object without any
>> side-effects.
>>
>> cpu_exec_init() has lots of side-effects on global QEMU state, move it
>> to realize so it will be called only if the X86CPU instance is realized.
>>
>> For reference, this is the current cpu_exec_init() code:
>>
>>> void cpu_exec_init(CPUArchState *env)
>>> {
>>> CPUState *cpu = ENV_GET_CPU(env);
>>> CPUClass *cc = CPU_GET_CLASS(cpu);
>>> CPUState *some_cpu;
>>> int cpu_index;
>>>
>>> #ifndef CONFIG_USER_ONLY
>>> cpu->as = &address_space_memory;
>>> cpu->thread_id = qemu_get_thread_id();
>>> #endif
>>
>> Those fields should be used only after actually starting the VCPU and can be
>> initialized on realize.
>>
>>>
>>> #if defined(CONFIG_USER_ONLY)
>>> cpu_list_lock();
>>> #endif
>>> cpu_index = 0;
>>> CPU_FOREACH(some_cpu) {
>>> cpu_index++;
>>> }
>>> cpu->cpu_index = cpu_index;
>>> QTAILQ_INSERT_TAIL(&cpus, cpu, node);
>>> #if defined(CONFIG_USER_ONLY)
>>> cpu_list_unlock();
>>> #endif
>>
>> The above initializes cpu_index and add the CPU to the global CPU list.
>> This affects QEMU global state and must be done only on realize.
>>
>>> if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
>>> vmstate_register(NULL, cpu_index, &vmstate_cpu_common, cpu);
>>> }
>>> #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
>>> register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
>>> cpu_save, cpu_load, env);
>>> assert(cc->vmsd == NULL);
>>> assert(qdev_get_vmsd(DEVICE(cpu)) == NULL);
>>> #endif
>>> if (cc->vmsd != NULL) {
>>> vmstate_register(NULL, cpu_index, cc->vmsd, cpu);
>>> }
>>
>> vmstate and savevm registration also affects global QEMU state and should be
>> done only on realize.
>>
>>> }
>>
>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
>> ---
>> target-i386/cpu.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
>> index 400b1e0..8b76604 100644
>> --- a/target-i386/cpu.c
>> +++ b/target-i386/cpu.c
>> @@ -2758,6 +2758,8 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
>> static bool ht_warned;
>> static bool tcg_initialized;
>>
>> + cpu_exec_init(env);
>> +
>> if (tcg_enabled() && !tcg_initialized) {
>> tcg_initialized = 1;
>> tcg_x86_init();
>> @@ -2840,7 +2842,6 @@ static void x86_cpu_initfn(Object *obj)
>> CPUX86State *env = &cpu->env;
>>
>> cs->env_ptr = env;
>> - cpu_exec_init(env);
> looks wrong, later in this function we do
> env->cpuid_apic_id = x86_cpu_apic_id_from_index(cs->cpu_index);
> and with this patch will always yield 0
Being tackled in Eduardo's APIC series. ;)
Cheers,
Andreas
--
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Jennifer Guild, Dilip Upmanyu,
Graham Norton; HRB 21284 (AG Nürnberg)
next prev parent reply other threads:[~2015-03-05 16:45 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-05 15:38 [Qemu-devel] [PATCH 0/6] target-i386: Remove side-effects from X86CPU::instance_init Eduardo Habkost
2015-03-05 15:38 ` [Qemu-devel] [PATCH 1/6] cpu: No need to zero-initialize numa_node Eduardo Habkost
2015-03-05 16:13 ` Igor Mammedov
2015-03-05 15:38 ` [Qemu-devel] [PATCH 2/6] cpu: Initialize breakpoint/watchpoint lists on cpu_common_initfn() Eduardo Habkost
2015-03-05 16:15 ` Igor Mammedov
2015-03-05 15:38 ` [Qemu-devel] [PATCH 3/6] cpu: Reorder cpu->as and cpu->thread_id initialization Eduardo Habkost
2015-03-05 16:22 ` Igor Mammedov
2015-03-05 15:38 ` [Qemu-devel] [PATCH 4/6] target-i386: Rename optimize_flags_init() Eduardo Habkost
2015-03-05 16:31 ` Igor Mammedov
2015-03-05 16:38 ` Eduardo Habkost
2015-03-05 15:38 ` [Qemu-devel] [PATCH 5/6] target-i386: Move TCG initialization to realize time Eduardo Habkost
2015-03-05 15:38 ` [Qemu-devel] [PATCH 6/6] target-i386: Call cpu_exec_init() on realize Eduardo Habkost
2015-03-05 16:42 ` Igor Mammedov
2015-03-05 16:44 ` Andreas Färber [this message]
2015-03-05 16:48 ` Eduardo Habkost
2015-03-05 16:52 ` [Qemu-devel] [PATCH 0/6] target-i386: Remove side-effects from X86CPU::instance_init 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=54F8880A.6050908@suse.de \
--to=afaerber@suse.de \
--cc=anshul.makkar@profitbricks.com \
--cc=chen.fan.fnst@cn.fujitsu.com \
--cc=ehabkost@redhat.com \
--cc=guz.fnst@cn.fujitsu.com \
--cc=imammedo@redhat.com \
--cc=isimatu.yasuaki@jp.fujitsu.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=tangchen@cn.fujitsu.com \
--cc=zhugh.fnst@cn.fujitsu.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.