From patchwork Wed May 13 01:47:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Rutherford X-Patchwork-Id: 6393201 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 333999F3D1 for ; Wed, 13 May 2015 01:47:58 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2E349203FB for ; Wed, 13 May 2015 01:47:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2C1DF203F7 for ; Wed, 13 May 2015 01:47:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965103AbbEMBrx (ORCPT ); Tue, 12 May 2015 21:47:53 -0400 Received: from mail-ie0-f169.google.com ([209.85.223.169]:33767 "EHLO mail-ie0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965006AbbEMBru (ORCPT ); Tue, 12 May 2015 21:47:50 -0400 Received: by iebgx4 with SMTP id gx4so19024844ieb.0 for ; Tue, 12 May 2015 18:47:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9UwXclRv0TuLZ1SdivdBEIGTow1NA6tn2JEjhMgvnno=; b=hokm4y/SENqzfdMbU29kb7eF/eyO/ygak121uiRvwgJL0wgqhcuyF8wAJPso7KCojm UeBDFbPKEvylF9PoBskNWm1tIsW0o6TolF2LtLulToaCU4qPrZuuF1we5idVjYU5twb9 VgEgl9KQEaooH4CqDS46aNdwr7hBalkLEW9mnU25vAHPhFXKaobCL9GiNB2ZSDxJ03MA 7eTeurmOmNfuLEmKW8CWJNdjLX8FblyVNA/vK6onRvUhIhHNvs2Qu4n0SUmj0l5Gvc/W 0mPRPvrwgzys8AMS6XNkdbNecSQGvc/WlAzLv23PvSsvLQr7Ug8ncO1VlBh8lyVSWDyw t8rQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9UwXclRv0TuLZ1SdivdBEIGTow1NA6tn2JEjhMgvnno=; b=emfbftjvCDERuEaoUqNa+wBev0qzs8xdbiGKZ8MNmlwz9mwYZUpg8wGdB5thgSTiOq VVsuW6iGQQEy6quqJSoO5JlN8hl2PCQuMfvyXAaXmVX9YP5GRBJArPCTST/fmCdg8g7R quEFLN/EhVPgT2Ay818r/+BSCv0bjAh35X5SlTxbsDwha5xnpLPTnm6ChzsfDJkJvA+F NPQorZDqbnMUAoh+DA3OTZEkpqOdat0X7caSWomtg4vLXfmFolSwzfqCpHGlFsjcYch8 LVZI4VU1Ef4sMD54wL7EYFSVBmjIK0nqn1sam7IONPBtuWorBaVnRhWR9aUT5ECBpYNJ rF5Q== X-Gm-Message-State: ALoCoQljQBxqIXc2I6wdIfuQMc/LChcqDcagXPbX5c1HEIxjGq41UW57jWL/dAJs3PLHazUQs+TF X-Received: by 10.50.98.73 with SMTP id eg9mr602665igb.10.1431481669720; Tue, 12 May 2015 18:47:49 -0700 (PDT) Received: from entropic.kir.corp.google.com ([172.31.8.128]) by mx.google.com with ESMTPSA id pg7sm2527304igb.6.2015.05.12.18.47.48 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 May 2015 18:47:48 -0700 (PDT) From: Steve Rutherford To: kvm@vger.kernel.org Cc: ahonig@google.com Subject: [RFC PATCH 2/4] KVM: x86: Add KVM exit for IOAPIC EOIs Date: Tue, 12 May 2015 18:47:30 -0700 Message-Id: <1431481652-27268-2-git-send-email-srutherford@google.com> X-Mailer: git-send-email 2.2.0.rc0.207.ga3a616c In-Reply-To: <1431481652-27268-1-git-send-email-srutherford@google.com> References: <1431481652-27268-1-git-send-email-srutherford@google.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Adds KVM_EXIT_IOAPIC_EOI which passes the interrupt vector up to userspace. Uses a per VCPU exit bitmap to decide whether or not the IOAPIC needs to be informed (which is identical to the EOI_EXIT_BITMAP field used by modern x86 processors, but can also be used to elide kvm IOAPIC EOI exits on older processors). [Note: A prototype using ResampleFDs found that decoupling the EOI from the VCPU's thread made it possible for the VCPU to not see a recent EOI after reentering the guest. This does not match real hardware.] Compile tested for Intel x86. Signed-off-by: Steve Rutherford --- Documentation/virtual/kvm/api.txt | 10 ++++++++++ arch/x86/include/asm/kvm_host.h | 3 +++ arch/x86/kvm/lapic.c | 9 +++++++++ arch/x86/kvm/x86.c | 11 +++++++++++ include/linux/kvm_host.h | 1 + include/uapi/linux/kvm.h | 5 +++++ 6 files changed, 39 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 0744b4e..dd92996 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -3285,6 +3285,16 @@ Valid values for 'type' are: */ __u64 kvm_valid_regs; __u64 kvm_dirty_regs; + + /* KVM_EXIT_IOAPIC_EOI */ + struct { + __u8 vector; + } eoi; + +Indicates that an eoi of a level triggered IOAPIC interrupt on vector has +occurred, which should be handled by the userspace IOAPIC. Triggers when +the Irqchip has been split between userspace and the kernel. + union { struct kvm_sync_regs regs; char padding[1024]; diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 3ddc134..b1978f1 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -539,6 +539,9 @@ struct kvm_vcpu_arch { struct { bool pv_unhalted; } pv; + + u64 eoi_exit_bitmaps[4]; + int pending_ioapic_eoi; }; struct kvm_lpage_info { diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index bc392a6..42fada6f 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -860,6 +860,15 @@ int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2) static void kvm_ioapic_send_eoi(struct kvm_lapic *apic, int vector) { + if (irqchip_split(apic->vcpu->kvm)) { + if (test_bit(vector, + (void *) apic->vcpu->arch.eoi_exit_bitmaps)) { + apic->vcpu->arch.pending_ioapic_eoi = vector; + kvm_make_request(KVM_REQ_IOAPIC_EOI_EXIT, apic->vcpu); + } + return; + } + if (kvm_ioapic_handles_vector(apic->vcpu->kvm, vector)) { int trigger_mode; if (apic_test_vector(vector, apic->regs + APIC_TMR)) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 7505b39..cc27c35 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6324,6 +6324,17 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) kvm_handle_pmu_event(vcpu); if (kvm_check_request(KVM_REQ_PMI, vcpu)) kvm_deliver_pmi(vcpu); + if (kvm_check_request(KVM_REQ_IOAPIC_EOI_EXIT, vcpu)) { + BUG_ON(vcpu->arch.pending_ioapic_eoi > 255); + if (test_bit(vcpu->arch.pending_ioapic_eoi, + (void *) vcpu->arch.eoi_exit_bitmaps)) { + vcpu->run->exit_reason = KVM_EXIT_IOAPIC_EOI; + vcpu->run->eoi.vector = + vcpu->arch.pending_ioapic_eoi; + r = 0; + goto out; + } + } if (kvm_check_request(KVM_REQ_SCAN_IOAPIC, vcpu)) vcpu_scan_ioapic(vcpu); if (kvm_check_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu)) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 277b7a1..cef20ad 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -134,6 +134,7 @@ static inline bool is_error_page(struct page *page) #define KVM_REQ_ENABLE_IBS 23 #define KVM_REQ_DISABLE_IBS 24 #define KVM_REQ_APIC_PAGE_RELOAD 25 +#define KVM_REQ_IOAPIC_EOI_EXIT 26 #define KVM_USERSPACE_IRQ_SOURCE_ID 0 #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1 diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 7d06dc4..2305948 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -183,6 +183,7 @@ struct kvm_s390_skeys { #define KVM_EXIT_EPR 23 #define KVM_EXIT_SYSTEM_EVENT 24 #define KVM_EXIT_S390_STSI 25 +#define KVM_EXIT_IOAPIC_EOI 26 /* For KVM_EXIT_INTERNAL_ERROR */ /* Emulate instruction failed. */ @@ -329,6 +330,10 @@ struct kvm_run { __u8 sel1; __u16 sel2; } s390_stsi; + /* KVM_EXIT_IOAPIC_EOI */ + struct { + __u8 vector; + } eoi; /* Fix the size of the union. */ char padding[256]; };