>>> On Thu, May 10, 2007 at 4:22 AM, in message <[EMAIL PROTECTED]>, "Dor Laor" <[EMAIL PROTECTED]> 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/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel