From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [RFC PATCH 2/4] KVM: x86: Add KVM exit for IOAPIC EOIs Date: Sun, 24 May 2015 19:46:03 +0300 Message-ID: <5562004B.6010501@gmail.com> References: <1431481652-27268-1-git-send-email-srutherford@google.com> <1431481652-27268-2-git-send-email-srutherford@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Cc: ahonig@google.com To: Steve Rutherford , kvm@vger.kernel.org Return-path: Received: from mail-wi0-f175.google.com ([209.85.212.175]:36261 "EHLO mail-wi0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751116AbbEXQqH (ORCPT ); Sun, 24 May 2015 12:46:07 -0400 Received: by wizk4 with SMTP id k4so29042724wiz.1 for ; Sun, 24 May 2015 09:46:06 -0700 (PDT) In-Reply-To: <1431481652-27268-2-git-send-email-srutherford@google.com> Sender: kvm-owner@vger.kernel.org List-ID: On 05/13/2015 04:47 AM, Steve Rutherford wrote: > 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. > + The ioapic is a global resource, so it doesn't make sense for information about it to be returned in a per-vcpu structure (or to block the vcpu while it is being processed). The way I'd model it is to emulate the APIC bus that connects local APICs and the IOAPIC, using a socket pair. When the user-space ioapic wants to inject an interrupt, it sends a message to the local APICs which then inject it, and when it's ack'ed the EOI is sent back on the same bus. It's true that the APIC bus no longer exists, but modern processors still pretend it does.