Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp600664ybz; Sat, 25 Apr 2020 00:05:34 -0700 (PDT) X-Google-Smtp-Source: APiQypL1WJJrWueWvqQ1iadvLnbpLxNaV3g7qXMQAg+H/D0ofEcDQnas/LnRVV6sqsZ5PwQy7NEc X-Received: by 2002:a05:6402:16da:: with SMTP id r26mr10064256edx.375.1587798334767; Sat, 25 Apr 2020 00:05:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587798334; cv=none; d=google.com; s=arc-20160816; b=bjbxLiffKqCbcBvZzj0KQ02elg6YPUua9wDsaW3tgb171UmYvRn+2E+UiYmB+vOjbF W9Y6XTvsdDd6Yh6ROHBlJn2gM/x9UXxy0YTrS6xUUi5N9CEL2am5X4Ktr8RLTYRfD8Mp hHFJUXUhWt1fkjhbUpGyyztXVEG8ePyyY18JApGGaO602TJqIR0EBWYScMfwS3af5qub rXuiCx/xad6GMTVaQYphj7mXFOF/bsF2WYKAe/9eoV2t3EN3H6Ugq+zWYEgzKuXo5aVR eos0XSD51lWZUPNgX+9s6FXU6RAhdVY/gz6DB7y3whYvoqDn6BHrKM9/MljKarNRXEqZ GCIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=ASlviBxFLp+Z3Ulj6MCrDwXnWDa6GkiqlDL/SqVZeZg=; b=F07NM6fYmR+pswDyE/aUp4fS+RLogrnQG5Il7g98l4k76ORXIL/QxKpv2QnmubqqdN GAPnzN5/PEGz+wWmkKvN9Y+ZaFoKMOXXaaqLmmbAabgo4POV3bFZWd8gr5AfAME4OLB1 Pn7hLtSMlKkPTV5vBs8a97t/nPPSZ3DSDhckGpSO70PV5/jDsAZYmnPrj2I/5kXoUtuW To24CuFtK4ihfHVVmCUKtluGRqc8PQL1EfRoc+9EPZjO/fYm/hbTxa2hYOlYAGbg40Ok c/g1eyXgx9gI4dY09Kkt7Cu/PiZ9ktXAz42c70VQcBJJgdPIWdtUVkJY8br9okdEbRo/ lPnA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=AgrbJDpu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p31si4147536edb.495.2020.04.25.00.05.11; Sat, 25 Apr 2020 00:05:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=AgrbJDpu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726456AbgDYHCq (ORCPT + 99 others); Sat, 25 Apr 2020 03:02:46 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:21362 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726234AbgDYHCG (ORCPT ); Sat, 25 Apr 2020 03:02:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1587798125; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:in-reply-to:in-reply-to:references:references; bh=ASlviBxFLp+Z3Ulj6MCrDwXnWDa6GkiqlDL/SqVZeZg=; b=AgrbJDpuXg0RBVBAoJ1l4slD9/3Zhhq38OtHhfQQOd2RPTNVExCmluJtXnrkrs3bm3mfK3 sxt4Hw5Ohp1giBDmlg9UQRpH4eYnusn6o2gVwEU2m0jD0bJYY4QqWhFsZGeaw/sKy9hMIM 1Xq+dEbwJclVA6MFPCVkqc5hGHlLmCM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-286-K5LGcn-VOBe4kFRGf0a0lQ-1; Sat, 25 Apr 2020 03:02:03 -0400 X-MC-Unique: K5LGcn-VOBe4kFRGf0a0lQ-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D7515107ACF5; Sat, 25 Apr 2020 07:02:01 +0000 (UTC) Received: from virtlab511.virt.lab.eng.bos.redhat.com (virtlab511.virt.lab.eng.bos.redhat.com [10.19.152.198]) by smtp.corp.redhat.com (Postfix) with ESMTP id 27F955D9C5; Sat, 25 Apr 2020 07:02:01 +0000 (UTC) From: Paolo Bonzini To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: wei.huang2@amd.com, cavery@redhat.com, vkuznets@redhat.com, Sean Christopherson , Oliver Upton , Jim Mattson Subject: [PATCH v2 17/22] KVM: nSVM: Report interrupts as allowed when in L2 and exit-on-interrupt is set Date: Sat, 25 Apr 2020 03:01:49 -0400 Message-Id: <20200425070154.251290-8-pbonzini@redhat.com> In-Reply-To: <20200424172416.243870-1-pbonzini@redhat.com> References: <20200424172416.243870-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Report interrupts as allowed when the vCPU is in L2 and L2 is being run with exit-on-interrupts enabled and EFLAGS.IF=1 (either on the host or on the guest according to VINTR). Interrupts are always unblocked from L1's perspective in this case. While moving nested_exit_on_intr to svm.h, use INTERCEPT_INTR properly instead of assuming it's zero (which it is of course). Signed-off-by: Paolo Bonzini --- arch/x86/kvm/svm/nested.c | 5 ----- arch/x86/kvm/svm/svm.c | 23 +++++++++++++++++------ arch/x86/kvm/svm/svm.h | 5 +++++ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index 226d5a0d677b..a7a3d695405e 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -805,11 +805,6 @@ static void nested_svm_intr(struct vcpu_svm *svm) nested_svm_vmexit(svm); } -static bool nested_exit_on_intr(struct vcpu_svm *svm) -{ - return (svm->nested.intercept & 1ULL); -} - static int svm_check_nested_events(struct kvm_vcpu *vcpu) { struct vcpu_svm *svm = to_svm(vcpu); diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 4e284b62d384..0bbb2cd24eb7 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -3114,14 +3114,25 @@ bool svm_interrupt_blocked(struct kvm_vcpu *vcpu) struct vcpu_svm *svm = to_svm(vcpu); struct vmcb *vmcb = svm->vmcb; - if (!gif_set(svm) || - (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK)) + if (!gif_set(svm)) return true; - if (is_guest_mode(vcpu) && (svm->vcpu.arch.hflags & HF_VINTR_MASK)) - return !(svm->vcpu.arch.hflags & HF_HIF_MASK); - else - return !(kvm_get_rflags(vcpu) & X86_EFLAGS_IF); + if (is_guest_mode(vcpu)) { + /* As long as interrupts are being delivered... */ + if ((svm->vcpu.arch.hflags & HF_VINTR_MASK) + ? !(svm->vcpu.arch.hflags & HF_HIF_MASK) + : !(kvm_get_rflags(vcpu) & X86_EFLAGS_IF)) + return true; + + /* ... vmexits aren't blocked by the interrupt shadow */ + if (nested_exit_on_intr(svm)) + return false; + } else { + if (!(kvm_get_rflags(vcpu) & X86_EFLAGS_IF)) + return true; + } + + return (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK); } static bool svm_interrupt_allowed(struct kvm_vcpu *vcpu) diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index f6d604b72a4c..5cc559ab862d 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -386,6 +386,11 @@ static inline bool nested_exit_on_smi(struct vcpu_svm *svm) return (svm->nested.intercept & (1ULL << INTERCEPT_SMI)); } +static inline bool nested_exit_on_intr(struct vcpu_svm *svm) +{ + return (svm->nested.intercept & (1ULL << INTERCEPT_INTR)); +} + static inline bool nested_exit_on_nmi(struct vcpu_svm *svm) { return (svm->nested.intercept & (1ULL << INTERCEPT_NMI)); -- 2.18.2