Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp402170pxu; Tue, 1 Dec 2020 14:20:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJz4SvfEaSNn9aGbRr15kj+vv+vNJBQUBcHGdnG/1PZTz9qSHwAZWzp9u7YCclrbeUAjMJAz X-Received: by 2002:a17:906:ce2b:: with SMTP id sd11mr5390691ejb.334.1606861252656; Tue, 01 Dec 2020 14:20:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606861252; cv=none; d=google.com; s=arc-20160816; b=vXb+yPOR/c7kK/XT9ot2m8ZemNGXORIiD84FdWS/tig/HOme+H9FB2lYx9rKfI7YfS QcBVi8/mGSw/nBnl4MIv0hhCSpNghO0oEIgGHDT+s/MtM1p4Wou0372Om/eXPaVAbXg2 G/p+PoN13NZHeCMk7igGXOVQiJSVKMKJbfpGBNjbPY83u2b6Wew5fqSBmW3DU0kjbWd9 StenPerT+HQACdoPw5r7DtgG04VhxK6wl6DGrWpmt2c6cD+AcAT8nPEbukT4gAmAdtgS 4AxviURHbJsfMjeCbbvi4w6nMpLMvlZG4eiml2mLXwut/1ElJa8ztt0Ctx1oHWJc9Ikt FPeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=mo0EZ3KujP/kKWNlOsaGzpT6rcoRjeclvnx2JbEhWv0=; b=FD3lO29JAw2kZI1ho8w5VLugAkolFe0HvGSt9PhiAAxsLgaSTpXRHhxutNUILtrllp czEOFOVIy2yKjOS2GJpCpn5LAks3XncIq+sNR1DDc1GrRfLn6hDH0cmDcRmKE9hQqAql WGUABIyseNFl9o8BpvcBKAqn98uuNX1FVM+Q7jHHblu8p5XVV5mknE4cw1tMC01D3bJC gEw6WoAD784h/difE4R1/9+tr9nGQQ4xPy+gABHPUBwp1Y2anyx+vi09Ode7UFhrdmK3 h0I4LnV6b0gm9XA5jWiorE1iQfEmyYJW1MAJmXv3r0an5U9QC4lvWo5XHBvn76HmXatX YtoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Eq831x8f; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h26si742675ejc.253.2020.12.01.14.20.30; Tue, 01 Dec 2020 14:20:52 -0800 (PST) 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=@linuxfoundation.org header.s=korg header.b=Eq831x8f; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388464AbgLAJBB (ORCPT + 99 others); Tue, 1 Dec 2020 04:01:01 -0500 Received: from mail.kernel.org ([198.145.29.99]:36796 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388451AbgLAJA6 (ORCPT ); Tue, 1 Dec 2020 04:00:58 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 53AD12222E; Tue, 1 Dec 2020 09:00:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1606813242; bh=L7HzEZ88G6dBsMzFNRYOsUCjKyC8875jRUI8wBcLnb4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Eq831x8fbClS2QpXOCidD46m5I36CeWAZR9J3va0RkA+fwNXRl6PJTfxL67z6fTyL u4dW76Gboirze8VVTJVCv1yTT+kIQKH40M848U25hCaRN91M5YdSs7YQDHiRKRMMPx EhPG+FMnqHS9tVEhs95hZv/JywvS6gyu8ZSDyEIw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Filippo Sironi , David Woodhouse , Paolo Bonzini Subject: [PATCH 4.19 07/57] KVM: x86: handle !lapic_in_kernel case in kvm_cpu_*_extint Date: Tue, 1 Dec 2020 09:53:12 +0100 Message-Id: <20201201084648.575223209@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201201084647.751612010@linuxfoundation.org> References: <20201201084647.751612010@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Paolo Bonzini commit 72c3bcdcda494cbd600712a32e67702cdee60c07 upstream. 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 Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/irq.c | 83 ++++++++++++++++++++------------------------------- arch/x86/kvm/lapic.c | 2 - 2 files changed, 34 insertions(+), 51 deletions(-) --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -54,27 +54,8 @@ static int pending_userspace_extint(stru */ static int kvm_cpu_has_extint(struct kvm_vcpu *v) { - u8 accept = kvm_apic_accept_pic_intr(v); - - if (accept) { - if (irqchip_split(v->kvm)) - return pending_userspace_extint(v); - else - return v->kvm->arch.vpic->output; - } else - return 0; -} - -/* - * check if there is injectable interrupt: - * when virtual interrupt delivery enabled, - * interrupt from apic will handled by hardware, - * we don't need to check it here. - */ -int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v) -{ /* - * FIXME: interrupt.injected represents an interrupt that it's + * FIXME: interrupt.injected 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.injected to know if there is a pending @@ -87,6 +68,23 @@ int kvm_cpu_has_injectable_intr(struct k if (!lapic_in_kernel(v)) return v->arch.interrupt.injected; + 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; +} + +/* + * check if there is injectable interrupt: + * when virtual interrupt delivery enabled, + * interrupt from apic will handled by hardware, + * we don't need to check it here. + */ +int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v) +{ if (kvm_cpu_has_extint(v)) return 1; @@ -102,20 +100,6 @@ int kvm_cpu_has_injectable_intr(struct k */ int kvm_cpu_has_interrupt(struct kvm_vcpu *v) { - /* - * FIXME: interrupt.injected represents an interrupt that it's - * side-effects have already been applied (e.g. bit from IRR - * already moved to ISR). Therefore, it is incorrect to rely - * on interrupt.injected 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. - */ - if (!lapic_in_kernel(v)) - return v->arch.interrupt.injected; - if (kvm_cpu_has_extint(v)) return 1; @@ -129,16 +113,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 */ } /* @@ -146,13 +135,7 @@ static int kvm_cpu_get_extint(struct kvm */ 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 */ --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -2284,7 +2284,7 @@ int kvm_apic_has_interrupt(struct kvm_vc 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);