public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: "Gregory Haskins" <ghaskins-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
To: <kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>,
	"Dor Laor" <dor.laor-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Subject: Re: [PATCH 4/9] KVM: Adds ability to preempt	anexecutingVCPU
Date: Thu, 10 May 2007 08:33:06 -0400	[thread overview]
Message-ID: <4642D8A0.BA47.005A.0@novell.com> (raw)
In-Reply-To: <64F9B87B6B770947A9F8391472E032160BBA6616-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>

>>> On Thu, May 10, 2007 at  4:22 AM, in message
<64F9B87B6B770947A9F8391472E032160BBA6616-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>,
"Dor Laor" <dor.laor-atKUWr5tajBWk0Htik3J/w@public.gmane.org> wrote: 
>>>> static void kvm_vcpu_irqsink_init(struct kvm_vcpu *vcpu)
>>>>diff --  git a/drivers/kvm/svm.c b/drivers/kvm/svm.c
>>>>index 4c03881..91546ae 100644
>>>>---   a/drivers/kvm/svm.c
>>>>+++ b/drivers/kvm/svm.c
>>>>@@ -  1542,11 +1542,40 @@ static int svm_vcpu_run(struct kvm_vcpu
> *vcpu,
>>>>struct kvm_run *kvm_run)
>>>> 	u16 gs_selector;
>>>> 	u16 ldt_selector;
>>>> 	int r;
>>>>+	unsigned long irq_flags;
>>>>
>>>> again:
>>>>+	/*
>>>>+	 * We disable interrupts until the next VMEXIT to eliminate a
>>> race
>>>>+	 * condition for delivery of virtual interrutps.  Note that this
>>> is
>>>>+	 * probably not as bad as it sounds, as interrupts will still
>>> invoke
>>>>+	 * a VMEXIT once transitioned to GUEST mode (and thus exit this
>>> lock
>>>>+	 * scope) even if they are disabled.
>>>>+	 *
>>>>+	 * FIXME: Do we need to do anything additional to mask IPI/NMIs?
>>>>+	 */
>>>>+	local_irq_save(irq_flags);
>>>>+
>>>> 	spin_lock(&vcpu-  >irq.lock);
>>>>
>>>> 	/*
>>>>+	 * If there are any signals pending (virtual interrupt related
>>> or
>>>>+	 * otherwise), don't even bother trying to enter guest mode...
>>>>+	 */
>>>>+	if (signal_pending(current)) {
>>>>+		kvm_run-  >exit_reason = KVM_EXIT_INTR;
>>>>+		spin_unlock(&vcpu-  >irq.lock);
>>>>+		local_irq_restore(irq_flags);
>>>>+		return -  EINTR;
> 
> 
> Instead of returning you should 'goto out;' since the post_kvm_run_save
> is called there + minimize return paths.

Yeah, I agree.  I had already made this change for VMX in v2.  I have now fixed the SVN side for v3 which will follow this email

> 
> 
>>>>+	}
>>>
>>>
>>> A possible optimization would be to check if we have an irq to
> inject.
>>> If we have, then ignore the signal and enter guest mode.
>>> Since an irq is already pending, the signal would not be resulting in
>>> another irq injection.
>>> What do you think?
>>
>>I am a little fuzzy on whether this is necessary myself.  The
> motivation
>>for this code block originally was really more for the cases where
> signals
>>are sent that *aren't* related to interrupts.  For instance, what if
> QEMU
>>was trying to force the vCPU to exit for some reason (e.g. an AIO
>>completion event that has to be decoded by userspace before a IRQ is
>>generated)?  If the signal is queued beforehand AND linux doesn't
> already
>>reschedule things for us, I think there is a race against the VCPU
> being
>>stuck in guest mode until the next (unrelated) VMEXIT since the IPI
> would
>>have already happened.  This code (I believe) closes the window on that
>>scenario.  I am just not sure if its a realistic one.  Perhaps someone
> with
>>more linux signal handling knowledge than myself can chime in and
> confirm?
>>(And I am not saying that person isn't you, Dor.  I am only saying it
> isn't
>>me ;)
> 
> 
> You're right that there is a slight chance for a qemu signal such as AIO
> completion to reach right after we enter the kernel. My intention was to
> unit the signal pending checks -  there is another one after the guest
> exits vmx mode. Then once we're back on host mode we can optimize the
> path by checking whether we need to re- inject in- kernel- apic pending irq
> or a case where a physical irq prevented us from injecting the virq.
> 
> The optimization is not specific to apic and can take place even now.

I'm not entirely following you, but you if elaborate a little more perhaps I can get it incorporated.  Otherwise, we could just wait till this logic is merged and do a follow on patch.

> 
>>
>>>
>>>>+
>>>>+	/*
>>>>+	 * There are optimizations we can make when signaling interrupts
>>>>+	 * if we know the VCPU is in GUEST mode, so mark that here
>>>>+	 */
>>>>+	vcpu-  >irq.guest_mode = 1;
>>>>+
>>>>+	/*
>>>> 	 * We must inject interrupts (if any) while the irq_lock
>>>> 	 * is held
>>>> 	 */
>>>>@@ -  1688,6 +1717,13 @@ again:
>>>> #endif
>>>> 		: "cc", "memory" );
>>>>
>>>>+	/*
>>>>+	 * FIXME: We'd like to turn on interrupts ASAP, but is this so
>>> early
>>>>+	 * that we will mess up the state of the CPU before we fully
>>>>+	 * transition from guest to host?
>>>>+	 */
>>>
>>> The guest_mode can be assigned here, thus eliminating the cli-  sti
> below.
>>
>>Yeah....I was concerned about putting too much logic before the
> guest/host
>>state transfer because I didn't know enough about it to know if I would
>>stomp on some register that still hadn't been saved.  If you say its
> safe
>>to do that here, then I agree that is the optimal way to do it.
> 
> There is nothing to worry about since the ipi just caused the cpu to
> leave guest mode, the vcpu locks are still held and after getting the
> ipi (that you wrote and does nothing) the host will continue the same
> execution path.
> Note that today the code has irq enabled all the exit path too.

Fixed.



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

  parent reply	other threads:[~2007-05-10 12:33 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-09 15:18 [PATCH 0/9] in-kernel APIC v2 Gregory Haskins
     [not found] ` <20070509151238.8673.4818.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
2007-05-09 15:19   ` [PATCH 1/9] KVM: Adds support for in-kernel mmio handlers Gregory Haskins
2007-05-09 15:19   ` [PATCH 2/9] KVM: VMX - fix interrupt checking on light-exit Gregory Haskins
2007-05-09 15:19   ` [PATCH 3/9] KVM: Add irqdevice object Gregory Haskins
2007-05-09 15:19   ` [PATCH 4/9] KVM: Adds ability to preempt an executing VCPU Gregory Haskins
     [not found]     ` <20070509151917.8673.28710.stgit-sLgBBP33vUGnsjUZhwzVf9HuzzzSOjJt@public.gmane.org>
2007-05-09 22:28       ` [PATCH 4/9] KVM: Adds ability to preempt an executingVCPU Dor Laor
     [not found]         ` <64F9B87B6B770947A9F8391472E032160BBA6490-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-05-09 23:39           ` Gregory Haskins
     [not found]             ` <46422360.BA47.005A.0-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
2007-05-10  8:22               ` [PATCH 4/9] KVM: Adds ability to preempt anexecutingVCPU Dor Laor
     [not found]                 ` <64F9B87B6B770947A9F8391472E032160BBA6616-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-05-10 12:33                   ` Gregory Haskins [this message]
     [not found]                     ` <4642D8A0.BA47.005A.0-Et1tbQHTxzrQT0dZR+AlfA@public.gmane.org>
2007-05-10 13:03                       ` [PATCH 4/9] KVM: Adds ability to preemptanexecutingVCPU Dor Laor
2007-05-09 15:19   ` [PATCH 5/9] KVM: Adds ability to signal userspace using a file-descriptor Gregory Haskins
2007-05-09 15:19   ` [PATCH 6/9] KVM: Add support for in-kernel LAPIC model Gregory Haskins
2007-05-09 15:19   ` [PATCH 7/9] KVM: Adds support for real NMI injection on VMX processors Gregory Haskins
2007-05-09 15:19   ` [PATCH 8/9] KVM: Adds basic plumbing to support TPR shadow features Gregory Haskins
2007-05-09 15:19   ` [PATCH 9/9] KVM: Adds support for TPR shadowing under VMX processors Gregory Haskins

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=4642D8A0.BA47.005A.0@novell.com \
    --to=ghaskins-et1tbqhtxzrqt0dzr+alfa@public.gmane.org \
    --cc=dor.laor-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /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