From patchwork Wed Feb 1 17:43:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jintack Lim X-Patchwork-Id: 9550421 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 3EAE160424 for ; Wed, 1 Feb 2017 17:46:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 30BF92040D for ; Wed, 1 Feb 2017 17:46:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 259F228435; Wed, 1 Feb 2017 17:46:15 +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.4 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C2E312040D for ; Wed, 1 Feb 2017 17:46:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753816AbdBARqO (ORCPT ); Wed, 1 Feb 2017 12:46:14 -0500 Received: from outprodmail02.cc.columbia.edu ([128.59.72.51]:55392 "EHLO outprodmail02.cc.columbia.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753997AbdBARnY (ORCPT ); Wed, 1 Feb 2017 12:43:24 -0500 Received: from hazelnut (hazelnut.cc.columbia.edu [128.59.213.250]) by outprodmail02.cc.columbia.edu (8.14.4/8.14.4) with ESMTP id v11He8wX001147 for ; Wed, 1 Feb 2017 12:43:23 -0500 Received: from hazelnut (localhost.localdomain [127.0.0.1]) by hazelnut (Postfix) with ESMTP id 90DB581 for ; Wed, 1 Feb 2017 12:43:23 -0500 (EST) Received: from sendprodmail02.cc.columbia.edu (sendprodmail02.cc.columbia.edu [128.59.72.14]) by hazelnut (Postfix) with ESMTP id 6E5EC81 for ; Wed, 1 Feb 2017 12:43:23 -0500 (EST) Received: from mail-qt0-f198.google.com (mail-qt0-f198.google.com [209.85.216.198]) by sendprodmail02.cc.columbia.edu (8.14.4/8.14.4) with ESMTP id v11HhNfa020025 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NOT) for ; Wed, 1 Feb 2017 12:43:23 -0500 Received: by mail-qt0-f198.google.com with SMTP id h53so201389317qth.6 for ; Wed, 01 Feb 2017 09:43:23 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7XYXgv4k1chQarzXEx3imurObCxV/9dYo12Ru+qkhlk=; b=R7JlQou1N6ggjYVEAwesHWiYhW3Kp63BiPPPlR33IEvgmLIPCw8/3pAcbAlycpcfj5 b1s7aR1y9hnU9d7HmOMDg1PyD+dRU3PMw+Awgttw97j4ejFfnciagDD086iJ/0NvUdJt bOgsu0v1Kcveq11XZQcZO5+HMpJ3Wr6f8Nt8JblJ+UtsAL4ze3fULjJkbTN01x113nDw a60212kBKsDQ/bTopyhDOUnrhCHzRIVV4/JBGOZ1NNGXWttGnRZPITqg7sh4c1dJwI31 H3gveS4bLHX2XiucikadafihmnnYPHJSlc2a1IiKI+VPt2ZsJYaXTryQZzP57T9s/DrL cY1w== X-Gm-Message-State: AMke39mtZ1zzzoBbyzHncW+nGUuLFHAnsfLdQzD/wVZPY6q3O4c/NmHpnEOs+W//7bu0hxBABtkQmSVw/ZVB2TiQ1w1g2iaa28vRG7JTThwfwiohCJlSFMl3eLsxxCkfhdE3rtPrE8XH8YA= X-Received: by 10.55.161.8 with SMTP id k8mr3995943qke.87.1485971002803; Wed, 01 Feb 2017 09:43:22 -0800 (PST) X-Received: by 10.55.161.8 with SMTP id k8mr3995922qke.87.1485971002577; Wed, 01 Feb 2017 09:43:22 -0800 (PST) Received: from jintack.cs.columbia.edu ([2001:18d8:ffff:16:21a:4aff:feaa:f900]) by smtp.gmail.com with ESMTPSA id b16sm19149046qka.9.2017.02.01.09.43.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Feb 2017 09:43:21 -0800 (PST) From: Jintack Lim To: pbonzini@redhat.com, rkrcmar@redhat.com, christoffer.dall@linaro.org, marc.zyngier@arm.com, linux@armlinux.org.uk, catalin.marinas@arm.com, will.deacon@arm.com, andre.przywara@arm.com, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org Cc: jintack@cs.columbia.edu Subject: [RFC v3 08/10] KVM: arm/arm64: Set up a background timer for the physical timer emulation Date: Wed, 1 Feb 2017 12:43:08 -0500 Message-Id: <1485970990-13775-9-git-send-email-jintack@cs.columbia.edu> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1485970990-13775-1-git-send-email-jintack@cs.columbia.edu> References: <1485970990-13775-1-git-send-email-jintack@cs.columbia.edu> X-No-Spam-Score: Local X-Scanned-By: MIMEDefang 2.78 on 128.59.72.14 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Set a background timer for the EL1 physical timer emulation while VMs are running, so that VMs get the physical timer interrupts in a timely manner. Schedule the background timer on entry to the VM and cancel it on exit. This would not have any performance impact to the guest OSes that currently use the virtual timer since the physical timer is always not enabled. Signed-off-by: Jintack Lim Reviewed-by: Christoffer Dall --- virt/kvm/arm/arch_timer.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c index 89bdb79..1806e5e 100644 --- a/virt/kvm/arm/arch_timer.c +++ b/virt/kvm/arm/arch_timer.c @@ -229,6 +229,22 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu) return 0; } +/* Schedule the background timer for the emulated timer. */ +static void kvm_timer_emulate(struct kvm_vcpu *vcpu, + struct arch_timer_context *timer_ctx) +{ + struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; + + if (kvm_timer_should_fire(timer_ctx)) + return; + + if (!kvm_timer_irq_can_fire(timer_ctx)) + return; + + /* The timer has not yet expired, schedule a background timer */ + timer_arm(timer, kvm_timer_compute_delta(timer_ctx)); +} + /* * Schedule the background timer before calling kvm_vcpu_block, so that this * thread is removed from its waitqueue and made runnable when there's a timer @@ -286,6 +302,9 @@ void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu) if (kvm_timer_update_state(vcpu)) return; + /* Set the background timer for the physical timer emulation. */ + kvm_timer_emulate(vcpu, vcpu_ptimer(vcpu)); + /* * If we enter the guest with the virtual input level to the VGIC * asserted, then we have already told the VGIC what we need to, and @@ -348,7 +367,11 @@ void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu) { struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; - BUG_ON(timer_is_armed(timer)); + /* + * This is to cancel the background timer for the physical timer + * emulation if it is set. + */ + timer_disarm(timer); /* * The guest could have modified the timer registers or the timer