On Wed, 2010-04-14 at 12:20 +0300, Avi Kivity wrote: > On 04/14/2030 12:05 PM, Zhang, Yanmin wrote: > > Here is the new patch of V3 against tip/master of April 13th > > if anyone wants to try it. > > > > > > Thanks for persisting despite the flames. > > Can you please separate arch/x86/kvm part of the patch? That will make > for easier reviewing, and will need to go through separate trees. I should do so definitely, and will do so in next version which also fixes some issues pointed by Ingo. > > Sheng, did you make any progress with the NMI injection issue? > > > + > > diff -Nraup linux-2.6_tip0413/arch/x86/kvm/x86.c linux-2.6_tip0413_perfkvm/arch/x86/kvm/x86.c > > --- linux-2.6_tip0413/arch/x86/kvm/x86.c 2010-04-14 11:11:04.341042024 +0800 > > +++ linux-2.6_tip0413_perfkvm/arch/x86/kvm/x86.c 2010-04-14 11:32:45.841278890 +0800 > > @@ -3765,6 +3765,35 @@ static void kvm_timer_init(void) > > } > > } > > > > +static DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu); > > + > > +static int kvm_is_in_guest(void) > > +{ > > + return percpu_read(current_vcpu) != NULL; > > > > An even more accurate way to determine this is to check whether the > interrupt frame points back at the 'int $2' instruction. However we > plan to switch to a self-IPI method to inject the NMI, and I'm not sure > wether APIC NMIs are accepted on an instruction boundary or whether > there's some latency involved. Yes. But the frame pointer checking seems a little complicated. > > > +static unsigned long kvm_get_guest_ip(void) > > +{ > > + unsigned long ip = 0; > > + if (percpu_read(current_vcpu)) > > + ip = kvm_rip_read(percpu_read(current_vcpu)); > > + return ip; > > +} > > > > This may be racy. kvm_rip_read() accesses a cache in memory; if we're > in the process of updating the cache, then we may read a stale value. > See below. Right. The racy window seems too big. > > > > > trace_kvm_entry(vcpu->vcpu_id); > > + > > + percpu_write(current_vcpu, vcpu); > > kvm_x86_ops->run(vcpu); > > + percpu_write(current_vcpu, NULL); > > > > If you move this around the 'int $2' instructions you will close the > race, as a stray NMI won't catch us updating the rip cache. But that > depends on whether self-IPI is accepted on the next instruction or not. Right. The kernel part has dependency on the self-IPI implementation. I will move above percpu_write(current_vcpu, vcpu) (or a new wrapper function) just around 'int $2'. Sheng would find a solution on the self-IPI delivery. Let's separate my patch and self-IPI as 2 issues as we don't know when the self-IPI delivery would be resolved. Thanks, Yanmin -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html