From patchwork Thu Jan 28 05:49:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bharata B Rao X-Patchwork-Id: 8146491 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 575919F8AA for ; Thu, 28 Jan 2016 05:56:10 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9F1A220256 for ; Thu, 28 Jan 2016 05:56:09 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BEBC1201CD for ; Thu, 28 Jan 2016 05:56:08 +0000 (UTC) Received: from localhost ([::1]:54129 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aOfYu-0002Nj-6l for patchwork-qemu-devel@patchwork.kernel.org; Thu, 28 Jan 2016 00:56:08 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50857) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aOfUY-0002sb-Tj for qemu-devel@nongnu.org; Thu, 28 Jan 2016 00:51:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aOfUV-0005LP-La for qemu-devel@nongnu.org; Thu, 28 Jan 2016 00:51:38 -0500 Received: from e23smtp05.au.ibm.com ([202.81.31.147]:49956) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aOfUV-0005Kw-4V for qemu-devel@nongnu.org; Thu, 28 Jan 2016 00:51:35 -0500 Received: from localhost by e23smtp05.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 28 Jan 2016 15:51:33 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp05.au.ibm.com (202.81.31.211) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 28 Jan 2016 15:51:30 +1000 X-IBM-Helo: d23dlp01.au.ibm.com X-IBM-MailFrom: bharata@linux.vnet.ibm.com X-IBM-RcptTo: qemu-devel@nongnu.org;qemu-ppc@nongnu.org Received: from d23relay07.au.ibm.com (d23relay07.au.ibm.com [9.190.26.37]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 4BECF2CE8056; Thu, 28 Jan 2016 16:51:30 +1100 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay07.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u0S5pO3S10354718; Thu, 28 Jan 2016 16:51:32 +1100 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u0S5ovf6003173; Thu, 28 Jan 2016 16:50:58 +1100 Received: from bharata.in.ibm.com ([9.124.35.121]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u0S5oG8A001110; Thu, 28 Jan 2016 16:50:54 +1100 From: Bharata B Rao To: qemu-devel@nongnu.org Date: Thu, 28 Jan 2016 11:19:53 +0530 Message-Id: <1453960195-15181-12-git-send-email-bharata@linux.vnet.ibm.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1453960195-15181-1-git-send-email-bharata@linux.vnet.ibm.com> References: <1453960195-15181-1-git-send-email-bharata@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16012805-0017-0000-0000-000002AC3EC1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 202.81.31.147 Cc: mjrosato@linux.vnet.ibm.com, ehabkost@redhat.com, aik@ozlabs.ru, Bharata B Rao , mdroth@linux.vnet.ibm.com, agraf@suse.de, pbonzini@redhat.com, qemu-ppc@nongnu.org, tyreld@linux.vnet.ibm.com, nfont@linux.vnet.ibm.com, imammedo@redhat.com, afaerber@suse.de, david@gibson.dropbear.id.au Subject: [Qemu-devel] [PATCH v7 11/13] spapr: CPU hot unplug support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Remove the CPU core device by removing the underlying CPU thread devices. Hot removal of CPU for sPAPR guests is supported by sending the hot unplug notification to the guest via EPOW interrupt. Release the vCPU object after CPU hot unplug so that vCPU fd can be parked and reused. Signed-off-by: Bharata B Rao Reviewed-by: David Gibson --- hw/ppc/spapr.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr.h | 8 +++++ 2 files changed, 98 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 6ef520d..0a112d8 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2417,11 +2417,101 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev, } } +static void spapr_cpu_destroy(PowerPCCPU *cpu) +{ + sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); + + xics_cpu_destroy(spapr->icp, cpu); + qemu_unregister_reset(spapr_cpu_reset, cpu); +} + +static void spapr_cpu_core_cleanup(struct sPAPRCPUUnplugList *unplug_list) +{ + sPAPRCPUUnplug *unplug, *next; + Object *cpu; + + QLIST_FOREACH_SAFE(unplug, unplug_list, node, next) { + cpu = unplug->cpu; + object_unparent(cpu); + QLIST_REMOVE(unplug, node); + g_free(unplug); + } +} + +static void spapr_add_cpu_to_unplug_list(Object *cpu, + struct sPAPRCPUUnplugList *unplug_list) +{ + sPAPRCPUUnplug *unplug = g_malloc(sizeof(*unplug)); + + unplug->cpu = cpu; + QLIST_INSERT_HEAD(unplug_list, unplug, node); +} + +static int spapr_cpu_release(Object *obj, void *opaque) +{ + DeviceState *dev = DEVICE(obj); + CPUState *cs = CPU(dev); + PowerPCCPU *cpu = POWERPC_CPU(cs); + struct sPAPRCPUUnplugList *unplug_list = opaque; + + spapr_cpu_destroy(cpu); + cpu_remove_sync(cs); + + /* + * We are still walking the core object's children list, and + * hence can't cleanup this CPU thread object just yet. Put + * it on a list for later removal. + */ + spapr_add_cpu_to_unplug_list(obj, unplug_list); + return 0; +} + +static void spapr_core_release(DeviceState *dev, void *opaque) +{ + struct sPAPRCPUUnplugList unplug_list; + + QLIST_INIT(&unplug_list); + object_child_foreach(OBJECT(dev), spapr_cpu_release, &unplug_list); + spapr_cpu_core_cleanup(&unplug_list); + object_unparent(OBJECT(dev)); +} + +static void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, + Error **errp) +{ + PowerPCCPUCore *core = POWERPC_CPU_CORE(OBJECT(dev)); + PowerPCCPU *cpu = core->thread0; + int id = ppc_get_vcpu_dt_id(cpu); + sPAPRDRConnector *drc = + spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id); + sPAPRDRConnectorClass *drck; + Error *local_err = NULL; + + g_assert(drc); + + drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + drck->detach(drc, dev, spapr_core_release, NULL, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + spapr_hotplug_req_remove_by_index(drc); +} + static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { + sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine()); + if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { error_setg(errp, "Memory hot unplug not supported by sPAPR"); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_POWERPC_CPU_CORE)) { + if (!smc->dr_cpu_enabled) { + error_setg(errp, "CPU hot unplug not supported on this machine"); + return; + } + spapr_core_unplug(hotplug_dev, dev, errp); } } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index a9d98e7..e161f8f 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -630,4 +630,12 @@ int spapr_rng_populate_dt(void *fdt); */ #define SPAPR_LMB_FLAGS_ASSIGNED 0x00000008 +/* List to store unplugged CPU objects for cleanup during unplug */ +typedef struct sPAPRCPUUnplug { + Object *cpu; + QLIST_ENTRY(sPAPRCPUUnplug) node; +} sPAPRCPUUnplug; + +QLIST_HEAD(sPAPRCPUUnplugList, sPAPRCPUUnplug); + #endif /* !defined (__HW_SPAPR_H__) */