From patchwork Wed Mar 3 21:33:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guilherme G. Piccoli" X-Patchwork-Id: 1446892 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DrS1P2Y5Gz9sVt; Thu, 4 Mar 2021 08:34:01 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1lHZ82-0003r3-Ch; Wed, 03 Mar 2021 21:33:58 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1lHZ7z-0003qf-UT for kernel-team@lists.ubuntu.com; Wed, 03 Mar 2021 21:33:55 +0000 Received: from mail-qt1-f199.google.com ([209.85.160.199]) by youngberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1lHZ7z-0007rc-Ja for kernel-team@lists.ubuntu.com; Wed, 03 Mar 2021 21:33:55 +0000 Received: by mail-qt1-f199.google.com with SMTP id w33so8200801qte.11 for ; Wed, 03 Mar 2021 13:33:55 -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:mime-version:content-transfer-encoding; bh=6Wd00pkVleU1F9W2BjIIXHRqD02HFPNp6DXX/tO+WG4=; b=F47VnNqC5kMKW2dNhk+rkUpDSkpKNojn+QJVDCHx+fbBi3l7xxxvo7O3XxSSBvLDvA MqCwbjIr0RI1IHriyfIkJezm6nPCWJUm6fuHzS4NaT1jZZsW1lJ229hyNapszTwPzbGr aG/QneS+AgESCBsjLssDEOr8OBNI5EQPh5FVc82Iz5yCchqVVsK9OM6e1B6nZaPN2PhQ yykt7EgmbiYnxqUnuQTHOEdJX9+oqju9CSVFaA0+x0YZ/1gQ+zlcsemKFbJ2g/aUswli CjwEAdBg20qV4YOmYcDjv5q9wmVTIwQ03Z0YxQxuh3sK9h2Ik1QVbKA9jSuGHo+mSxaq EoMg== X-Gm-Message-State: AOAM533H/n7SHiwgkm3/5Yp5iBnrP0pROnN0Rxv97D1sQA9ES2CB3vBD yQd44LxZc4QmMitFXhRSRAW9peOnHAvwbRSVNSmittoqzJM9SZxHvRlpegvWNMYm+91vl53714d 3KrBBpKgI6lfmL8gaKsInAVNzvHWaYsYdwMvrGsGGBA== X-Received: by 2002:ac8:1344:: with SMTP id f4mr1172510qtj.285.1614807234705; Wed, 03 Mar 2021 13:33:54 -0800 (PST) X-Google-Smtp-Source: ABdhPJxDFIQbadSj+ItbxVKPluoeRQJIn9YchRwhMqr0/bfD+SRLk7Il8kk96WpvugSm8yZbM9fUUA== X-Received: by 2002:ac8:1344:: with SMTP id f4mr1172488qtj.285.1614807234476; Wed, 03 Mar 2021 13:33:54 -0800 (PST) Received: from localhost ([179.225.140.231]) by smtp.gmail.com with ESMTPSA id q187sm4691862qkb.36.2021.03.03.13.33.53 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Mar 2021 13:33:54 -0800 (PST) From: "Guilherme G. Piccoli" To: kernel-team@lists.ubuntu.com Subject: [B][PATCH 1/1] KVM: x86: handle !lapic_in_kernel case in kvm_cpu_*_extint Date: Wed, 3 Mar 2021 18:33:48 -0300 Message-Id: <20210303213348.31319-2-gpiccoli@canonical.com> X-Mailer: git-send-email 2.29.0 In-Reply-To: <20210303213348.31319-1-gpiccoli@canonical.com> References: <20210303213348.31319-1-gpiccoli@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Paolo Bonzini BugLink: https://bugs.launchpad.net/bugs/1917138 Centralize handling of interrupts from the userspace APIC in kvm_cpu_has_extint and kvm_cpu_get_extint, since userspace APIC interrupts are handled more or less the same as ExtINTs are with split irqchip. This removes duplicated code from kvm_cpu_has_injectable_intr and kvm_cpu_has_interrupt, and makes the code more similar between kvm_cpu_has_{extint,interrupt} on one side and kvm_cpu_get_{extint,interrupt} on the other. Cc: stable@vger.kernel.org Reviewed-by: Filippo Sironi Reviewed-by: David Woodhouse Tested-by: David Woodhouse Signed-off-by: Paolo Bonzini (backported from commit 72c3bcdcda494cbd600712a32e67702cdee60c07) [gpiccoli: Besides context adjustments, it's very important to notice that Ubuntu 4.15 tree lacks the following commit, which renames the struct member interrupt.pending to interrupt.injected: 04140b4144cd ("KVM: x86: Rename interrupt.pending to interrupt.injected") This may cause a very confusing comment in kvm_cpu_has_extint(), hence I've changed both code and comment in order they do make sense.] Signed-off-by: Guilherme G. Piccoli Acked-by: Stefan Bader Acked-by: Thadeu Lima de Souza Cascardo Acked-by: Kleber Sacilotto de Souza --- arch/x86/kvm/irq.c | 65 ++++++++++++++++++++++++-------------------- arch/x86/kvm/lapic.c | 2 +- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index 8978988e735d..842fcc043a8f 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -54,15 +54,29 @@ static int pending_userspace_extint(struct kvm_vcpu *v) */ int kvm_cpu_has_extint(struct kvm_vcpu *v) { - u8 accept = kvm_apic_accept_pic_intr(v); + /* + * FIXME: interrupt.pending represents an interrupt whose + * side-effects have already been applied (e.g. bit from IRR + * already moved to ISR). Therefore, it is incorrect to rely + * on interrupt.pending to know if there is a pending + * interrupt in the user-mode LAPIC. + * This leads to nVMX/nSVM not be able to distinguish + * if it should exit from L2 to L1 on EXTERNAL_INTERRUPT on + * pending interrupt or should re-inject an injected + * interrupt. + * [backport note: interrupt.pending was renamed interrupt.injected + * in upstream commit 04140b4144cd , not present in this tree.] + */ + if (!lapic_in_kernel(v)) + return v->arch.interrupt.pending; - if (accept) { - if (irqchip_split(v->kvm)) - return pending_userspace_extint(v); - else - return v->kvm->arch.vpic->output; - } else + if (!kvm_apic_accept_pic_intr(v)) return 0; + + if (irqchip_split(v->kvm)) + return pending_userspace_extint(v); + else + return v->kvm->arch.vpic->output; } /* @@ -73,9 +87,6 @@ int kvm_cpu_has_extint(struct kvm_vcpu *v) */ int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v) { - if (!lapic_in_kernel(v)) - return v->arch.interrupt.pending; - if (kvm_cpu_has_extint(v)) return 1; @@ -91,9 +102,6 @@ int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v) */ int kvm_cpu_has_interrupt(struct kvm_vcpu *v) { - if (!lapic_in_kernel(v)) - return v->arch.interrupt.pending; - if (kvm_cpu_has_extint(v)) return 1; @@ -107,16 +115,21 @@ EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt); */ static int kvm_cpu_get_extint(struct kvm_vcpu *v) { - if (kvm_cpu_has_extint(v)) { - if (irqchip_split(v->kvm)) { - int vector = v->arch.pending_external_vector; - - v->arch.pending_external_vector = -1; - return vector; - } else - return kvm_pic_read_irq(v->kvm); /* PIC */ - } else + if (!kvm_cpu_has_extint(v)) { + WARN_ON(!lapic_in_kernel(v)); return -1; + } + + if (!lapic_in_kernel(v)) + return v->arch.interrupt.nr; + + if (irqchip_split(v->kvm)) { + int vector = v->arch.pending_external_vector; + + v->arch.pending_external_vector = -1; + return vector; + } else + return kvm_pic_read_irq(v->kvm); /* PIC */ } /* @@ -124,13 +137,7 @@ static int kvm_cpu_get_extint(struct kvm_vcpu *v) */ int kvm_cpu_get_interrupt(struct kvm_vcpu *v) { - int vector; - - if (!lapic_in_kernel(v)) - return v->arch.interrupt.nr; - - vector = kvm_cpu_get_extint(v); - + int vector = kvm_cpu_get_extint(v); if (vector != -1) return vector; /* PIC */ diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e1116584105d..a6084e5750ab 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2217,7 +2217,7 @@ int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu) struct kvm_lapic *apic = vcpu->arch.apic; u32 ppr; - if (!kvm_apic_hw_enabled(apic)) + if (!kvm_apic_present(vcpu)) return -1; __apic_update_ppr(apic, &ppr);