From patchwork Sat Sep 23 00:41:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 9967301 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 CB9C2602CB for ; Sat, 23 Sep 2017 00:42:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BE84D29590 for ; Sat, 23 Sep 2017 00:42:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B36E3299C6; Sat, 23 Sep 2017 00:42:23 +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.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham 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 5D47029590 for ; Sat, 23 Sep 2017 00:42:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752578AbdIWAmV (ORCPT ); Fri, 22 Sep 2017 20:42:21 -0400 Received: from mail-wm0-f46.google.com ([74.125.82.46]:49173 "EHLO mail-wm0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752564AbdIWAmU (ORCPT ); Fri, 22 Sep 2017 20:42:20 -0400 Received: by mail-wm0-f46.google.com with SMTP id r74so7646017wme.4 for ; Fri, 22 Sep 2017 17:42:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=b+MOmu9l3d1K7lv60hq3fcI5xixscwtRQ9BTEYuV5hY=; b=j2yZnedH/9Qf2je2AcOqF3q14lA+kCohSLWyn+q2Pj6l/pscr0KCPE37pWTI3ZdWb7 xDHlk/+Mi4Ki6p4kawfkoh3Mkg0AIGnH7wYmsiWw2KgUTvBv1frOHokmf5YbMrjgs44R PzJKU8FownTTmDbsF1RhFbBhrs1BawMhvCoqI= 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=b+MOmu9l3d1K7lv60hq3fcI5xixscwtRQ9BTEYuV5hY=; b=GBkmKhOQgi8gGsSlbC8pSggOynMIrqA2uVdYtCCpKOsLYDnlZXFw6pyG9kUDp/8D0p ZoJLCPRDH/NFT6lxph/1TlvJAsOc57lpW1SVR121swbcd0LtGxqNuRKkz0U4+Yb76+jA whDNhInWLlkgZCmKdrxq8hkqQLExuTnJs11K50PLyBLeIgzWVVWtznL0/lrlKxyhnYQZ E7xnYCSkvAkLqjfybObJ4GTTnCthwbj5DyTfBt6QysmuC/kr9qL4caPeX9x7ieKWlOIa sSlGx4u2TBbs2uH5s6cV7leRELah0bMK+hwKkwOzm5mUFU16JNcSYMLL7dM3/sHElPeR 8EKw== X-Gm-Message-State: AHPjjUjxEET1DOwXXduv1xp9eQnJH1Rj0inGVn1IRCGn54iwNPQFNJBy 38TQP8N4+xee8Rcx78sEoRauKg== X-Google-Smtp-Source: AOwi7QAzNk8h5CelY7q+yzSiHW46ao1FMIuXCGf7ZDijndYxw3e5x8e/4scSUzJd5CAWRdGjow1YMA== X-Received: by 10.80.136.165 with SMTP id d34mr1009244edd.296.1506127339066; Fri, 22 Sep 2017 17:42:19 -0700 (PDT) Received: from localhost.localdomain (xd93dd96b.cust.hiper.dk. [217.61.217.107]) by smtp.gmail.com with ESMTPSA id c25sm646085edb.57.2017.09.22.17.42.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 22 Sep 2017 17:42:17 -0700 (PDT) From: Christoffer Dall To: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Cc: kvm@vger.kernel.org, Marc Zyngier , Will Deacon , Catalin Marinas , Christoffer Dall Subject: [PATCH v3 10/20] KVM: arm/arm64: Move timer/vgic flush/sync under disabled irq Date: Sat, 23 Sep 2017 02:41:57 +0200 Message-Id: <20170923004207.22356-11-cdall@linaro.org> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170923004207.22356-1-cdall@linaro.org> References: <20170923004207.22356-1-cdall@linaro.org> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP As we are about to play tricks with the timer to be more lazy in saving and restoring state, we need to move the timer sync and flush functions under a disabled irq section and since we have to flush the vgic state after the timer and PMU state, we do the whole flush/sync sequence with disabled irqs. The only downside is a slightly longer delay before being able to process hardware interrupts and run softirqs. Signed-off-by: Christoffer Dall Reviewed-by: Marc Zyngier --- virt/kvm/arm/arm.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c index b9f68e4..27db222 100644 --- a/virt/kvm/arm/arm.c +++ b/virt/kvm/arm/arm.c @@ -654,11 +654,11 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) kvm_pmu_flush_hwstate(vcpu); + local_irq_disable(); + kvm_timer_flush_hwstate(vcpu); kvm_vgic_flush_hwstate(vcpu); - local_irq_disable(); - /* * If we have a singal pending, or need to notify a userspace * irqchip about timer or PMU level changes, then we exit (and @@ -683,10 +683,10 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) if (ret <= 0 || need_new_vmid_gen(vcpu->kvm) || kvm_request_pending(vcpu)) { vcpu->mode = OUTSIDE_GUEST_MODE; - local_irq_enable(); kvm_pmu_sync_hwstate(vcpu); kvm_timer_sync_hwstate(vcpu); kvm_vgic_sync_hwstate(vcpu); + local_irq_enable(); preempt_enable(); continue; } @@ -710,6 +710,16 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) kvm_arm_clear_debug(vcpu); /* + * We must sync the PMU and timer state before the vgic state so + * that the vgic can properly sample the updated state of the + * interrupt line. + */ + kvm_pmu_sync_hwstate(vcpu); + kvm_timer_sync_hwstate(vcpu); + + kvm_vgic_sync_hwstate(vcpu); + + /* * We may have taken a host interrupt in HYP mode (ie * while executing the guest). This interrupt is still * pending, as we haven't serviced it yet! @@ -732,16 +742,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) guest_exit(); trace_kvm_exit(ret, kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); - /* - * We must sync the PMU and timer state before the vgic state so - * that the vgic can properly sample the updated state of the - * interrupt line. - */ - kvm_pmu_sync_hwstate(vcpu); - kvm_timer_sync_hwstate(vcpu); - - kvm_vgic_sync_hwstate(vcpu); - preempt_enable(); ret = handle_exit(vcpu, run, ret);