hw/i386: Rename X86CPUTopoInfo structure to X86CPUTopoIDs
Rename few data structures related to X86 topology. X86CPUTopoIDs will have individual arch ids. Next patch introduces X86CPUTopoInfo which will have all topology information(like cores, threads etc..). Signed-off-by: Babu Moger <babu.moger@amd.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Message-Id: <158326541877.40452.17535023236841538507.stgit@naples-babu.amd.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
143c30d4d3
commit
dcf08bc60b
45
hw/i386/pc.c
45
hw/i386/pc.c
|
@ -1505,7 +1505,7 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||||
int idx;
|
int idx;
|
||||||
CPUState *cs;
|
CPUState *cs;
|
||||||
CPUArchId *cpu_slot;
|
CPUArchId *cpu_slot;
|
||||||
X86CPUTopoInfo topo;
|
X86CPUTopoIDs topo_ids;
|
||||||
X86CPU *cpu = X86_CPU(dev);
|
X86CPU *cpu = X86_CPU(dev);
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
MachineState *ms = MACHINE(hotplug_dev);
|
MachineState *ms = MACHINE(hotplug_dev);
|
||||||
|
@ -1571,12 +1571,12 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
topo.pkg_id = cpu->socket_id;
|
topo_ids.pkg_id = cpu->socket_id;
|
||||||
topo.die_id = cpu->die_id;
|
topo_ids.die_id = cpu->die_id;
|
||||||
topo.core_id = cpu->core_id;
|
topo_ids.core_id = cpu->core_id;
|
||||||
topo.smt_id = cpu->thread_id;
|
topo_ids.smt_id = cpu->thread_id;
|
||||||
cpu->apic_id = apicid_from_topo_ids(x86ms->smp_dies, smp_cores,
|
cpu->apic_id = apicid_from_topo_ids(x86ms->smp_dies, smp_cores,
|
||||||
smp_threads, &topo);
|
smp_threads, &topo_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu_slot = pc_find_cpu_slot(MACHINE(pcms), cpu->apic_id, &idx);
|
cpu_slot = pc_find_cpu_slot(MACHINE(pcms), cpu->apic_id, &idx);
|
||||||
|
@ -1584,11 +1584,11 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||||
MachineState *ms = MACHINE(pcms);
|
MachineState *ms = MACHINE(pcms);
|
||||||
|
|
||||||
x86_topo_ids_from_apicid(cpu->apic_id, x86ms->smp_dies,
|
x86_topo_ids_from_apicid(cpu->apic_id, x86ms->smp_dies,
|
||||||
smp_cores, smp_threads, &topo);
|
smp_cores, smp_threads, &topo_ids);
|
||||||
error_setg(errp,
|
error_setg(errp,
|
||||||
"Invalid CPU [socket: %u, die: %u, core: %u, thread: %u] with"
|
"Invalid CPU [socket: %u, die: %u, core: %u, thread: %u] with"
|
||||||
" APIC ID %" PRIu32 ", valid index range 0:%d",
|
" APIC ID %" PRIu32 ", valid index range 0:%d",
|
||||||
topo.pkg_id, topo.die_id, topo.core_id, topo.smt_id,
|
topo_ids.pkg_id, topo_ids.die_id, topo_ids.core_id, topo_ids.smt_id,
|
||||||
cpu->apic_id, ms->possible_cpus->len - 1);
|
cpu->apic_id, ms->possible_cpus->len - 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1606,34 +1606,37 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||||
* once -smp refactoring is complete and there will be CPU private
|
* once -smp refactoring is complete and there will be CPU private
|
||||||
* CPUState::nr_cores and CPUState::nr_threads fields instead of globals */
|
* CPUState::nr_cores and CPUState::nr_threads fields instead of globals */
|
||||||
x86_topo_ids_from_apicid(cpu->apic_id, x86ms->smp_dies,
|
x86_topo_ids_from_apicid(cpu->apic_id, x86ms->smp_dies,
|
||||||
smp_cores, smp_threads, &topo);
|
smp_cores, smp_threads, &topo_ids);
|
||||||
if (cpu->socket_id != -1 && cpu->socket_id != topo.pkg_id) {
|
if (cpu->socket_id != -1 && cpu->socket_id != topo_ids.pkg_id) {
|
||||||
error_setg(errp, "property socket-id: %u doesn't match set apic-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);
|
" 0x%x (socket-id: %u)", cpu->socket_id, cpu->apic_id,
|
||||||
|
topo_ids.pkg_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cpu->socket_id = topo.pkg_id;
|
cpu->socket_id = topo_ids.pkg_id;
|
||||||
|
|
||||||
if (cpu->die_id != -1 && cpu->die_id != topo.die_id) {
|
if (cpu->die_id != -1 && cpu->die_id != topo_ids.die_id) {
|
||||||
error_setg(errp, "property die-id: %u doesn't match set apic-id:"
|
error_setg(errp, "property die-id: %u doesn't match set apic-id:"
|
||||||
" 0x%x (die-id: %u)", cpu->die_id, cpu->apic_id, topo.die_id);
|
" 0x%x (die-id: %u)", cpu->die_id, cpu->apic_id, topo_ids.die_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cpu->die_id = topo.die_id;
|
cpu->die_id = topo_ids.die_id;
|
||||||
|
|
||||||
if (cpu->core_id != -1 && cpu->core_id != topo.core_id) {
|
if (cpu->core_id != -1 && cpu->core_id != topo_ids.core_id) {
|
||||||
error_setg(errp, "property core-id: %u doesn't match set apic-id:"
|
error_setg(errp, "property core-id: %u doesn't match set apic-id:"
|
||||||
" 0x%x (core-id: %u)", cpu->core_id, cpu->apic_id, topo.core_id);
|
" 0x%x (core-id: %u)", cpu->core_id, cpu->apic_id,
|
||||||
|
topo_ids.core_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cpu->core_id = topo.core_id;
|
cpu->core_id = topo_ids.core_id;
|
||||||
|
|
||||||
if (cpu->thread_id != -1 && cpu->thread_id != topo.smt_id) {
|
if (cpu->thread_id != -1 && cpu->thread_id != topo_ids.smt_id) {
|
||||||
error_setg(errp, "property thread-id: %u doesn't match set apic-id:"
|
error_setg(errp, "property thread-id: %u doesn't match set apic-id:"
|
||||||
" 0x%x (thread-id: %u)", cpu->thread_id, cpu->apic_id, topo.smt_id);
|
" 0x%x (thread-id: %u)", cpu->thread_id, cpu->apic_id,
|
||||||
|
topo_ids.smt_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cpu->thread_id = topo.smt_id;
|
cpu->thread_id = topo_ids.smt_id;
|
||||||
|
|
||||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_VPINDEX) &&
|
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_VPINDEX) &&
|
||||||
!kvm_hv_vpindex_settable()) {
|
!kvm_hv_vpindex_settable()) {
|
||||||
|
|
|
@ -143,14 +143,14 @@ x86_cpu_index_to_props(MachineState *ms, unsigned cpu_index)
|
||||||
|
|
||||||
int64_t x86_get_default_cpu_node_id(const MachineState *ms, int idx)
|
int64_t x86_get_default_cpu_node_id(const MachineState *ms, int idx)
|
||||||
{
|
{
|
||||||
X86CPUTopoInfo topo;
|
X86CPUTopoIDs topo_ids;
|
||||||
X86MachineState *x86ms = X86_MACHINE(ms);
|
X86MachineState *x86ms = X86_MACHINE(ms);
|
||||||
|
|
||||||
assert(idx < ms->possible_cpus->len);
|
assert(idx < ms->possible_cpus->len);
|
||||||
x86_topo_ids_from_apicid(ms->possible_cpus->cpus[idx].arch_id,
|
x86_topo_ids_from_apicid(ms->possible_cpus->cpus[idx].arch_id,
|
||||||
x86ms->smp_dies, ms->smp.cores,
|
x86ms->smp_dies, ms->smp.cores,
|
||||||
ms->smp.threads, &topo);
|
ms->smp.threads, &topo_ids);
|
||||||
return topo.pkg_id % ms->numa_state->num_nodes;
|
return topo_ids.pkg_id % ms->numa_state->num_nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms)
|
const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms)
|
||||||
|
@ -172,7 +172,7 @@ const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms)
|
||||||
sizeof(CPUArchId) * max_cpus);
|
sizeof(CPUArchId) * max_cpus);
|
||||||
ms->possible_cpus->len = max_cpus;
|
ms->possible_cpus->len = max_cpus;
|
||||||
for (i = 0; i < ms->possible_cpus->len; i++) {
|
for (i = 0; i < ms->possible_cpus->len; i++) {
|
||||||
X86CPUTopoInfo topo;
|
X86CPUTopoIDs topo_ids;
|
||||||
|
|
||||||
ms->possible_cpus->cpus[i].type = ms->cpu_type;
|
ms->possible_cpus->cpus[i].type = ms->cpu_type;
|
||||||
ms->possible_cpus->cpus[i].vcpus_count = 1;
|
ms->possible_cpus->cpus[i].vcpus_count = 1;
|
||||||
|
@ -180,17 +180,17 @@ const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms)
|
||||||
x86_cpu_apic_id_from_index(x86ms, i);
|
x86_cpu_apic_id_from_index(x86ms, i);
|
||||||
x86_topo_ids_from_apicid(ms->possible_cpus->cpus[i].arch_id,
|
x86_topo_ids_from_apicid(ms->possible_cpus->cpus[i].arch_id,
|
||||||
x86ms->smp_dies, ms->smp.cores,
|
x86ms->smp_dies, ms->smp.cores,
|
||||||
ms->smp.threads, &topo);
|
ms->smp.threads, &topo_ids);
|
||||||
ms->possible_cpus->cpus[i].props.has_socket_id = true;
|
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.socket_id = topo_ids.pkg_id;
|
||||||
if (x86ms->smp_dies > 1) {
|
if (x86ms->smp_dies > 1) {
|
||||||
ms->possible_cpus->cpus[i].props.has_die_id = true;
|
ms->possible_cpus->cpus[i].props.has_die_id = true;
|
||||||
ms->possible_cpus->cpus[i].props.die_id = topo.die_id;
|
ms->possible_cpus->cpus[i].props.die_id = topo_ids.die_id;
|
||||||
}
|
}
|
||||||
ms->possible_cpus->cpus[i].props.has_core_id = true;
|
ms->possible_cpus->cpus[i].props.has_core_id = true;
|
||||||
ms->possible_cpus->cpus[i].props.core_id = topo.core_id;
|
ms->possible_cpus->cpus[i].props.core_id = topo_ids.core_id;
|
||||||
ms->possible_cpus->cpus[i].props.has_thread_id = true;
|
ms->possible_cpus->cpus[i].props.has_thread_id = true;
|
||||||
ms->possible_cpus->cpus[i].props.thread_id = topo.smt_id;
|
ms->possible_cpus->cpus[i].props.thread_id = topo_ids.smt_id;
|
||||||
}
|
}
|
||||||
return ms->possible_cpus;
|
return ms->possible_cpus;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,12 +45,12 @@
|
||||||
*/
|
*/
|
||||||
typedef uint32_t apic_id_t;
|
typedef uint32_t apic_id_t;
|
||||||
|
|
||||||
typedef struct X86CPUTopoInfo {
|
typedef struct X86CPUTopoIDs {
|
||||||
unsigned pkg_id;
|
unsigned pkg_id;
|
||||||
unsigned die_id;
|
unsigned die_id;
|
||||||
unsigned core_id;
|
unsigned core_id;
|
||||||
unsigned smt_id;
|
unsigned smt_id;
|
||||||
} X86CPUTopoInfo;
|
} X86CPUTopoIDs;
|
||||||
|
|
||||||
/* Return the bit width needed for 'count' IDs
|
/* Return the bit width needed for 'count' IDs
|
||||||
*/
|
*/
|
||||||
|
@ -122,12 +122,15 @@ static inline unsigned apicid_pkg_offset(unsigned nr_dies,
|
||||||
static inline apic_id_t apicid_from_topo_ids(unsigned nr_dies,
|
static inline apic_id_t apicid_from_topo_ids(unsigned nr_dies,
|
||||||
unsigned nr_cores,
|
unsigned nr_cores,
|
||||||
unsigned nr_threads,
|
unsigned nr_threads,
|
||||||
const X86CPUTopoInfo *topo)
|
const X86CPUTopoIDs *topo_ids)
|
||||||
{
|
{
|
||||||
return (topo->pkg_id << apicid_pkg_offset(nr_dies, nr_cores, nr_threads)) |
|
return (topo_ids->pkg_id <<
|
||||||
(topo->die_id << apicid_die_offset(nr_dies, nr_cores, nr_threads)) |
|
apicid_pkg_offset(nr_dies, nr_cores, nr_threads)) |
|
||||||
(topo->core_id << apicid_core_offset(nr_dies, nr_cores, nr_threads)) |
|
(topo_ids->die_id <<
|
||||||
topo->smt_id;
|
apicid_die_offset(nr_dies, nr_cores, nr_threads)) |
|
||||||
|
(topo_ids->core_id <<
|
||||||
|
apicid_core_offset(nr_dies, nr_cores, nr_threads)) |
|
||||||
|
topo_ids->smt_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate thread/core/package IDs for a specific topology,
|
/* Calculate thread/core/package IDs for a specific topology,
|
||||||
|
@ -137,12 +140,12 @@ static inline void x86_topo_ids_from_idx(unsigned nr_dies,
|
||||||
unsigned nr_cores,
|
unsigned nr_cores,
|
||||||
unsigned nr_threads,
|
unsigned nr_threads,
|
||||||
unsigned cpu_index,
|
unsigned cpu_index,
|
||||||
X86CPUTopoInfo *topo)
|
X86CPUTopoIDs *topo_ids)
|
||||||
{
|
{
|
||||||
topo->pkg_id = cpu_index / (nr_dies * nr_cores * nr_threads);
|
topo_ids->pkg_id = cpu_index / (nr_dies * nr_cores * nr_threads);
|
||||||
topo->die_id = cpu_index / (nr_cores * nr_threads) % nr_dies;
|
topo_ids->die_id = cpu_index / (nr_cores * nr_threads) % nr_dies;
|
||||||
topo->core_id = cpu_index / nr_threads % nr_cores;
|
topo_ids->core_id = cpu_index / nr_threads % nr_cores;
|
||||||
topo->smt_id = cpu_index % nr_threads;
|
topo_ids->smt_id = cpu_index % nr_threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calculate thread/core/package IDs for a specific topology,
|
/* Calculate thread/core/package IDs for a specific topology,
|
||||||
|
@ -152,17 +155,18 @@ static inline void x86_topo_ids_from_apicid(apic_id_t apicid,
|
||||||
unsigned nr_dies,
|
unsigned nr_dies,
|
||||||
unsigned nr_cores,
|
unsigned nr_cores,
|
||||||
unsigned nr_threads,
|
unsigned nr_threads,
|
||||||
X86CPUTopoInfo *topo)
|
X86CPUTopoIDs *topo_ids)
|
||||||
{
|
{
|
||||||
topo->smt_id = apicid &
|
topo_ids->smt_id = apicid &
|
||||||
~(0xFFFFFFFFUL << apicid_smt_width(nr_dies, nr_cores, nr_threads));
|
~(0xFFFFFFFFUL << apicid_smt_width(nr_dies, nr_cores, nr_threads));
|
||||||
topo->core_id =
|
topo_ids->core_id =
|
||||||
(apicid >> apicid_core_offset(nr_dies, nr_cores, nr_threads)) &
|
(apicid >> apicid_core_offset(nr_dies, nr_cores, nr_threads)) &
|
||||||
~(0xFFFFFFFFUL << apicid_core_width(nr_dies, nr_cores, nr_threads));
|
~(0xFFFFFFFFUL << apicid_core_width(nr_dies, nr_cores, nr_threads));
|
||||||
topo->die_id =
|
topo_ids->die_id =
|
||||||
(apicid >> apicid_die_offset(nr_dies, nr_cores, nr_threads)) &
|
(apicid >> apicid_die_offset(nr_dies, nr_cores, nr_threads)) &
|
||||||
~(0xFFFFFFFFUL << apicid_die_width(nr_dies, nr_cores, nr_threads));
|
~(0xFFFFFFFFUL << apicid_die_width(nr_dies, nr_cores, nr_threads));
|
||||||
topo->pkg_id = apicid >> apicid_pkg_offset(nr_dies, nr_cores, nr_threads);
|
topo_ids->pkg_id =
|
||||||
|
apicid >> apicid_pkg_offset(nr_dies, nr_cores, nr_threads);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make APIC ID for the CPU 'cpu_index'
|
/* Make APIC ID for the CPU 'cpu_index'
|
||||||
|
@ -174,9 +178,9 @@ static inline apic_id_t x86_apicid_from_cpu_idx(unsigned nr_dies,
|
||||||
unsigned nr_threads,
|
unsigned nr_threads,
|
||||||
unsigned cpu_index)
|
unsigned cpu_index)
|
||||||
{
|
{
|
||||||
X86CPUTopoInfo topo;
|
X86CPUTopoIDs topo_ids;
|
||||||
x86_topo_ids_from_idx(nr_dies, nr_cores, nr_threads, cpu_index, &topo);
|
x86_topo_ids_from_idx(nr_dies, nr_cores, nr_threads, cpu_index, &topo_ids);
|
||||||
return apicid_from_topo_ids(nr_dies, nr_cores, nr_threads, &topo);
|
return apicid_from_topo_ids(nr_dies, nr_cores, nr_threads, &topo_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HW_I386_TOPOLOGY_H */
|
#endif /* HW_I386_TOPOLOGY_H */
|
||||||
|
|
Loading…
Reference in a new issue