kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: David Woodhouse <dwmw2@infradead.org>, kvm@vger.kernel.org
Cc: Ankur Arora <ankur.a.arora@oracle.com>,
	Joao Martins <joao.m.martins@oracle.com>,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	Sean Christopherson <seanjc@google.com>,
	graf@amazon.com, iaslan@amazon.de, pdurrant@amazon.com,
	aagch@amazon.com, fandree@amazon.com, hch@infradead.org
Subject: Re: [PATCH v5 16/16] KVM: x86/xen: Add event channel interrupt vector upcall
Date: Thu, 28 Jan 2021 13:43:43 +0100	[thread overview]
Message-ID: <3b66ee62-bf12-c6ab-a954-a66e5f31f109@redhat.com> (raw)
In-Reply-To: <20210111195725.4601-17-dwmw2@infradead.org>

On 11/01/21 20:57, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
> 
> It turns out that we can't handle event channels *entirely* in userspace
> by delivering them as ExtINT, because KVM is a bit picky about when it
> accepts ExtINT interrupts from a legacy PIC. The in-kernel local APIC
> has to have LVT0 configured in APIC_MODE_EXTINT and unmasked, which
> isn't necessarily the case for Xen guests especially on secondary CPUs.
> 
> To cope with this, add kvm_xen_get_interrupt() which checks the
> evtchn_pending_upcall field in the Xen vcpu_info, and delivers the Xen
> upcall vector (configured by KVM_XEN_ATTR_TYPE_UPCALL_VECTOR) if it's
> set regardless of LAPIC LVT0 configuration. This gives us the minimum
> support we need for completely userspace-based implementation of event
> channels.
> 
> This does mean that vcpu_enter_guest() needs to check for the
> evtchn_pending_upcall flag being set, because it can't rely on someone
> having set KVM_REQ_EVENT unless we were to add some way for userspace to
> do so manually.
> 
> But actually, I don't quite see how that works reliably for interrupts
> injected with KVM_INTERRUPT either. In kvm_vcpu_ioctl_interrupt() the
> KVM_REQ_EVENT request is set once, but that'll get cleared the first time
> through vcpu_enter_guest(). So if the first exit is for something *else*
> without interrupts being enabled yet, won't the KVM_REQ_EVENT request
> have been consumed already and just be lost?

If the call is for something else and there is an interrupt, 
inject_pending_event sets *req_immediate_exit to true.  This causes an 
immediate vmexit after vmentry, and also schedules another KVM_REQ_EVENT 
processing.

If the call is for an interrupt but you cannot process it yet (IF=0, 
STI/MOVSS window, etc.), inject_pending_event calls 
kvm_x86_ops.enable_irq_window and this will cause KVM_REQ_EVENT to be 
sent again.

How do you inject the interrupt from userspace?  IIRC 
evtchn_upcall_pending is written by the hypervisor upon receiving a 
hypercall, so wouldn't you need the "dom0" to invoke a KVM_INTERRUPT 
ioctl (e.g. with irq == 256)?  That KVM_INTERRUPT will set KVM_REQ_EVENT.

If you want to write a testcase without having to write all the 
interrupt stuff in the selftests framework, you could set an IDT that 
has room only for 128 vectors and use interrupt 128 as the upcall 
vector.  Then successful delivery of the vector will cause a triple fault.

Independent of the answer to the above, this is really the only place 
where you're adding Xen code to a hot path.  Can you please use a 
STATIC_KEY_FALSE kvm_has_xen_vcpu (and a static inline function) to 
quickly return from kvm_xen_has_interrupt() if no vCPU has a shared info 
set up?

That is, something like

- when first setting vcpu_info_set to true, 
static_key_slow_inc(&kvm_has_xen_vcpu.key)

- when destroying a vCPU with vcpu_info_set to true, 
static_key_slow_dec_deferred(&kvm_has_xen_vcpu)

- rename kvm_xen_has_interrupt to __kvm__xen_has_interrupt

- add a wrapper that usese the static key to avoid the function call

static int kvm_xen_has_interrupt(struct kvm_vcpu *v)
{
	if (static_branch_unlikely(&kvm_has_xen_vcpu.key))
		return __kvm_xen_has_interrupt(v);

	return false;
}

Paolo


  reply	other threads:[~2021-01-28 12:45 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-11 19:57 [PATCH v5 00/16] KVM: Add minimal support for Xen HVM guests David Woodhouse
2021-01-11 19:57 ` [PATCH v5 01/16] KVM: x86/xen: fix Xen hypercall page msr handling David Woodhouse
2021-01-11 19:57 ` [PATCH v5 02/16] KVM: x86/xen: intercept xen hypercalls if enabled David Woodhouse
2021-01-11 23:42   ` kernel test robot
2021-01-28 12:21   ` Paolo Bonzini
2021-01-11 19:57 ` [PATCH v5 03/16] KVM: x86/xen: Fix coexistence of Xen and Hyper-V hypercalls David Woodhouse
2021-01-11 19:57 ` [PATCH v5 04/16] KVM: x86/xen: add KVM_XEN_HVM_SET_ATTR/KVM_XEN_HVM_GET_ATTR David Woodhouse
2021-01-11 19:57 ` [PATCH v5 05/16] KVM: x86/xen: latch long_mode when hypercall page is set up David Woodhouse
2021-01-11 19:57 ` [PATCH v5 06/16] KVM: x86/xen: add definitions of compat_shared_info, compat_vcpu_info David Woodhouse
2021-01-11 19:57 ` [PATCH v5 07/16] KVM: x86/xen: register shared_info page David Woodhouse
2021-01-11 19:57 ` [PATCH v5 08/16] xen: add wc_sec_hi to struct shared_info David Woodhouse
2021-01-11 19:57 ` [PATCH v5 09/16] KVM: x86/xen: update wallclock region David Woodhouse
2021-01-11 19:57 ` [PATCH v5 10/16] KVM: x86/xen: register vcpu info David Woodhouse
2021-01-11 19:57 ` [PATCH v5 11/16] KVM: x86/xen: setup pvclock updates David Woodhouse
2021-01-11 19:57 ` [PATCH v5 12/16] KVM: x86/xen: register vcpu time info region David Woodhouse
2021-01-11 19:57 ` [PATCH v5 13/16] KVM: x86/xen: register runstate info David Woodhouse
2021-01-28 12:15   ` Paolo Bonzini
2021-01-11 19:57 ` [PATCH v5 14/16] KVM: x86: declare Xen HVM shared info capability and add test case David Woodhouse
2021-01-11 19:57 ` [PATCH v5 15/16] KVM: Add documentation for Xen hypercall and shared_info updates David Woodhouse
2021-01-28 12:18   ` Paolo Bonzini
2021-01-28 16:49     ` David Woodhouse
2021-01-28 17:06       ` Paolo Bonzini
     [not found]         ` <f9b2b4e613ea4e6dd1f253f5092254d121c93c07.camel@infradead.org>
2021-01-29  7:59           ` Paolo Bonzini
2021-01-11 19:57 ` [PATCH v5 16/16] KVM: x86/xen: Add event channel interrupt vector upcall David Woodhouse
2021-01-28 12:43   ` Paolo Bonzini [this message]
2021-01-28 15:35     ` David Woodhouse
2021-01-28 17:01       ` Paolo Bonzini
2021-01-29 17:33     ` David Woodhouse
2021-01-29 19:19       ` Paolo Bonzini
2021-01-30 13:01         ` David Woodhouse
2021-01-21 11:56 ` [PATCH v5 17/16] KVM: x86/xen: Fix initialisation of gfn caches for Xen shared pages David Woodhouse
2021-01-28 12:45 ` [PATCH v5 00/16] KVM: Add minimal support for Xen HVM guests Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3b66ee62-bf12-c6ab-a954-a66e5f31f109@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=aagch@amazon.com \
    --cc=ankur.a.arora@oracle.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=dwmw2@infradead.org \
    --cc=fandree@amazon.com \
    --cc=graf@amazon.com \
    --cc=hch@infradead.org \
    --cc=iaslan@amazon.de \
    --cc=joao.m.martins@oracle.com \
    --cc=kvm@vger.kernel.org \
    --cc=pdurrant@amazon.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).