qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH v1 07/13] spapr: Start all the threads of CPU co


From: Bharata B Rao
Subject: [Qemu-devel] [RFC PATCH v1 07/13] spapr: Start all the threads of CPU core when core is hotplugged
Date: Thu, 8 Jan 2015 11:40:14 +0530

PowerPC kernel adds or removes CPUs in core granularity and hence
onlines/offlines all the SMT threads of a core during hot plug/unplug.
Support this notion by starting all SMT threads of a core when a core
is hotplugged.

Signed-off-by: Bharata B Rao <address@hidden>
---
 hw/ppc/spapr.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index a293a59..4347471 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1376,6 +1376,8 @@ static void spapr_drc_reset(void *opaque)
     }
 }
 
+static const char *current_cpu_model;
+
 /* pSeries LPAR / sPAPR hardware init */
 static void ppc_spapr_init(MachineState *machine)
 {
@@ -1473,6 +1475,8 @@ static void ppc_spapr_init(MachineState *machine)
         }
     }
 
+    current_cpu_model = cpu_model;
+
     /* allocate RAM */
     spapr->ram_limit = ram_size;
     spapr->maxram_limit = machine->maxram_size;
@@ -1912,10 +1916,31 @@ static void spapr_cpu_plug(HotplugHandler *hotplug_dev, 
DeviceState *dev,
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     sPAPRDRConnector *drc =
         spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, cpu->cpu_dt_id);
+    int id = ppc_get_vcpu_dt_id(cpu);
+    int smt = kvmppc_smt_threads();
+    int i;
+
+    /*
+     * SMT threads return from here, only main thread (core) will
+     * continue, create threads and signal hotplug event to the guest.
+     */
+    if ((id % smt) != 0) {
+        return;
+    }
 
     /* TODO: Check if DR is enabled ? */
     g_assert(drc);
 
+    /* Start rest of the SMT threads of the hot plugged core */
+    for (i = 1; i < smp_threads; i++) {
+        cpu = cpu_ppc_init(current_cpu_model);
+        if (cpu == NULL) {
+            fprintf(stderr, "Unable to find PowerPC CPU definition\n");
+            exit(1);
+        }
+        spapr_cpu_reset(cpu);
+    }
+
     spapr_cpu_reset(POWERPC_CPU(CPU(dev)));
     spapr_cpu_hotplug_add(dev, cs);
     spapr_hotplug_req_add_event(drc);
-- 
2.1.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]