mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
i386: Update new x86_apicid parsing rules with die_offset support
In new sockets/dies/cores/threads model, the apicid of logical cpu could imply die level info of guest cpu topology thus x86_apicid_from_cpu_idx() need to be refactored with #dies value, so does apicid_*_offset(). To keep semantic compatibility, the legacy pkg_offset which helps to generate CPUIDs such as 0x3 for L3 cache should be mapping to die_offset. Signed-off-by: Like Xu <like.xu@linux.intel.com> Message-Id: <20190612084104.34984-5-like.xu@linux.intel.com> [ehabkost: squash unit test patch] Message-Id: <20190612084104.34984-6-like.xu@linux.intel.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
176d2cda0d
commit
d65af288a8
4 changed files with 124 additions and 76 deletions
27
hw/i386/pc.c
27
hw/i386/pc.c
|
@ -930,7 +930,7 @@ static uint32_t x86_cpu_apic_id_from_index(PCMachineState *pcms,
|
|||
uint32_t correct_id;
|
||||
static bool warned;
|
||||
|
||||
correct_id = x86_apicid_from_cpu_idx(ms->smp.cores,
|
||||
correct_id = x86_apicid_from_cpu_idx(pcms->smp_dies, ms->smp.cores,
|
||||
ms->smp.threads, cpu_index);
|
||||
if (pcmc->compat_apic_id_mode) {
|
||||
if (cpu_index != correct_id && !warned && !qtest_enabled()) {
|
||||
|
@ -2350,18 +2350,21 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
|||
topo.die_id = cpu->die_id;
|
||||
topo.core_id = cpu->core_id;
|
||||
topo.smt_id = cpu->thread_id;
|
||||
cpu->apic_id = apicid_from_topo_ids(smp_cores, smp_threads, &topo);
|
||||
cpu->apic_id = apicid_from_topo_ids(pcms->smp_dies, smp_cores,
|
||||
smp_threads, &topo);
|
||||
}
|
||||
|
||||
cpu_slot = pc_find_cpu_slot(MACHINE(pcms), cpu->apic_id, &idx);
|
||||
if (!cpu_slot) {
|
||||
MachineState *ms = MACHINE(pcms);
|
||||
|
||||
x86_topo_ids_from_apicid(cpu->apic_id, smp_cores, smp_threads, &topo);
|
||||
error_setg(errp, "Invalid CPU [socket: %u, core: %u, thread: %u] with"
|
||||
" APIC ID %" PRIu32 ", valid index range 0:%d",
|
||||
topo.pkg_id, topo.core_id, topo.smt_id, cpu->apic_id,
|
||||
ms->possible_cpus->len - 1);
|
||||
x86_topo_ids_from_apicid(cpu->apic_id, pcms->smp_dies,
|
||||
smp_cores, smp_threads, &topo);
|
||||
error_setg(errp,
|
||||
"Invalid CPU [socket: %u, die: %u, core: %u, thread: %u] with"
|
||||
" APIC ID %" PRIu32 ", valid index range 0:%d",
|
||||
topo.pkg_id, topo.die_id, topo.core_id, topo.smt_id,
|
||||
cpu->apic_id, ms->possible_cpus->len - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2377,7 +2380,8 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
|||
/* TODO: move socket_id/core_id/thread_id checks into x86_cpu_realizefn()
|
||||
* once -smp refactoring is complete and there will be CPU private
|
||||
* CPUState::nr_cores and CPUState::nr_threads fields instead of globals */
|
||||
x86_topo_ids_from_apicid(cpu->apic_id, smp_cores, smp_threads, &topo);
|
||||
x86_topo_ids_from_apicid(cpu->apic_id, pcms->smp_dies,
|
||||
smp_cores, smp_threads, &topo);
|
||||
if (cpu->socket_id != -1 && cpu->socket_id != topo.pkg_id) {
|
||||
error_setg(errp, "property socket-id: %u doesn't match set apic-id:"
|
||||
" 0x%x (socket-id: %u)", cpu->socket_id, cpu->apic_id, topo.pkg_id);
|
||||
|
@ -2743,10 +2747,12 @@ pc_cpu_index_to_props(MachineState *ms, unsigned cpu_index)
|
|||
static int64_t pc_get_default_cpu_node_id(const MachineState *ms, int idx)
|
||||
{
|
||||
X86CPUTopoInfo topo;
|
||||
PCMachineState *pcms = PC_MACHINE(ms);
|
||||
|
||||
assert(idx < ms->possible_cpus->len);
|
||||
x86_topo_ids_from_apicid(ms->possible_cpus->cpus[idx].arch_id,
|
||||
ms->smp.cores, ms->smp.threads, &topo);
|
||||
pcms->smp_dies, ms->smp.cores,
|
||||
ms->smp.threads, &topo);
|
||||
return topo.pkg_id % nb_numa_nodes;
|
||||
}
|
||||
|
||||
|
@ -2775,7 +2781,8 @@ static const CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *ms)
|
|||
ms->possible_cpus->cpus[i].vcpus_count = 1;
|
||||
ms->possible_cpus->cpus[i].arch_id = x86_cpu_apic_id_from_index(pcms, i);
|
||||
x86_topo_ids_from_apicid(ms->possible_cpus->cpus[i].arch_id,
|
||||
ms->smp.cores, ms->smp.threads, &topo);
|
||||
pcms->smp_dies, ms->smp.cores,
|
||||
ms->smp.threads, &topo);
|
||||
ms->possible_cpus->cpus[i].props.has_socket_id = true;
|
||||
ms->possible_cpus->cpus[i].props.socket_id = topo.pkg_id;
|
||||
ms->possible_cpus->cpus[i].props.has_die_id = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue