From patchwork Mon May 4 01:52:42 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Shannon Zhao X-Patchwork-Id: 47985 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f71.google.com (mail-wg0-f71.google.com [74.125.82.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 955F72121F for ; Mon, 4 May 2015 01:57:22 +0000 (UTC) Received: by wgtl5 with SMTP id l5sf41030803wgt.1 for ; Sun, 03 May 2015 18:57:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-type :content-transfer-encoding:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=NpGp6qLNAZjSl9+kwdzVx7o0tc+DlkEXt0huNZwQOa0=; b=LpszKtk5x15DGRPHyxZeA2QfTswGPR7qLFH+JCGEMVItwa2vONXTiS/6xpaMt4Fh3R pnlipmDajiY4bDb57WzaeDdo0h40DZfPtVw+KHgStP44S049Z/xHw3nsUOvW7yXtCc20 y7An16WrjiCGa+aykr36gDfblSlCSs2lgrmT4yRRzCNYU4l63SaNNxS02QQf3GQgpGXb WyG9mgZkEvvp84HfnxbnxTdDHpNuutyqh7tiNlM/E1QzW/QvVYS3wAz/ebK03jfNzCPD IbaqjYbvUwFQP9daVDrenfzePMRJF97Psh8JB76p4m4UNeIdvV0S00VYrgcvnpQ47YK8 RBLA== X-Gm-Message-State: ALoCoQknOE2ZIctWWUHLxP4/xW5PdX2tQt7ZePvLtWddqlGkLstnRowGhfnpP/AmKnOJUolNCvSw X-Received: by 10.152.206.36 with SMTP id ll4mr16985879lac.6.1430704641880; Sun, 03 May 2015 18:57:21 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.153.8.171 with SMTP id dl11ls645103lad.55.gmail; Sun, 03 May 2015 18:57:21 -0700 (PDT) X-Received: by 10.112.166.139 with SMTP id zg11mr17399716lbb.93.1430704641730; Sun, 03 May 2015 18:57:21 -0700 (PDT) Received: from mail-la0-f46.google.com (mail-la0-f46.google.com. [209.85.215.46]) by mx.google.com with ESMTPS id xg1si9096447lac.41.2015.05.03.18.57.21 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 03 May 2015 18:57:21 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.46 as permitted sender) client-ip=209.85.215.46; Received: by lagv1 with SMTP id v1so94982078lag.3 for ; Sun, 03 May 2015 18:57:21 -0700 (PDT) X-Received: by 10.152.4.137 with SMTP id k9mr17457169lak.29.1430704641645; Sun, 03 May 2015 18:57:21 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.67.65 with SMTP id l1csp1413405lbt; Sun, 3 May 2015 18:57:20 -0700 (PDT) X-Received: by 10.66.165.67 with SMTP id yw3mr38166133pab.95.1430704639827; Sun, 03 May 2015 18:57:19 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ix6si17838787pac.46.2015.05.03.18.57.19; Sun, 03 May 2015 18:57:19 -0700 (PDT) Received-SPF: none (google.com: stable-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751988AbbEDB5S (ORCPT + 2 others); Sun, 3 May 2015 21:57:18 -0400 Received: from mail-pa0-f49.google.com ([209.85.220.49]:33835 "EHLO mail-pa0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751983AbbEDB5S (ORCPT ); Sun, 3 May 2015 21:57:18 -0400 Received: by pacyx8 with SMTP id yx8so147826575pac.1 for ; Sun, 03 May 2015 18:57:17 -0700 (PDT) X-Received: by 10.70.101.106 with SMTP id ff10mr38461781pdb.162.1430704637908; Sun, 03 May 2015 18:57:17 -0700 (PDT) Received: from localhost ([180.150.153.1]) by mx.google.com with ESMTPSA id fp3sm11039291pdb.52.2015.05.03.18.57.15 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 03 May 2015 18:57:16 -0700 (PDT) From: shannon.zhao@linaro.org To: stable@vger.kernel.org Cc: gregkh@linuxfoundation.org, christoffer.dall@linaro.org, shannon.zhao@linaro.org, Marc Zyngier , =?UTF-8?q?Alex=20Benn=C3=A9e?= Subject: [PATCH for 3.14.y stable 47/47] arm/arm64: KVM: Keep elrsr/aisr in sync with software model Date: Mon, 4 May 2015 09:52:42 +0800 Message-Id: <1430704362-6292-48-git-send-email-shannon.zhao@linaro.org> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <1430704362-6292-1-git-send-email-shannon.zhao@linaro.org> References: <1430704362-6292-1-git-send-email-shannon.zhao@linaro.org> MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: stable@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: shannon.zhao@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.46 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Christoffer Dall commit ae705930fca6322600690df9dc1c7d0516145a93 upstream. There is an interesting bug in the vgic code, which manifests itself when the KVM run loop has a signal pending or needs a vmid generation rollover after having disabled interrupts but before actually switching to the guest. In this case, we flush the vgic as usual, but we sync back the vgic state and exit to userspace before entering the guest. The consequence is that we will be syncing the list registers back to the software model using the GICH_ELRSR and GICH_EISR from the last execution of the guest, potentially overwriting a list register containing an interrupt. This showed up during migration testing where we would capture a state where the VM has masked the arch timer but there were no interrupts, resulting in a hung test. Cc: Marc Zyngier Reported-by: Alex Bennee Signed-off-by: Christoffer Dall Signed-off-by: Alex Bennée Acked-by: Marc Zyngier Signed-off-by: Shannon Zhao --- virt/kvm/arm/vgic.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index c324a52..152ec76 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c @@ -1042,6 +1042,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) lr, irq, vgic_cpu->vgic_lr[lr]); BUG_ON(!test_bit(lr, vgic_cpu->lr_used)); vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT; + __clear_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr); return true; } @@ -1055,6 +1056,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) vgic_cpu->vgic_lr[lr] = MK_LR_PEND(sgi_source_id, irq); vgic_cpu->vgic_irq_lr_map[irq] = lr; set_bit(lr, vgic_cpu->lr_used); + __clear_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr); if (!vgic_irq_is_edge(vcpu, irq)) vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI; @@ -1209,6 +1211,14 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) if (vgic_cpu->vgic_misr & GICH_MISR_U) vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE; + /* + * In the next iterations of the vcpu loop, if we sync the vgic state + * after flushing it, but before entering the guest (this happens for + * pending signals and vmid rollovers), then make sure we don't pick + * up any old maintenance interrupts here. + */ + memset(vgic_cpu->vgic_eisr, 0, sizeof(vgic_cpu->vgic_eisr[0]) * 2); + return level_pending; }