From patchwork Tue Jun 30 10:49:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Shannon Zhao X-Patchwork-Id: 50470 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f70.google.com (mail-wg0-f70.google.com [74.125.82.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 960A7229DF for ; Tue, 30 Jun 2015 10:52:01 +0000 (UTC) Received: by wgjx7 with SMTP id x7sf2463198wgj.3 for ; Tue, 30 Jun 2015 03:52:00 -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=mtF1AVfb0x9kTJR0N7z+lUTXjAM07fngPXTcdmf6i40=; b=l/TFmH/jHDHH6X2pMFlrmM4xk3Ddmy/ZdkjdNjQj+TGVyxZVoOUZJr9Sr1VDbSWIU8 QFj/O3rEnx7nc0jjlt4Pi3Nx3brGIee4cWGZrM18w/4V8QRPUi1myOBi3ObUOaw39Pi0 gE5laN+yPmXJxRnAtyCCNHsjmmQoPVw30CsWBx3z2jFZmH9JmX5V7VExEelToeYQna0B FiIe7n33A3xntgzCYEzaaRhzYaz+VAII4UxU5nxJSN7O51eQYA/IQ/AyQDkPZoZeDbS6 XkOsuR+Jj3QelMJ95q3lmKO/UFuR+DXy8n3TjwEewWo/mDZWl40i1P22GBCk80YP2AvL waVQ== X-Gm-Message-State: ALoCoQlp0FGXcnvyqEBjEW4Jw5hsVQJeaIwFZrGaBlUIOnf0rdlabhRECrJ7nkepmOvLnQUeCUAt X-Received: by 10.180.89.231 with SMTP id br7mr11504260wib.0.1435661520938; Tue, 30 Jun 2015 03:52:00 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.120.102 with SMTP id lb6ls28035lab.49.gmail; Tue, 30 Jun 2015 03:52:00 -0700 (PDT) X-Received: by 10.152.246.37 with SMTP id xt5mr18835846lac.83.1435661520623; Tue, 30 Jun 2015 03:52:00 -0700 (PDT) Received: from mail-la0-f54.google.com (mail-la0-f54.google.com. [209.85.215.54]) by mx.google.com with ESMTPS id kg7si37769740lbc.176.2015.06.30.03.52.00 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jun 2015 03:52:00 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.54 as permitted sender) client-ip=209.85.215.54; Received: by laar3 with SMTP id r3so8230871laa.0 for ; Tue, 30 Jun 2015 03:52:00 -0700 (PDT) X-Received: by 10.112.209.106 with SMTP id ml10mr18753983lbc.112.1435661520351; Tue, 30 Jun 2015 03:52:00 -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.108.230 with SMTP id hn6csp2353657lbb; Tue, 30 Jun 2015 03:51:59 -0700 (PDT) X-Received: by 10.68.250.194 with SMTP id ze2mr42736863pbc.24.1435661511930; Tue, 30 Jun 2015 03:51:51 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id lj11si69631040pab.25.2015.06.30.03.51.50; Tue, 30 Jun 2015 03:51:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752425AbbF3Kvu (ORCPT + 2 others); Tue, 30 Jun 2015 06:51:50 -0400 Received: from mail-pa0-f44.google.com ([209.85.220.44]:33662 "EHLO mail-pa0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753141AbbF3Kvt (ORCPT ); Tue, 30 Jun 2015 06:51:49 -0400 Received: by pacws9 with SMTP id ws9so3960401pac.0 for ; Tue, 30 Jun 2015 03:51:49 -0700 (PDT) X-Received: by 10.68.57.168 with SMTP id j8mr32131pbq.99.1435661509015; Tue, 30 Jun 2015 03:51:49 -0700 (PDT) Received: from localhost ([120.136.36.232]) by mx.google.com with ESMTPSA id by13sm45235319pdb.37.2015.06.30.03.51.46 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 30 Jun 2015 03:51:47 -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 22/22] arm/arm64: KVM: Keep elrsr/aisr in sync with software model Date: Tue, 30 Jun 2015 18:49:10 +0800 Message-Id: <1435661350-8060-23-git-send-email-shannon.zhao@linaro.org> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <1435661350-8060-1-git-send-email-shannon.zhao@linaro.org> References: <1435661350-8060-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.54 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 Note the upstream one of this patch requires applying full GICv3 support but it's out of the scope of stable kernel. So this patch has a huge modification for stable kernel comparing to the upstream one. 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; }