提交 c26ae610 编写于 作者: L Like Xu 提交者: Eduardo Habkost

i386: Add die-level cpu topology to x86CPU on PCMachine

The die-level as the first PC-specific cpu topology is added to the leagcy
cpu topology model, which has one die per package implicitly and only the
numbers of sockets/cores/threads are configurable.

In the new model with die-level support, the total number of logical
processors (including offline) on board will be calculated as:

     #cpus = #sockets * #dies * #cores * #threads

and considering compatibility, the default value for #dies would be
initialized to one in x86_cpu_initfn() and pc_machine_initfn().
Signed-off-by: NLike Xu <like.xu@linux.intel.com>
Message-Id: <20190612084104.34984-2-like.xu@linux.intel.com>
Reviewed-by: NEduardo Habkost <ehabkost@redhat.com>
Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
上级 a5e0b331
...@@ -2303,9 +2303,13 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev, ...@@ -2303,9 +2303,13 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
return; return;
} }
/* if APIC ID is not set, set it based on socket/core/thread properties */ /*
* If APIC ID is not set,
* set it based on socket/die/core/thread properties.
*/
if (cpu->apic_id == UNASSIGNED_APIC_ID) { if (cpu->apic_id == UNASSIGNED_APIC_ID) {
int max_socket = (ms->smp.max_cpus - 1) / smp_threads / smp_cores; int max_socket = (ms->smp.max_cpus - 1) /
smp_threads / smp_cores / pcms->smp_dies;
if (cpu->socket_id < 0) { if (cpu->socket_id < 0) {
error_setg(errp, "CPU socket-id is not set"); error_setg(errp, "CPU socket-id is not set");
...@@ -2684,6 +2688,7 @@ static void pc_machine_initfn(Object *obj) ...@@ -2684,6 +2688,7 @@ static void pc_machine_initfn(Object *obj)
pcms->smbus_enabled = true; pcms->smbus_enabled = true;
pcms->sata_enabled = true; pcms->sata_enabled = true;
pcms->pit_enabled = true; pcms->pit_enabled = true;
pcms->smp_dies = 1;
pc_system_flash_create(pcms); pc_system_flash_create(pcms);
} }
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
* PCMachineState: * PCMachineState:
* @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
* @boot_cpus: number of present VCPUs * @boot_cpus: number of present VCPUs
* @smp_dies: number of dies per one package
*/ */
struct PCMachineState { struct PCMachineState {
/*< private >*/ /*< private >*/
...@@ -59,6 +60,7 @@ struct PCMachineState { ...@@ -59,6 +60,7 @@ struct PCMachineState {
bool apic_xrupt_override; bool apic_xrupt_override;
unsigned apic_id_limit; unsigned apic_id_limit;
uint16_t boot_cpus; uint16_t boot_cpus;
unsigned smp_dies;
/* NUMA information: */ /* NUMA information: */
uint64_t numa_nodes; uint64_t numa_nodes;
......
...@@ -5639,6 +5639,7 @@ static void x86_cpu_initfn(Object *obj) ...@@ -5639,6 +5639,7 @@ static void x86_cpu_initfn(Object *obj)
CPUX86State *env = &cpu->env; CPUX86State *env = &cpu->env;
FeatureWord w; FeatureWord w;
env->nr_dies = 1;
cpu_set_cpustate_pointers(cpu); cpu_set_cpustate_pointers(cpu);
object_property_add(obj, "family", "int", object_property_add(obj, "family", "int",
......
...@@ -1385,6 +1385,8 @@ typedef struct CPUX86State { ...@@ -1385,6 +1385,8 @@ typedef struct CPUX86State {
uint64_t xss; uint64_t xss;
TPRAccess tpr_access_type; TPRAccess tpr_access_type;
unsigned nr_dies;
} CPUX86State; } CPUX86State;
struct kvm_msrs; struct kvm_msrs;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册