From patchwork Wed Jul 6 08:59:20 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: 9215829 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 730A760467 for ; Wed, 6 Jul 2016 09:07:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5F6D1287AD for ; Wed, 6 Jul 2016 09:07:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4FE95287AF; Wed, 6 Jul 2016 09:07:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 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.wl.linuxfoundation.org (Postfix) with ESMTPS id B2444287AD for ; Wed, 6 Jul 2016 09:07:25 +0000 (UTC) Received: from localhost ([::1]:60342 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bKink-0008L1-R2 for patchwork-qemu-devel@patchwork.kernel.org; Wed, 06 Jul 2016 05:07:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46777) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bKigN-0007an-Tk for qemu-devel@nongnu.org; Wed, 06 Jul 2016 04:59:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bKigK-00056K-Nw for qemu-devel@nongnu.org; Wed, 06 Jul 2016 04:59:47 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:33053 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bKigK-00056D-IF for qemu-devel@nongnu.org; Wed, 06 Jul 2016 04:59:44 -0400 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u668wxfk102345 for ; Wed, 6 Jul 2016 04:59:44 -0400 Received: from e28smtp08.in.ibm.com (e28smtp08.in.ibm.com [125.16.236.8]) by mx0a-001b2d01.pphosted.com with ESMTP id 240ndf6uj7-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 06 Jul 2016 04:59:43 -0400 Received: from localhost by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 6 Jul 2016 14:29:40 +0530 Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp08.in.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 6 Jul 2016 14:29:38 +0530 X-IBM-Helo: d28dlp03.in.ibm.com X-IBM-MailFrom: bharata@linux.vnet.ibm.com X-IBM-RcptTo: qemu-devel@nongnu.org;qemu-ppc@nongnu.org Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id 1910D125805E; Wed, 6 Jul 2016 14:32:23 +0530 (IST) Received: from d28av05.in.ibm.com (d28av05.in.ibm.com [9.184.220.67]) by d28relay03.in.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u668xbhO9175444; Wed, 6 Jul 2016 14:29:37 +0530 Received: from d28av05.in.ibm.com (localhost [127.0.0.1]) by d28av05.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u668xZsL002303; Wed, 6 Jul 2016 14:29:36 +0530 Received: from bharata.in.ibm.com ([9.79.190.110]) by d28av05.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u668xNcb001702; Wed, 6 Jul 2016 14:29:33 +0530 From: Bharata B Rao To: qemu-devel@nongnu.org Date: Wed, 6 Jul 2016 14:29:20 +0530 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1467795561-1007-1-git-send-email-bharata@linux.vnet.ibm.com> References: <1467795561-1007-1-git-send-email-bharata@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16070608-0056-0000-0000-000002893CD4 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16070608-0057-0000-0000-00000EA4D71C Message-Id: <1467795561-1007-5-git-send-email-bharata@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-07-06_05:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1607060081 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [RFC PATCH v1 4/5] xics: Use migration_id instead of cpu_index in XICS code X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: nikunj@linux.vnet.ibm.com, Bharata B Rao , groug@kaod.org, qemu-ppc@nongnu.org, pbonzini@redhat.com, imammedo@redhat.com, david@gibson.dropbear.id.au Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP xics maintains an array of ICPState structures which is indexed by cpu_index. Change this to index the ICPState array by migration_id for pseries-2.7 onwards. This allows migration of guest to suceed when there are holes in cpu_index range due to CPU hot removal. NOTE: In rtas_set_xive() and h_ipi(), cpu_dt_id is implicitly assume to be equivalent to migration_id. Signed-off-by: Bharata B Rao --- hw/intc/xics.c | 12 ++++++++---- hw/intc/xics_kvm.c | 11 +++++------ hw/intc/xics_spapr.c | 28 +++++++++++++++++++++------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index cd48f42..ce7571e 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -50,9 +50,11 @@ int xics_get_cpu_index_by_dt_id(int cpu_dt_id) void xics_cpu_destroy(XICSState *xics, PowerPCCPU *cpu) { CPUState *cs = CPU(cpu); - ICPState *ss = &xics->ss[cs->cpu_index]; + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); + ICPState *ss = &xics->ss[server]; - assert(cs->cpu_index < xics->nr_servers); + assert(server < xics->nr_servers); assert(cs == ss->cs); ss->output = NULL; @@ -63,10 +65,12 @@ void xics_cpu_setup(XICSState *xics, PowerPCCPU *cpu) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; - ICPState *ss = &xics->ss[cs->cpu_index]; + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); + ICPState *ss = &xics->ss[server]; XICSStateClass *info = XICS_COMMON_GET_CLASS(xics); - assert(cs->cpu_index < xics->nr_servers); + assert(server < xics->nr_servers); ss->cs = cs; diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c index edbd62f..2c087a4 100644 --- a/hw/intc/xics_kvm.c +++ b/hw/intc/xics_kvm.c @@ -326,14 +326,13 @@ static const TypeInfo ics_kvm_info = { */ static void xics_kvm_cpu_setup(XICSState *xics, PowerPCCPU *cpu) { - CPUState *cs; - ICPState *ss; + CPUState *cs = CPU(cpu); KVMXICSState *xicskvm = XICS_SPAPR_KVM(xics); + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); + ICPState *ss = ss = &xics->ss[server]; - cs = CPU(cpu); - ss = &xics->ss[cs->cpu_index]; - - assert(cs->cpu_index < xics->nr_servers); + assert(server < xics->nr_servers); if (xicskvm->kernel_xics_fd == -1) { abort(); } diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c index 618826d..281ba76 100644 --- a/hw/intc/xics_spapr.c +++ b/hw/intc/xics_spapr.c @@ -43,16 +43,20 @@ static target_ulong h_cppr(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); target_ulong cppr = args[0]; - icp_set_cppr(spapr->xics, cs->cpu_index, cppr); + icp_set_cppr(spapr->xics, server, cppr); return H_SUCCESS; } static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { - target_ulong server = xics_get_cpu_index_by_dt_id(args[0]); + CPUState *cs = CPU(cpu); + target_ulong server = cs->use_migration_id ? args[0] : + xics_get_cpu_index_by_dt_id(args[0]); target_ulong mfrr = args[1]; if (server >= spapr->xics->nr_servers) { @@ -67,7 +71,9 @@ static target_ulong h_xirr(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); - uint32_t xirr = icp_accept(spapr->xics->ss + cs->cpu_index); + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); + uint32_t xirr = icp_accept(spapr->xics->ss + server); args[0] = xirr; return H_SUCCESS; @@ -77,7 +83,9 @@ static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); - ICPState *ss = &spapr->xics->ss[cs->cpu_index]; + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); + ICPState *ss = &spapr->xics->ss[server]; uint32_t xirr = icp_accept(ss); args[0] = xirr; @@ -89,9 +97,11 @@ static target_ulong h_eoi(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); target_ulong xirr = args[0]; - icp_eoi(spapr->xics, cs->cpu_index, xirr); + icp_eoi(spapr->xics, server, xirr); return H_SUCCESS; } @@ -99,8 +109,10 @@ static target_ulong h_ipoll(PowerPCCPU *cpu, sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUState *cs = CPU(cpu); + CPUClass *cc = CPU_GET_CLASS(cs); + int server = cc->get_migration_id(cs); uint32_t mfrr; - uint32_t xirr = icp_ipoll(spapr->xics->ss + cs->cpu_index, &mfrr); + uint32_t xirr = icp_ipoll(spapr->xics->ss + server, &mfrr); args[0] = xirr; args[1] = mfrr; @@ -113,6 +125,7 @@ static void rtas_set_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { + CPUState *cs = CPU(cpu); ICSState *ics = spapr->xics->ics; uint32_t nr, server, priority; @@ -122,7 +135,8 @@ static void rtas_set_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr, } nr = rtas_ld(args, 0); - server = xics_get_cpu_index_by_dt_id(rtas_ld(args, 1)); + server = cs->use_migration_id ? rtas_ld(args, 1) : + xics_get_cpu_index_by_dt_id(rtas_ld(args, 1)); priority = rtas_ld(args, 2); if (!ics_valid_irq(ics, nr) || (server >= ics->xics->nr_servers)