From patchwork Fri Oct 27 08:34:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoffer Dall X-Patchwork-Id: 10029367 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 A15FD602D6 for ; Fri, 27 Oct 2017 08:36:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8FE8128F55 for ; Fri, 27 Oct 2017 08:36:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8355428F5C; Fri, 27 Oct 2017 08:36:07 +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 2778928F55 for ; Fri, 27 Oct 2017 08:36:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752404AbdJ0IgG (ORCPT ); Fri, 27 Oct 2017 04:36:06 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:45024 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752330AbdJ0Ifu (ORCPT ); Fri, 27 Oct 2017 04:35:50 -0400 Received: by mail-lf0-f66.google.com with SMTP id 75so6553726lfx.1 for ; Fri, 27 Oct 2017 01:35:49 -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=qoGJLIFiYdPiDH97GQXIILsSXPyFfuICDJMCMp1zV0c=; b=GHd3npqT90VthjWJgx16jJT89nW2h3AKxIgeaHxf++19j8JlaMg5gOrAUQ79E84iDP xy9C81z3Oeq5sJthAIGNYqhWyjIniiqo3bc70Y9LzoZBrhsY+neJQPq7UZhNuGu40owI QLdogVJ/Hvd4Naq637Xk+8nW5/UgxwJTsQ4Io= 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=qoGJLIFiYdPiDH97GQXIILsSXPyFfuICDJMCMp1zV0c=; b=qJdFLUPlAvBr/ycANikZ6emnSEEKOXgy1TdeoPBisyeXeaXiEP47J2UgFIQMkytx9G RoRZ05BJawBE7mdFiVVN6zjsCW6k+//BonkPWQRX5mbu8xpnYTtBp/PFGoehxQ2/bbhj x5WZRp8CV8eMuvvjAdwjz5IAiS4OcwD6Emr3cDj6gwImyawtVBH0/B12hrGWPqxD8zVM WXK78T3XqGIo6dsMI+4ex+GuziwabVoBKpEMavfRzsCPRpX7Ypm16bXXvKoLiDJNLNKf Zu4e7o2hayUEEPo/RRr1R2U0rGOBlBihcIj5/8lKiPmSv8b9eK95q6IPW0WJoC2Tgk// uo7Q== X-Gm-Message-State: AMCzsaUj/XHP/idqvPiv76mQtNGp9E95ciEQoo/Iorkgb5+h4a9UuBpG lR/Hv6yJnC14J1pdjJZ/RMUStA== X-Google-Smtp-Source: ABhQp+Shcg/o52xAbooWDPTo5gdyf5tUYhlxpsma0g6It8VFfGeTwK5iRM0tdpJoMeL7JZ+q5HrFKw== X-Received: by 10.46.117.24 with SMTP id q24mr10288943ljc.14.1509093348686; Fri, 27 Oct 2017 01:35:48 -0700 (PDT) Received: from localhost.localdomain (212.27.17.163.bredband.3.dk. [212.27.17.163]) by smtp.gmail.com with ESMTPSA id d204sm1471957lfe.73.2017.10.27.01.35.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 27 Oct 2017 01:35:47 -0700 (PDT) From: Christoffer Dall To: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Cc: Marc Zyngier , Eric Auger , kvm@vger.kernel.org, Catalin Marinas , Will Deacon , Christoffer Dall Subject: [PATCH v5 09/20] KVM: arm/arm64: Move timer/vgic flush/sync under disabled irq Date: Fri, 27 Oct 2017 10:34:30 +0200 Message-Id: <1509093281-15225-10-git-send-email-cdall@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1509093281-15225-1-git-send-email-cdall@linaro.org> References: <1509093281-15225-1-git-send-email-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);