From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44382) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XPQCF-0003gQ-S1 for qemu-devel@nongnu.org; Thu, 04 Sep 2014 02:07:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XPQBy-0004IE-Mc for qemu-devel@nongnu.org; Thu, 04 Sep 2014 02:07:03 -0400 Received: from e28smtp09.in.ibm.com ([122.248.162.9]:35262) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XPQBx-0004Go-MH for qemu-devel@nongnu.org; Thu, 04 Sep 2014 02:06:46 -0400 Received: from /spool/local by e28smtp09.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 4 Sep 2014 11:36:42 +0530 Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60]) by d28dlp01.in.ibm.com (Postfix) with ESMTP id 7A3DEE004C for ; Thu, 4 Sep 2014 11:38:58 +0530 (IST) Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay03.in.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id s8468xfY1638828 for ; Thu, 4 Sep 2014 11:38:59 +0530 Received: from d28av01.in.ibm.com (localhost [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s8466aim018011 for ; Thu, 4 Sep 2014 11:36:36 +0530 From: Bharata B Rao Date: Thu, 4 Sep 2014 11:36:25 +0530 Message-Id: <1409810785-12391-16-git-send-email-bharata@linux.vnet.ibm.com> In-Reply-To: <1409810785-12391-1-git-send-email-bharata@linux.vnet.ibm.com> References: <1409810785-12391-1-git-send-email-bharata@linux.vnet.ibm.com> Subject: [Qemu-devel] [RFC PATCH v0 15/15] ppc: Allow hotplugging of CPU cores only List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mdroth@linux.vnet.ibm.com, Bharata B Rao pseries kernels support hot-plugging CPUs in core granularity. i,e., when a core is hotplugged, guest kernel tries to bring up all the threads in that core. This doesn't match 1-to-1 with QEMU hotplug semantics where cpu-add monitor command hotplugs 1 CPU at a time. While it is still an open question as to what kind of CPU hotplug semantics we should support here, this patch restricts cpu-add monitor command to allow only CPU cores to be added. All the threads of the hot-plugged core at onlined at once. Signed-off-by: Bharata B Rao --- hw/ppc/spapr.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 9a3d1ca..96fb11b 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1717,7 +1717,7 @@ static int spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset) return 0; } -static void spapr_cpu_hotplug_add(CPUState *cs) +static int spapr_cpu_hotplug_add(CPUState *cs) { int i, j; sPAPRDrcEntry *drc_entry; @@ -1740,6 +1740,11 @@ static void spapr_cpu_hotplug_add(CPUState *cs) PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs); char *nodename; int index = ppc_get_vcpu_dt_id(cpu); + int smt = kvmppc_smt_threads(); + + if ((index % smt) != 0) { + return -1; + } drc_entry = spapr_cpu_to_drc_entry(cpu->cpu_dt_id + SPAPR_DRC_CPU_ID_BASE); g_assert(drc_entry); @@ -1797,14 +1802,17 @@ static void spapr_cpu_hotplug_add(CPUState *cs) ccs->fdt = fdt; ccs->offset_start = offset; ccs->state = CC_STATE_PENDING; + + return 0; } static void spapr_cpu_added_req(Notifier *n, void *opaque) { CPUState *cs = CPU(opaque); - spapr_cpu_hotplug_add(cs); - spapr_cpu_hotplug_add_event(cs); + if (!spapr_cpu_hotplug_add(cs)) { + spapr_cpu_hotplug_add_event(cs); + } return; } @@ -2193,6 +2201,7 @@ static void ppc_hot_add_cpu(const int64_t id, Error **errp) { CPUState *cs; PowerPCCPU *cpu; + int i; if (id < 0) { error_setg(errp, "Invalid CPU id: %" PRIi64, id); @@ -2213,8 +2222,16 @@ static void ppc_hot_add_cpu(const int64_t id, Error **errp) return; } - cpu = ppc_new_cpu(current_cpu_model); - spapr_cpu_reset(cpu); + if ((id % smp_threads) != 0) { + error_setg(errp, "Invalid CPU id: %" PRIi64 + ", only cores can be added", id); + return; + } + + for (i = 0; i < smp_threads; i++) { + cpu = ppc_new_cpu(current_cpu_model); + spapr_cpu_reset(cpu); + } } static void spapr_machine_class_init(ObjectClass *oc, void *data) -- 1.7.11.7